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

Java 若将对象作为参数传递,为什么可以在静态方法中访问私有字段,java,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)

例如,我有一个简单的类

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

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

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

private     **Y**      N        N           N
更新:为避免混淆,请将静态方法移动到其他类,然后重试一次

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

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

private     **Y**      N        N           N

更新:为避免混淆,请将静态方法移动到其他类,然后重试一次

您正在访问对象的实例,而不是直接访问类变量。当你直接使用“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();
}

}

您正在访问对象的实例,而不是直接访问类变量。当你直接使用“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();
}

}

如果是静态问题困扰着你,obj是一个合适的“非静态”对象,这就是为什么它有一个可访问的非静态字段。静态的方法是不相关的。

如果是静态让你烦恼,obj是一个合适的“非静态”对象,这就是为什么它有一个可访问的非静态字段。静态的方法是不相关的。

不要与
静态
private/public/[default]
混淆。这是两件不同的事情。
静态
函数可以访问
私有
非静态字段,因为它是
的一部分。这就是
private
所做的,只限制对
类的访问,而不区分
静态
与否。

不要与
静态
私有/公共/[default]
混淆。这是两件不同的事情。
静态
函数可以访问
私有
非静态字段,因为它是
的一部分。这就是
private
所做的,只限制对
类的访问,而不区分
静态
与否。

但是他们问为什么
method()
是静态的,而
i
不是,当
i
是客观的时,为什么
i
是可访问的。@mr.stobbe既然你手头有对象,你就可以访问它们。但是我可以在没有getter的情况下访问它们。@user1432980:对:静态成员仍然是类中的代码,因此它可以访问私有类信息。它是静态的而不是实例成员这一事实与此完全无关。隐私关系到代码是否是类的一部分,而不是它是否是类中的实例代码。但您可能希望清除它,说明在这方面,访问范围独立于对象范围,允许在对象作为参数传递时访问属性。但他们会问,如果
method()
是静态的,而
i
不是,当
i
是客观的时,为什么
i
是可访问的。@mr.stobbe既然你手头有对象,你就可以访问它们。但是我可以在没有getter的情况下访问它们。@user1432980:对:静态成员仍然是类中的代码,因此它可以访问私有类信息。它是静态的而不是实例成员这一事实与此完全无关。隐私关系到代码是否是类的一部分,而不是它是否是类中的实例代码。但是您可能希望清除它,声明在这方面访问范围独立于对象范围,允许在对象作为参数传递时访问属性。