有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中使用私有方法

我得到了一个具有私有方法的类,比如setCoors(intx,inty)。该类的构造函数中也包含setCoors。在另一个类中,我想要一个调用setCoors的方法setLocation。这可能吗

新问题:

如果不允许我将方法设置为public,这是否可能

public class Coordinate{
    public Coordinate(int a, int b){
        setCoors(a,b)
    }
    private void setCoords(int x, int y)
}

public class Location{
    private Coordinate  loc;
    public void setLocation(int a, int b)
        loc = new Coordinate(a,b)
}

共 (6) 个答案

  1. # 1 楼答案

    最好和最有用的答案取决于问题的背景,我认为,这并不完全显而易见

    如果这个问题是一个关于私人的意图含义的新手问题,那么回答“否”是完全合适的。即:

    • A的私有成员只能在A类中访问
    • 只能在A的包中的类内访问A的包私有成员
    • A的受保护成员只能在A的包中的类和A的子类中访问
    • A的公共成员可以在A可见的任何位置访问

    现在,如果,好吧,也许这是一个延伸(谢谢你,布莱恩:)),这个问题来自一个更“高级”的背景,在这个背景下,我们正在研究“我知道私有意味着私有,但有没有语言漏洞”,那么,就有这样一个漏洞。事情是这样的:

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Arrays;
    import java.util.List;
    
    class C {
        private int x = 10;
        private void hello() {System.out.println("Well hello there");}
    }
    
    public class PrivateAccessDemo {
        public static void main(String[] args) throws Exception {
            C c = new C();
            List<Field> fields = Arrays.asList(C.class.getDeclaredFields());
            for (Field f: fields) {
                f.setAccessible(true);
                System.out.println(f.getName() + " = " + f.get(c));
            }
            List<Method> methods = Arrays.asList(C.class.getDeclaredMethods());
            for (Method m: methods) {
                m.setAccessible(true);
                m.invoke(c);
            }
        }
    }
    

    输出:

    x = 10
    Well hello there
    

    当然,这真的不是应用程序程序员会做的事情。但是,这样一件事可以做这一事实值得知道,而不是应该忽略的事情。不管怎样,伊姆霍

  2. # 2 楼答案

    在定义private方法的类之外,不能访问任何方法

  3. # 3 楼答案

    private表示只能在定义的类内访问它

  4. # 4 楼答案

    private表示它是私有的

    如果你想让其他班级来称呼它,也许你不应该让它成为私人的

  5. # 5 楼答案

    否,private表示只能在定义该方法的类内部调用该方法。您可能需要让setLocation创建setCoords驻留的类的新实例,或者更改setCoords上的可见性

    编辑:您发布的代码将起作用。请注意Location类的任何实例都将绑定到它自己的Coordinate对象。如果在代码的其他地方创建一个新的Coordinate对象,则无法修改其内部状态。换句话说,这条线

    Coordinate myCoord = new Coordinate(4, 5);
    

    将创建对象myCoord,该对象将永远具有坐标45

  6. # 6 楼答案

    做家庭作业的孩子:答案是否定的。工作需要疯狂工作的家伙:答案是肯定的。但是,更重要的是,setCoors方法不应该接受int参数。它应该有两个SilverBullet对象