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

请考虑以下代码

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; 

并收到编译错误。

这种情况是否会出现在现实生活中?

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

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

 OuterClass.this.y; 

或者如果该字段是静态的

 OuterClass.y; 

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

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

 OuterClass.this.method(); 

要么

 OuterClass.method(); // static 

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

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

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

试试这个:

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

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

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

您可以尝试使用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; } }