Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 私有变量内部类:值的解释?_Java_Oop_Private_Inner Classes - Fatal编程技术网

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服务器的街对面。从技术上讲,这是一个内部类。这就是为什么它可以访问封闭实例的字段。从技术上讲,它是一个内部类。这就是为什么它可以访问封闭实例的字段。