【分析】抽象类的非静态内部类

编程入门 行业动态 更新时间:2024-10-12 20:27:46

【分析】抽象类的非静态内<a href=https://www.elefans.com/category/jswz/34/1765347.html style=部类"/>

【分析】抽象类的非静态内部类

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文件,和普通的类无异,只不过内部类包含一份外部类的引用。

更多推荐

【分析】抽象类的非静态内部类

本文发布于:2023-07-28 21:39:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1325288.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:部类   静态   抽象类

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!