【问题标题】:How can I access OuterClass field from InnerClass?如何从内部类访问外部类字段?
【发布时间】:2021-03-13 10:42:45
【问题描述】:

我已经学习 Java 和 OOP 几个星期了。

昨天我学习了内部类和外部类。我想知道当它们具有完全相同的名称时,如何从 InnerClass 访问 outerClass 的字段。

如下所示,当外部类的名称不同时,可以从内部类访问外部类的字段。

public class OuterClass { 
    public String OuterName;
    public OuterClass(String OuterName) {
        this.OuterName = OuterName;
    }
    public class InstanceInnerClass {
        public String InnerName;
        public InstanceInnerClass(String InnerName) {
            this.InnerName = InnerName;
        }
        // In this method, accessing field in outer and inner class is possible. 
        // when they have different name.
        public void printAllName() {
            System.out.printf("OuterName: %s, InnerName: %s\n", OuterName, InnerName);
        }
    }
}

当他们有相同的名字时,我不知道如何访问这两个名字。

public class OuterClass { 
    public String name; // field which has same name
    public OuterClass(String name) {
        this.name = name;
    }
    public class InstanceInnerClass {
        public String name; // field which has same name
        public InstanceInnerClass(String name) {
            this.name = name;
        }
        public void printAllName() {
            // What should be written in this code 
            // to print both name fields from OuterClass and InnerClass
            System.out.printf("OuterName: %s, InnerName: %s\n", name, name);
        }
    }
}

【问题讨论】:

    标签: java class inner-classes anonymous-class


    【解决方案1】:

    只需执行OuterClass.this 和您要访问的OuterClass 中的字段名称,例如OuterClass.this.OuterName。在您的代码中将如下所示:

    public class OuterClass {
        public String name; // field which has same name
        public OuterClass(String name) {
            this.name = name;
        }
        public class InstanceInnerClass {
            public String name; // field which has same name
            public InstanceInnerClass(String name) {
                this.name = name;
            }
            public void printAllName() {
                // What should be written in this code
                // to print both name fields from OuterClass and InnerClass
                System.out.printf("OuterName: %s, InnerName: %s\n", name, OuterClass.this.name);
            }
        }
    }
    

    当您有两个同名字段时,一个在内部类中,另一个在外部类中(ie, 阴影),并且您尝试从内部类访问该字段,编译器假定您要从内部类访问该字段,并忽略外部类中的另一个。否则,将无法选择使用哪个变量。

    Shadowing

    如果一个类型的声明(如成员变量或参数 名称)在特定范围内(例如内部类或方法 定义)与封闭中的另一个声明具有相同的名称 范围,则声明遮蔽了封闭的声明 范围。 您不能仅通过名称来引用影子声明。

    【讨论】:

      【解决方案2】:

      OuterClass 的字段可通过OuterClass.thisInnerClass 中访问:

      public void printAllName() {
          // to print both name fields from OuterClass and InnerClass
          System.out.printf("OuterName: %s, InnerName: %s\n", OuterClass.this.name, this.name);
      }
      

      测试:

      OuterClass outer = new OuterClass("myOuter");
      OuterClass.InstanceInnerClass inner = outer.new InstanceInnerClass("myInner");
      
      inner.printAllName();
      

      打印:

      OuterName: myOuter, InnerName: myInner
      

      【讨论】:

        猜你喜欢
        • 2011-01-02
        • 1970-01-01
        • 2011-02-13
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        相关资源
        最近更新 更多