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

创建子类对象的同时到底有没有创建父类对象啊?
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);这行不报错????


------解决方案--------------------
没有创建。

但是父类定义的属性被分配了内存空间,所以你用super可以引用到。
------解决方案--------------------
没有创建父类对象,类的创建过程是这样的,首先开辟内存,然后调用类的构造函数,类的构造函数第一步会去调用父类的构造函数(如果存在父类),父类构造函数首先对这个对象进行初始化,该赋值的赋值,该做什么做什么,所有父类构造函数运行完毕后才继续运行这个类自己的构造函数。
你的理解没有问题,new才会去开辟内存,创建一个空对象,构造函数只是将这个对象初始化一下而已。
------解决方案--------------------
你好:

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

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。

以上仅是个人见解,真假难辨,欢迎讨论。
------解决方案--------------------
更正:不好意思,我又试验了一下,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。
------解决方案--------------------
子类在创建对象时,父类也会创建对象
         子类创建对象的同时,先调用父类的构造器(此时父类构造器初始化成员变量的同时,也创建了父类的对象),接着子类的构造器初始化了子类的成员变量

------解决方案--------------------
你的“老师”们纯属扯淡。。可能连你问题什么意思都没搞清。。开发5 6年顶多就是项目经验多一点,但谁说项目经验多就一定基础知识扎实啊,开发了5 6年可能基础知识倒还忘光了,工作中基本就是照葫芦画瓢,有几个工作了还真正有心思钻研底层的

你的理解没有问题,按照你房子的比喻我再来说说
一个对象可以理解为一个房子,而一个类只是规定了什么地方要放什么东西,比如客厅要放沙发,餐厅要有餐桌
创建一个新对象,就是建造一栋新房子,如果你不去初始化对象,那么这个房子就是空的,没有任何装饰家具,你也不能用它来做任何有意义的事(当然这只是个比喻,空房子不能说没有用)
当调用构造函数时,才会真正让这个对象有意义,那就是布置这个房子,布置这个房子有很多设计师,子类和父类就是两个设计师,他们之间的关系可以理解为父类设计师是子类设计师的指导,首先子类会让父类先来,父类说他要A B C D E等等,于是就叫人搬来这些东西放在房子里,父类布置好了,子类就来布置了,子类就会继续在房子里添置家具等等,有时候父类和子类会有冲突,比如父类说瓷砖地板好,子类说木地板好,这时候以子类为准,因为最终这个房子是给子类的,父类只是一个顾问指导而已,这就相当于方法重写。

所以如果你说创建一个子类对象会不会同时也创建了父类对象,那答案肯定是没有
说有的如果他的意思是这个子类对象在某个时刻完全是一个父类对象,因为那个时刻他具备了父类对象所有的特征,但不具备子类的特征,那还是可以接受的,但这个过程只会创建一个对象,如果说有的认为创建了两个或者更多的对象,那肯定是错误的