Java 创建子类实例时会创建父类实例吗?

2,407 阅读1分钟

首先思考一个问题:抽象类可以被实例化么?

大家都应该知道抽象类不能实例化。

然后再思考一个问题:子类继承抽象类的时候,实例化子类,那么作为抽象类的父类会被实例化吗?

答案显而易见,本期节目到此结束!

嗯???你还在看啊???

那就再说两句吧。

首先,在学习多态的时候,发现new子类,父类的构造方法也会执行,既然构造方法执行了,是不是也会 被实例化?

其实这是一个错误:构造方法被执行不代表实例化这个类。

父类构造方法的执行,是为了给变量进行赋值,而不是为了实例化父类。java文件在被编译成class文件时,编译器会把对应成员变量初始化操作的字节码写到构造方法里边。

抽象点的:每个类的这些元数据,无论在构建这个类的实例还是调用这个类某个对象的方法,都会访问方法区的这些元数据。构建一个对象时,jvm 会在堆中给对象分配空间,这些空间用来存储当前对象实例属性以及其父类的实例属性(而这些属性信息都是从方法区获得),但是,这里并不是仅仅为当前对象的实例属性分配空间,还需要给父类的实例属性分配。总之会给父类分配堆内存,但是这块堆内存属于子类的堆内存。