对以下代码的原因感到好奇
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();
}
}
输出
启动Outerclass 20 InnerClass 10 Outerclass-2 20
但是如果将int i声明为private,则输出为
启动Outerclass 20 InnerClass 30 Outerclass-2 30
有人可以解释一下吗?
答案 0 :(得分:3)
当该字段没有访问修饰符时,它具有默认可见性。
从InnerClass#printme()
的范围,子类'方法,它是可访问的。所以
i+=10;
正在访问InnerClass
实例的字段,该字段已初始化为0.
private
个字段,因此InnerClass
无法访问自己的字段。但是因为你的InnerClass
是一个内部类,它位于OuterClass
的主体内,所以它可以访问封闭实例的字段。所以
i+=10;
正在访问OuterClass
实例的字段。
答案 1 :(得分:3)
无法在private
中访问sub-class
字段,但可以在内部类中访问。
所以,如果你有
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.
答案 2 :(得分:2)
不确定。如果它不是私有的,那么它由InnerClass
继承 - 也就是说,i
操作的InnerClass
是i
对象中的那个。如果它是私有的,则不能继承它,因此操作的{{1}}是包含对象中的那个。
答案 3 :(得分:1)
InnerClass
不是严格的内部类,通常从类体中的声明中知道。在这种情况下它是local class并且确实是一种内部类,但是应用了完全不同的规则。这个问题都是关于继承和因此 - 阴影变量。
在您的情况下,如果使用default
(无)修饰符扩展类,则可以访问此字段,并且可以有效地查看超类的字段。
如果字段声明为private
,则子类无法看到它,但它有自己的,因为它扩展了OutterClass
,因此新对象以默认值0开始。
在文档的Shadowing and local classes