为什么子类要调用父类的构造器?我想大神能不能从虚拟机原理解释哦?

进德修业哥 2015-03-21 10:09:59
我知道子类实例化必然导致其继承树父类加载,并创建相应的Class类对象,但是我想知道更多的细节
...全文
304 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
songjy3 2015-03-24
  • 打赏
  • 举报
回复
楼上的观点我并不同意,实例化子类的时候,父类没有实例化!首先想一点,要是一个类有20个祖宗,那么你的目的只是实例化他,那么java会先把20个祖宗先实例化吗?代价太高了,子对象虽然有super,但是这个super不是一个引用,你打印出来会报错,打印this就没问题! 还有为什么要有构造函数?构造函数是为了对对象的初始化,子类不能继承得到父类的构造方法,但是总不会要我们再一次写和父类一模一样的构造方法吧,所以子类构造方法中能调用父类的构造方法实现对子类对象的初始化
original_dream 2015-03-23
  • 打赏
  • 举报
回复
主要是为了给子类对象进行初始化
进德修业哥 2015-03-23
  • 打赏
  • 举报
回复
引用 8 楼 cumtwyc 的回复:
引用 7 楼 u013339247 的回复:
[quote=引用 6 楼 cumtwyc 的回复:] 自己看一下JVM不就可以了,也没多少页
非常感谢,还请教一下您,JVM每次我看得到时候看到几页就感觉很吃力,指教一下有什么好的方法?
不一定按顺序看,有些章节相对独立,如果前面的比较难可以先从简单的开始看,循序渐进。[/quote]以后不懂之处还请您多多帮忙,谢谢你
飏飏一蝶 2015-03-22
  • 打赏
  • 举报
回复
引用 4 楼 u013339247 的回复:
[quote=引用 1 楼 qq118194716 的回复:] 从继承设计原理来说,子类的对象实例化占的内存只有它独有的部分,其父类实例化的内存空间是被子类对象共享的 子类实例化时父类必须得先实例化,如果父类还有父类,得最先实例化其父类的父类 所以,必须先给父类分配了空间才能让子类对象共享之 所以虚拟机也不过是照章办事而已...
你的大概的意思我是领悟了,但是请问一下你的“父类实例化”是不是指Class对象呢? [/quote] 指在内存中分配堆区空间、方法区空间、栈区空间等 Class对象只不过是关于该类的运行时描述而已
进德修业哥 2015-03-22
  • 打赏
  • 举报
回复
引用 1 楼 qq118194716 的回复:
从继承设计原理来说,子类的对象实例化占的内存只有它独有的部分,其父类实例化的内存空间是被子类对象共享的 子类实例化时父类必须得先实例化,如果父类还有父类,得最先实例化其父类的父类 所以,必须先给父类分配了空间才能让子类对象共享之 所以虚拟机也不过是照章办事而已...
你的大概的意思我是领悟了,但是请问一下你的“父类实例化”是不是指Class对象呢?
进德修业哥 2015-03-22
  • 打赏
  • 举报
回复
你的大概的意思我是领悟了,但是请问一下你的“父类实例化”是不是指Class对象呢?
wyc_ 2015-03-22
  • 打赏
  • 举报
回复
引用 7 楼 u013339247 的回复:
引用 6 楼 cumtwyc 的回复:
自己看一下JVM不就可以了,也没多少页
非常感谢,还请教一下您,JVM每次我看得到时候看到几页就感觉很吃力,指教一下有什么好的方法?
不一定按顺序看,有些章节相对独立,如果前面的比较难可以先从简单的开始看,循序渐进。
进德修业哥 2015-03-22
  • 打赏
  • 举报
回复
引用 6 楼 cumtwyc 的回复:
自己看一下JVM不就可以了,也没多少页
非常感谢,还请教一下您,JVM每次我看得到时候看到几页就感觉很吃力,指教一下有什么好的方法?
wyc_ 2015-03-22
  • 打赏
  • 举报
回复
自己看一下JVM不就可以了,也没多少页
三仙半 2015-03-21
  • 打赏
  • 举报
回复
子类实例保存有父类实例的一个引用,不同的子类实例的父类实例引用内容并不相同。

public class Test {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ChildClass c1 = new ChildClass();
		ChildClass c2 = new ChildClass();
		c1.setParentField("c1设置的");
		System.out.println(c1.getParentField());
		System.out.println(c2.getParentField());		
	}
}
class ParentClass {
	public String str = "父类的str属性的原始值";
}
class ChildClass extends ParentClass {
	public void setParentField(String str){
		super.str = str;
	}	
	public String getParentField(){
		return super.str;
	}
}
输出如下: c1设置的 父类的str属性的原始值
飏飏一蝶 2015-03-21
  • 打赏
  • 举报
回复
从继承设计原理来说,子类的对象实例化占的内存只有它独有的部分,其父类实例化的内存空间是被子类对象共享的 子类实例化时父类必须得先实例化,如果父类还有父类,得最先实例化其父类的父类 所以,必须先给父类分配了空间才能让子类对象共享之 所以虚拟机也不过是照章办事而已...

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧