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:对:静态成员仍然是类中的代码,因此它可以访问私有类信息。它是静态的而不是实例成员这一事实与此完全无关。隐私关系到代码是否是类的一部分,而不是它是否是类中的实例代码。但是您可能希望清除它,声明在这方面访问范围独立于对象范围,允许在对象作为参数传递时访问属性。