调用构造方法一定会在Heap上创建对象吗?比如说在子类构造方法中调用父类构造方法super(),是否会在堆上创建一个父类对象?如果不会,那么经过super初始化后,父类非静态成员变量怎么存储呢?

解决方案 »

  1.   

    1.内存存储管理:堆heap:new 出来的对象 、非static的成员变量
                                   栈stack:局部变量,方法参数列表中的参数也是局部变量
                                   方法区:
    2,创建子类对象的流程:1创建子类对象,调用子类中的构造方法,在子类的构造方法中的第一行是super(),去访问父类中的无参构造方法,但是
    创建对象会调用构造方法,构造方法不一定会创建该类的对象
      

  2.   

    子类new在堆上,父类也会有一个构造在堆上
      

  3.   

    和构造方法没关系,new关键字执行后,就在堆内存中分配了 new关键字后面类型的对象,对象的内容是他和他所有父类的类变量。至于他又多少父类,不重要。
      

  4.   

    这要看你的类有没有被加载到方法区里面了
    子类调用父类super(),如果父类没有被JVM加载过,则触发父类加载动作。包括加载-验证-准备-解析-初始化。初始化完成时,其实父类的非static变量这个时候并没有被分配空间,因为非static的成员变量属于实例,这个时候并没有生成父类的实例对象。由此,你第一个问题 调用构造方法一定会在Heap上创建对象吗? 不会。
      

  5.   

    new一个子类对象的时候会先找到最顶上的父类,Object类,自顶向下依次的调用每个类对应的构造方法,其实在调用一个构造方法之前就已经把对象创建在对内存了,只是这个对象还不能被其他人使用,构造方法最后会把这个对象的引用传递回去。我认为每一次new的时候都会在对内存中创建对象。至于你第二个问题,其实子类是父类的拓展,(我认为在自顶向下的依次调用构造方法的时候,应该都是在最初始的时候创建的最顶上父类对象一点一点拓展出来的) 你new出来的对象本质其实是子类对象,但是如果你说他是一个父类对象也没问题(向上造型) 所以非静态的成员变量 肯定是在对内存当中的!
      

  6.   

    1.new对象时对象不一定会在堆中创建,如果是方法中的局部对象,经过逃逸分析发现对象是非逃逸对象,那么这个对象会在栈中创建。其它的对象都会在堆中创建。
    2.对象创建顺序是从顶层Object一直向下创建到最底层的对象。