【问题标题】:Java - How to access Outer class field if the fields have same nameJava - 如果字段具有相同的名称,如何访问外部类字段
【发布时间】:2014-06-16 13:55:44
【问题描述】:

考虑下面的代码

class OuterClass{
    class InnerClass{
        int x;
        int y;
        void calculateX(){
            x = y+z;//I want to access the y field of the outer class
        }
        void printX(){
            print();
        }
    }
    int y;
    int z;
    InnerClass instance;
    OuterClass(int y,int z){
        this.y = y;
        this.z = z;
        instance = new InnerClass();
        instance.y = 10;
        instance.calculateX();
        instance.printX();
    }
    void print(){
        System.out.println("X:"+instance.x+"\nY:"+y+"\nZ:"+z+"\n");
    }
}

如果名称重叠,如何访问外部类的字段?

我尝试了以下方法:

x=super.y;
x=OuterClass.y;

并收到编译错误。

这种情况会在现实生活中发生吗?

【问题讨论】:

  • 我猜外部类字段应该是final。并且使用带有类名前缀的它们也需要它们是static

标签: java inner-classes


【解决方案1】:

最好的解决方案是为字段赋予有意义和可区分的名称。但这并不总是可能的......

要获取字段或外部实例,您可以使用

OuterClass.this.y;

或者如果字段是静态的

OuterClass.y;

注意:y 通常是 this.y 的缩写(取决于 y 的实际定义位置)

同样,调用你需要的外部类的实例方法。

OuterClass.this.method();

OuterClass.method(); // static

注意:在 Java 8 中,您有可能是基于实例的方法引用。例如

 list.stream().filter(OuterClass.this::predicate);

【讨论】:

    【解决方案2】:

    你可以尝试使用getter方法来获取y

    class OuterClass{
      class InnerClass{
          int x;
          int y;
          void calculateX(){
              x = getY() + x;
          }
          void printX(){
              print();
          }
      }
      int y;
      int z;
      InnerClass instance;
      OuterClass(int y,int z){
          this.y = y;
          this.z = z;
          instance = new InnerClass();
          instance.y = 10;
          instance.calculateX();
          instance.printX();
      }
      void print(){
          System.out.println("X:"+instance.x+"\nY:"+y+"\nZ:"+z+"\n");
      }
      public int getY() {
        return y;
      }
    
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      class OuterClass{
      ...
          class InnerClass {
             ...
             int yFromOuterClass = OuterClass.this.y;
          }
      }
      

      【讨论】:

        【解决方案4】:

        通常不应该(这是设计问题的标志),但请尝试OuterClass.this.y

        【讨论】:

          【解决方案5】:

          您可以在OuterClass 中存储对自身的引用,并从InnerClass 使用它来访问其字段,如下所示:

          class OuterClass{
              OuterClass reference = this;
              ...
              class InnerClass {
                 ...
                 void calculateX() {
                     reference.y; // OuterClass.y
                     this.y; // InnerClass.y
          

          【讨论】:

          • 不必要的;使内部类成为内部类的原因在于它已经隐式存储了该引用。
          • @chrylis 哦,不知道你能做到。赞成您的回答,谢谢。
          猜你喜欢
          • 2021-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-25
          • 1970-01-01
          • 2021-03-13
          • 2022-01-09
          • 2014-05-05
          相关资源
          最近更新 更多