解决方案 »

  1.   

    没有创建。但是父类定义的属性被分配了内存空间,所以你用super可以引用到。
      

  2.   

    没有创建父类对象,类的创建过程是这样的,首先开辟内存,然后调用类的构造函数,类的构造函数第一步会去调用父类的构造函数(如果存在父类),父类构造函数首先对这个对象进行初始化,该赋值的赋值,该做什么做什么,所有父类构造函数运行完毕后才继续运行这个类自己的构造函数。
    你的理解没有问题,new才会去开辟内存,创建一个空对象,构造函数只是将这个对象初始化一下而已。
      

  3.   

    你好:       根据我的理解,首先说一下对象的构造过程: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。以上仅是个人见解,真假难辨,欢迎讨论。
      

  4.   

    更正:不好意思,我又试验了一下,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.   

    我问了两个开发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子类对象时,先开辟一片内存空间,先给父类的成员变量安排好内存单元,然后子类自己的数据接着来分配给予内存单元,相当于父类数据与子类数据合租一个房子,房子是子类的有没有大神给予强有力论证来解答,众说纷纭啊??我两个老师都非常直接爽快的说“会”,气死我了。
      

  6.   

    你的“老师”们纯属扯淡。。可能连你问题什么意思都没搞清。。开发5 6年顶多就是项目经验多一点,但谁说项目经验多就一定基础知识扎实啊,开发了5 6年可能基础知识倒还忘光了,工作中基本就是照葫芦画瓢,有几个工作了还真正有心思钻研底层的你的理解没有问题,按照你房子的比喻我再来说说
    一个对象可以理解为一个房子,而一个类只是规定了什么地方要放什么东西,比如客厅要放沙发,餐厅要有餐桌
    创建一个新对象,就是建造一栋新房子,如果你不去初始化对象,那么这个房子就是空的,没有任何装饰家具,你也不能用它来做任何有意义的事(当然这只是个比喻,空房子不能说没有用)
    当调用构造函数时,才会真正让这个对象有意义,那就是布置这个房子,布置这个房子有很多设计师,子类和父类就是两个设计师,他们之间的关系可以理解为父类设计师是子类设计师的指导,首先子类会让父类先来,父类说他要A B C D E等等,于是就叫人搬来这些东西放在房子里,父类布置好了,子类就来布置了,子类就会继续在房子里添置家具等等,有时候父类和子类会有冲突,比如父类说瓷砖地板好,子类说木地板好,这时候以子类为准,因为最终这个房子是给子类的,父类只是一个顾问指导而已,这就相当于方法重写。所以如果你说创建一个子类对象会不会同时也创建了父类对象,那答案肯定是没有
    说有的如果他的意思是这个子类对象在某个时刻完全是一个父类对象,因为那个时刻他具备了父类对象所有的特征,但不具备子类的特征,那还是可以接受的,但这个过程只会创建一个对象,如果说有的认为创建了两个或者更多的对象,那肯定是错误的