Java - 如果字段具有相同名称,如何访问外部类字段

时间:2014-04-30 09:46:39

标签: java inner-classes

考虑以下代码

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;

并收到编译错误。

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

试试这个:

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

最佳解决方案是为字段提供有意义且有区别的名称。但这并非总是可能......

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

OuterClass.this.y;

或如果该字段是静态的

OuterClass.y;

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

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

OuterClass.this.method();

OuterClass.method(); // static

注意:在Java 8中,您可以使用基于实例的方法引用。 e.g。

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

答案 4 :(得分:0)

您可以尝试使用y的getter方法

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;
  }

}