如果将对象作为参数传递,为什么可以在静态方法中访问私有字段

时间:2014-10-30 08:26:25

标签: java

例如,我有简单的课程

class Simple {
    private int i = 6;

    private static void method(Simple obj) {
        System.out.println("Value i: " + obj.i);
    }

    public void method() {
        method(this);
    }

    public static void main(String[] args) {
        new Simple().method();
    }
}

为什么我可以在静态方法中访问i

4 个答案:

答案 0 :(得分:5)

可以在课堂上访问

private members。您的静态方法属于同一个类。因此,您可以访问。

Modifier    Class   Package Subclass    World
---------------------------------------------

private     **Y**      N        N           N

更新:为避免混淆,请将静态方法移至其他类并尝试一次。

答案 1 :(得分:1)

不要对staticprivate/public/[default]感到困惑。这是两件事。 static函数可以访问private非静态字段,因为它是class的一部分。那是private的确如此,只限制class级别的访问权限,而static之间没有任何区别。

答案 2 :(得分:0)

如果是打扰你的静态,obj是一个正确的“非静态”对象,我们为什么它有一个可访问的非静态字段。 方法是静态的无关紧要。

答案 3 :(得分:-1)

您正在访问对象的实例而不是直接类变量。当你使用direly“i”而不引用它不被允许时。

私有变量可见性默认情况下属于类访问。

public class Simple {   

private int i = 6;

private static void method(Simple obj) {
    System.out.println("Value i: " + i);  //compile Error ::Cannot make a static reference to the non-static field i
}
public void method() {
    method(this);
}
public static void main(String[] args) {
    new Simple().method();
}

}