私有变量内部类:价值的解释?

时间:2014-03-30 20:32:12

标签: 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.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

有人可以解释一下吗?

4 个答案:

答案 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操作的InnerClassi对象中的那个。如果它是私有的,则不能继承它,因此操作的{{1}}是包含对象中的那个。

答案 3 :(得分:1)

InnerClass不是严格的内部类,通常从类体中的声明中知道。在这种情况下它是local class并且确实是一种内部类,但是应用了完全不同的规则。这个问题都是关于继承和因此 - 阴影变量。

在您的情况下,如果使用default(无)修饰符扩展类,则可以访问此字段,并且可以有效地查看超类的字段。

如果字段声明为private,则子类无法看到它,但它有自己的,因为它扩展了OutterClass,因此新对象以默认值0开始。

在文档的Shadowing and local classes

部分查看here