部类"/>
【分析】抽象类的非静态内部类
Hello,大家好,我是尘封已久的恨意。
首先,大家应该都知道,抽象类是不可以直接实例化对象的,必须要依靠子类对象向上转型来实例化。
但是抽象类却可以定义非静态内部类,非静态内部类必须依靠外部类对象存在,而此时外部类是一个抽象类,抽象类无法实例化对象,这样一来不就矛盾了吗?
所以,下面用代码来测试一下:
abstract class A{class B{public void b(){System.out.println("B类对象:"+this);System.out.println("外部类对象:"+A.this);System.out.println("b");}}public void a(){B b= new B();b.b();}}class C extends A{
//因为A类是抽象类,所以利用子类C来实例化对象
}public class Main {public static void main(String[] args)throws Exception {A a=new C();a.a();}
}
运行后的结果:
B类对象:com.myjava.A$B@6e8cf4c6
外部类对象:com.myjava.C@12edcd21
b
我们通过,调用a()方法 实例化内部类B的对象,从B类的b()方法可以看出来当前的B类对象以及外部类对象。
由此可见,这个内部类依靠的外部类的对象是C类的对象。
可以说明,非静态内部类不一定非要依靠外部类对象而存在,也可能依靠外部类的子类对象而存在。
.
然后,再普及一个小知识点,就是接口里面定义的内部类不管你写不写static,一律都是静态内部类。
因为接口里面没有构造器,无法实例化对象,而且接口只能被类实现,不能被类继承。
而抽象类虽然无法实例化对象,但是它的构造器可以为子类对象实例化,并且可以被子类所继承,所以它可以定义非静态内部类。
再多说几句,内部类其实也是一种语法上的假象,编译后会单独变成一个class文件,和普通的类无异,只不过内部类包含一份外部类的引用。
更多推荐
【分析】抽象类的非静态内部类
发布评论