创建子类对象的同时到底有没有创建父类对象啊?

bkxmgx 2014-07-17 12:57:08
class Parent {
int i = 1;
}
class Child extends Parent {
int j = 2;
Child() {
//为什么这行报错,而下面紧接着的一行不报错呢,
System.out.println(super);
System.out.println(super.i);
System.out.println(this);
System.out.println(this.i);
System.out.println(this.j);
}
}
class Test {
public static void main(String[] args) {
//请问new 子类Child对象的同时在堆中会产生父类Parent对象吗?
Child child = new Child();
}
}

this存的就是child引用的对象的地址(虽然不是真正的地址,暂且理解为地址)
创建子类对象的同时到底有没有创建父类对象啊?。“new+构造方法”是创建一个对象,在Child(){}里面隐藏了super(),但这仅仅是调用了父类构造,并没有new+父类构造,所以按理不会产生父类对象, 那为什么System.out.println(super.i);这行不报错????

...全文
2011 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxsaqw176 2015-10-31
  • 打赏
  • 举报
回复
引用 11 楼 perryjiang 的回复:
但是引用转型又是啥情况 就是创建一个父类的对象 但是用子类的构造方法去初始化这个父类对象 而且 这个父类对象可以调用子类的方法(我都不知道这个对象到底是父类的还是子类的╮(╯_╰)╭) 代码 Person 是Student的 父类 Person p = new Student(); p.show(); 最后根据输出结果发现调用的是子类的show() 其中 Person类没有成员 只有一个show() 子类 Student类有一个新增的成员 还有一个show() 求大神出面完整解释清楚 ┗(^0^)┓ 
这是向上转型,父类拓展了子类的方法并且可以访问子类中对父类覆盖了的函数,可以理解成在父类的基础上搭建了一个子类实例。具体可以百度向上转型了解,对应的知识点还有向下转型。
猕猴骑土牛 2015-07-23
  • 打赏
  • 举报
回复
但是引用转型又是啥情况 就是创建一个父类的对象 但是用子类的构造方法去初始化这个父类对象 而且 这个父类对象可以调用子类的方法(我都不知道这个对象到底是父类的还是子类的╮(╯_╰)╭)
代码 Person 是Student的 父类
Person p = new Student();
p.show();

最后根据输出结果发现调用的是子类的show()

其中 Person类没有成员 只有一个show()
子类 Student类有一个新增的成员 还有一个show()

求大神出面完整解释清楚 ┗(^0^)┓ 
致知Fighting 2014-07-20
  • 打赏
  • 举报
回复
只能说你们老师水平太扯淡了,连这种基本的东西都没有搞清楚,拿这个帖子去打他们脸吧。 很明确的告诉你结论,不会创建。
vnvlyp 2014-07-19
  • 打赏
  • 举报
回复
没有创建父类对象,类的创建过程是这样的,首先开辟内存,然后调用类的构造函数,类的构造函数第一步会去调用父类的构造函数(如果存在父类),父类构造函数首先对这个对象进行初始化,该赋值的赋值,该做什么做什么,所有父类构造函数运行完毕后才继续运行这个类自己的构造函数。 你的理解没有问题,new才会去开辟内存,创建一个空对象,构造函数只是将这个对象初始化一下而已。
vnvlyp 2014-07-19
  • 打赏
  • 举报
回复
你的“老师”们纯属扯淡。。可能连你问题什么意思都没搞清。。开发5 6年顶多就是项目经验多一点,但谁说项目经验多就一定基础知识扎实啊,开发了5 6年可能基础知识倒还忘光了,工作中基本就是照葫芦画瓢,有几个工作了还真正有心思钻研底层的 你的理解没有问题,按照你房子的比喻我再来说说 一个对象可以理解为一个房子,而一个类只是规定了什么地方要放什么东西,比如客厅要放沙发,餐厅要有餐桌 创建一个新对象,就是建造一栋新房子,如果你不去初始化对象,那么这个房子就是空的,没有任何装饰家具,你也不能用它来做任何有意义的事(当然这只是个比喻,空房子不能说没有用) 当调用构造函数时,才会真正让这个对象有意义,那就是布置这个房子,布置这个房子有很多设计师,子类和父类就是两个设计师,他们之间的关系可以理解为父类设计师是子类设计师的指导,首先子类会让父类先来,父类说他要A B C D E等等,于是就叫人搬来这些东西放在房子里,父类布置好了,子类就来布置了,子类就会继续在房子里添置家具等等,有时候父类和子类会有冲突,比如父类说瓷砖地板好,子类说木地板好,这时候以子类为准,因为最终这个房子是给子类的,父类只是一个顾问指导而已,这就相当于方法重写。 所以如果你说创建一个子类对象会不会同时也创建了父类对象,那答案肯定是没有 说有的如果他的意思是这个子类对象在某个时刻完全是一个父类对象,因为那个时刻他具备了父类对象所有的特征,但不具备子类的特征,那还是可以接受的,但这个过程只会创建一个对象,如果说有的认为创建了两个或者更多的对象,那肯定是错误的
bkxmgx 2014-07-19
  • 打赏
  • 举报
回复
房子为两层楼,二楼是父类和子类共有,一楼是子类单独所有
bkxmgx 2014-07-19
  • 打赏
  • 举报
回复
我问了两个开发5,6年的老师 他们都说创建子类对象的同时创建了父类对象, class F extends E{} class E extends D{} class D extends C{} class C extends B{} class B extends A{} class A{} 建立A对象时那岂不是同时创建了BCDEF对象??? abstract class A{} class B extends A{} new B()时不会创建A对象吧(抽象类不能有对象) 我觉得是这样的,new子类对象时,先开辟一片内存空间,先给父类的成员变量安排好内存单元,然后子类自己的数据接着来分配给予内存单元,相当于父类数据与子类数据合租一个房子,房子是子类的 有没有大神给予强有力论证来解答,众说纷纭啊??我两个老师都非常直接爽快的说“会”,气死我了。
userschentao 2014-07-19
  • 打赏
  • 举报
回复
子类在创建对象时,父类也会创建对象 子类创建对象的同时,先调用父类的构造器(此时父类构造器初始化成员变量的同时,也创建了父类的对象),接着子类的构造器初始化了子类的成员变量
Malons 2014-07-19
  • 打赏
  • 举报
回复
更正:不好意思,我又试验了一下,super并不能引用子类成员方法,修改如下:

根据我的理解,首先说一下对象的构造过程:

1.首先从根类到直接父类依次执行父类的构造方法(没有显示调用构造方法的情况下),这个过程执行父类成员的初始化。

2.最后调用本类的构造方法。

以上两步的结果是创建了本类对象,这个对象如图:


从图中可知,压根没有父类对象,只有子类对象,而且this完全引用这个对象,super只是引用了这个对象中从父类继承来的成员,也就是说,除了super不能访问子类定义的成员之外,super和this是同一个对象,这可以通过toString()方法验证(如果子类没有重写toString()方法,则调用父类的该方法,如果父类没有,再找父类的父类,直到Object的toString()方法)。

Object类toString方法:

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

getClass 和 getName 都是Object类的方法。

总之,没有super这个对象,他只是引用了子类对象的一部分数据,所有无法输出super。
那么为什么能输出super.toString()呢,原因在前面图中,这个调用过程是先试图调用从子类对象中直接父类继承的toString方法(注意:super.toString()是显式调用),如果没有则向上追述知道Object。
Malons 2014-07-19
  • 打赏
  • 举报
回复
你好:

根据我的理解,首先说一下对象的构造过程:

1.首先从根类到直接父类依次执行父类的构造方法(没有显示调用构造方法的情况下),这个过程执行父类成员的初始化。

2.最后调用本类的构造方法。

以上两步的结果是创建了本类对象,这个对象如图:


从图中可知,压根没有父类对象,只有子类对象,而且this完全引用这个对象,super只是引用了这个对象中从父类继承来的成员,和子类定义(可见的)的成员方法部分的数据,也就是说,除了super不能访问子类定义的成员变量之外,super和this是同一个对象,这可以通过toString()方法验证(如果子类没有重写toString()方法,则调用父类的该方法,如果父类没有,再找父类的父类,直到Object的toString()方法)。

Object类toString方法:

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

getClass 和 getName 都是Object类的方法。

总之,没有super这个对象,他只是引用了子类对象的一部分数据,所有无法输出super。
那么为什么能输出super.toString()呢,原因在前面图中,这个调用过程是先试图调用从子类对象中直接父类继承的toString方法(注意:super.toString()是显式调用),如果没有则调用子类的toString方法,没有则向上追述知道Object。

以上仅是个人见解,真假难辨,欢迎讨论。
bkxmgx 2014-07-18
  • 打赏
  • 举报
回复
半天没有后来者 这问题有没有详细分析解答一下啊
致知Fighting 2014-07-17
  • 打赏
  • 举报
回复
没有创建。 但是父类定义的属性被分配了内存空间,所以你用super可以引用到。

62,635

社区成员

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

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