Java 私有变量内部类:值的解释?
对以下代码的原因感到好奇Java 私有变量内部类:值的解释?,java,oop,private,inner-classes,Java,Oop,Private,Inner Classes,对以下代码的原因感到好奇 public class OuterClass{ int i; public void printme(){ System.out.println("Outerclass"); i+=20; System.out.println(i); class InnerClass extends OuterClass { public void printme(){ System.
public class OuterClass{
int i;
public void printme(){
System.out.println("Outerclass");
i+=20;
System.out.println(i);
class InnerClass extends OuterClass {
public void printme(){
System.out.println("InnerClass");
i+=10;
System.out.println(i);
}
}
InnerClass second = new InnerClass();
second.printme();
System.out.println("Outerclass-2");
System.out.println(i);
return;
}
public static void main(String []args){
System.out.println("start");
OuterClass first = new OuterClass();
first.printme();
}
}
输出是
起始外等级20内等级10外等级2 20
但如果int i被声明为私有,则输出为
起始外等级20内等级30外等级2 30
有人能解释一下吗?当字段没有访问修饰符时,它具有默认可见性 从子类方法
InnerClass#printme()
的作用域中,可以访问它。所以
i+=10;
正在访问InnerClass
实例的字段,该字段已初始化为0
private
字段对子类不可见,因此InnerClass
无法访问自己的字段。但是由于InnerClass
是OuterClass
主体内的一个内部类,因此它可以访问封闭实例的字段。所以
i+=10;
正在访问
OuterClass
实例的字段。当字段没有访问修饰符时,它具有默认可见性
从子类方法InnerClass#printme()
的作用域中,可以访问它。所以
i+=10;
正在访问InnerClass
实例的字段,该字段已初始化为0
private
字段对子类不可见,因此InnerClass
无法访问自己的字段。但是由于InnerClass
是OuterClass
主体内的一个内部类,因此它可以访问封闭实例的字段。所以
i+=10;
正在访问
外部类
实例的字段。不能在子类
中访问私有
字段,但可以在内部类中访问
所以如果你有
int i;
// in InnerClass extends Outerclass
i += 10; // access the parent of this InnerClass
然而
private int i;
// in InnerClass extends Outerclass
i += 10; // access the OuterClass as the parent is not accessible.
不能在
子类中访问私有
字段,但可以在内部类中访问
所以如果你有
int i;
// in InnerClass extends Outerclass
i += 10; // access the parent of this InnerClass
然而
private int i;
// in InnerClass extends Outerclass
i += 10; // access the OuterClass as the parent is not accessible.
当然。如果它不是私有的,那么它由InnerClass
继承-也就是说,操作的i
是InnerClass
对象中的一个。如果它是私有的,则无法继承,因此操作的i
就是包含对象中的一个。当然。如果它不是私有的,那么它由InnerClass
继承-也就是说,操作的i
是InnerClass
对象中的一个。如果它是私有的,则无法继承,因此操作的i
是包含对象中的一个。InnerClass
不是严格的内部类,这通常从类体中的声明中知道。在这种情况下,它确实是一种内部类,但应用了完全不同的规则。这个问题完全是关于继承和隐藏变量的
在您的情况下,如果您使用default
(none)修饰符扩展类,您可以访问此字段,并且可以有效地看到超类的字段
如果字段被声明为private
,则子类无法看到它,但它有自己的字段,因为它扩展了OutterClass
,因此新对象以默认值0开始
查看文档中关于阴影和局部类的部分InnerClass
不是严格的内部类,这通常从类体中的声明中知道。在这种情况下,它确实是一种内部类,但应用了完全不同的规则。这个问题完全是关于继承和隐藏变量的
在您的情况下,如果您使用default
(none)修饰符扩展类,您可以访问此字段,并且可以有效地看到超类的字段
如果字段被声明为private
,则子类无法看到它,但它有自己的字段,因为它扩展了OutterClass
,因此新对象以默认值0开始
查看文档中关于阴影和本地类的部分
如果您给我您的地址,我会给您发送一个较慢的键盘。“你似乎总是用这样的答案打败我。@DavidWallace我住在Stackoverflow服务器的街对面。如果你给我你的地址,我会给你一个较慢的键盘。“你似乎总是用这样的答案打败我。”DavidWallace我住在Stackoverflow服务器的街对面。从技术上讲,这是一个内部类。这就是为什么它可以访问封闭实例的字段。从技术上讲,它是一个内部类。这就是为什么它可以访问封闭实例的字段。