如何在Java中使用私有方法

Dan*_*Dan 5 java methods private-methods

我给了一个有私有方法的类,比如setCoors(int x,int y).该类的构造函数也包含setCoors.在另一个类中,我想要一个调用setCoors的方法setLocation.这可能吗?

新问题:

如果我不被允许将方法设置为公开,这可能吗?

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)
}
Run Code Online (Sandbox Code Playgroud)

Ray*_*oal 7

最好和最有帮助的答案取决于问题的背景,我认为,这并不是完全明显的.

如果问题是关于私人意图的新手问题,则答案"否"是完全合适的.那是:

  • A的私人成员只能在A类中访问
  • A的包私有成员只能在A包的类中访问
  • 受保护的A成员只能在A的包和A的子类中的类中访问
  • A的公共成员可以在A可见的任何地方访问.

现在,如果,也好,这可能是一个延伸(谢谢Brian :)),问题来自一个更"高级"的背景,其中一个人正在研究"我知道私人意味着私人但是有语言漏洞"的问题",然后,井,存在这样的漏洞.它是这样的:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

x = 10
Well hello there
Run Code Online (Sandbox Code Playgroud)

当然,这确实不是应用程序员所做的事情.但事实上可以做到这样的事情是值得知道的,而不是应该忽略的事情.恕我直言.


brc*_*brc 5

不,private意味着该方法只能在定义它的类内部调用。您可能希望setLocation创建该类setCoords所在的新实例,或更改 上的可见性setCoords

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

Coordinate myCoord = new Coordinate(4, 5);
Run Code Online (Sandbox Code Playgroud)

将创建myCoord将永远具有坐标4和的对象5