java中,创建子类对象时,父类对象会也被一起创建么?
如果没有创建父类对象,子类如何使用父类的成员呢?
还有,super所谓的父类存储空间的表示到底是什么意思?
写在前面
- 创建对象指的是在堆区开辟空间
- 编译器在运行子类构造器之前,必须先执行父类构造器;且调用父类构造器的语句必须在子类构造器的第一行。
- 构造方法的作用是为堆区中的对象的属性初始化,不是创建对象。
开门见山
Java 中创建子类对象不会创建父类对象!
上代码
/**
* 示例测试类
*/
public class Test {
public static void main(String[] args) {
// 创建子类对象
Sub sub = new Sub();
// 通过setter设置父类的私有成员变量str
sub.setStr("SubString");
System.out.println(sub.getStr());
}
}
/**
* 示例父类
*/
class Base {
private String str;
/**
* 父类构造器
*/
public Base() {
System.out.println("Base():" + this);
}
public void setStr(String str) {
this.str = str;
}
public String getStr() {
return this.str;
}
}
/**
* 示例子类
*/
class Sub extends Base {
/**
* 子类构造器
*/
public Sub() {
System.out.println("Sub():" + this);
}
}
测试结果
Base():Sub@2f2c9b19
Sub():Sub@2f2c9b19
SubString
几点疑问
- 是谁在完成创建对象的工作?
new 关键字 - 既然没有父类对象,那么父类的私有成员变量 str 从何而来?
虚拟机会在堆区中开辟一块空间来保存这个私有属性(该空间不属于子类对象),并且在运行时该属性的空间会与方法区中 Base.class 动态绑定。
子类对象 sub 调用继承父类的方法 setStr() 时,系统会找到与 setStr() 方法 静态绑定 的类 Base,再找到与 Base 类 动态绑定 的属性空间 str,便可对该属性进行相关操作。- 静态绑定:(final、static、private)在程序执行前已经被绑定,也就是说在编译过程中就已经知道这个熟悉或方法是哪个类的方法,此时由编译器获取其他连接程序实现。
- 动态绑定:在运行根据具体对象的类型进行绑定。
类的方法可以被继承,但是类的构造器和 private 修饰的属性及方法不能被继承。
作者:nylgwn
出处:https://www.cnblogs.com/nylgwn/p/16887669.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具