有了前几篇成员内部类的基础,今天我们看一道失手率极高的成员内部类面试题。
我们先定义一个OuterTest类和它的成员变量num(10),在定义一个OuterTest类的内部类InnerTest和它的成员变量num(20),最后定义内部类InnerTest的成员函数show和show的局部变量num(30)。
那么问题来了,如何在main中调用show打印num,输出30、20、10?
代码如下:
class OuterTest{
public int num = 10;
class InnerTest{
public int num = 20;
public void show(){
int num = 30;
System.out.println(?);
System.out.println(?);
System.out.println(?);
}
}
}
public static void main(String[] args) {
OuterTest.InnerTest oi = new OuterTest().new InnerTest();
oi.show();
}
我们先看第一个问题,如何输出30?
太简单了,直接打印,就近原则,肯定是30:
System.out.println(num);
我们在看第二个问题,如何输出20?
这也不难,当前类,用this就好了。
System.out.println(this.num);
最后一个问题,如何输出10?
触类旁通,之前用this,现在用super,轻松~
System.out.println(super.num);
然而报错:num cannot be resolved or is not a field
请注意:内部类和外部类没有继承关系!内部类和外部类没有继承关系!内部类和外部类没有继承关系!
那么怎么办?
最简单的做法,new出对象直接调用:
System.out.println(new OuterTest().num);
然而这显然不是我们想要的,毕竟这是成员内部类的面试题。
正解:通过外部类名限定this对象。
System.out.println(OuterTest.this.num);
一道失手率极高的成员内部类面试题,Get。