内部类就是外部类的一个成员,只是这个成员比成员变量和成员方法更特殊,因为它本身是一个类。因此既有类的功能,又有类成员的一些特性,比如被成员修饰符修饰,但是,内部类之间不存在覆盖。因为父类与子类的内部类,都有各自的名字空间,所以不覆盖也不会发生冲突。不过,内部类之间是能相互继承的。
你对你的下面那句代码理解错了
Outer.Inter inout = new SonOuter().new Inter();//这里不是实现覆盖,而是实现多态
就是这里,必须不能编译通过。
先分析下看,你建立了一个父类的内部类的引用inout,指向了子类的内部类的实例对象。这必须不能编译通过,因为这两个内部类没有继承关系啊。没有父子关系的两个类又怎么能出现多态的用法呢?
因此只要把SonOuter里的代码改改,把子类的内部类也继承父类的内部类,这样就可以使用内部类的多态性质了
public class SonOuter extends Outer
{
class Inter extends Outer.Inter//这里要继承父类的内部类{
void method()
{
System.out.println("son--method--"+x);//这里改成son---method,方便查看结果是否形成了多态
}
}
void printInfo()
{
System.out.println("SonOuter running");
}
public static void main(String[] args)
{
SonOuter.Inter inout1 = new SonOuter().new Inter();//虽然这里能编译通过,但不能证明两个内部类之间存在重写(这点我之前也搞错了),因为内部类的名字空间不同,所以不影响Outer.Inter inout2 = new SonOuter().new Inter();//因为两个内部类现在是父子关系了,所以可以实现多态!!!
inout1.method();
inout2.method();
Outer out = new SonOuter();
out.printInfo();