考虑以下代码
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;
并收到编译错误。
现实生活中会出现这种情况吗?
答案 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;
}
}