class A{}
public class B extends A{}如上的代码中在实例化B的时候,会产生两个对象,一个是A的,一个是B的。
这句话对么?
为什么不产生3个对象,一个是A的,一个是B的,一个是Object的

解决方案 »

  1.   

    只产生一个B,
    只不过在B中包着一个A,在A中包着一个Object
      

  2.   

    不对哦
    如果你实例化B类,那莫就产生一个B类的对象B类只是继承A类。更不会产生3个对象如果那样的话,OutOfMemory就变成家常便饭了
    因为任何类都是Object类的子类
      

  3.   

    那么如楼上几位所说的如下代码怎么解释?public class B extends A(){
      public B(){
         super();//调用父类的构造器这时候没有A的对象产生吗?
      }
    }
    //A 的构造器同样
    public class A(){
     public A(){
       super();//调用Object的构造器,这时候到底有没有Object对象产生呢?
     }
    }
      

  4.   

    应该是没有A对象和Object对象,只有一个B对象实例化。
      

  5.   

    B对象里包含了A对象 每个A对象里包含了Object对象 但是没有包含Object对象的A对象就不是A对象 没有包含A对象的B对象就不是B对象
    所以要咬文嚼字的话就是确实产生了A对象和Object对象 只不过他们都在B对象里
      

  6.   


    这个问题提的真不错阿,让人思考经过多方查找,下面这几个观点还是普遍被认同的
    第一种说法:
    为什么super()在构造方法,super.fun()在方法能用?个人认为应该是super表示对象才能这么调用,可父类对象没被new 而如果是表示父类的话,那fun()应该是static方法啊?迷茫~~ 有些东西可以称为定义,不要钻牛角尖 super();表示调用父类的构造方法,只是调用方法,不构造对象。 第二种说法:
    super是对父类的引用,但不是对父对象的引用(没有父对象这个说法),它不是一个对象,所以不能像this一样作为一个对象去使用。 第三种说法:
    实际上,请一定注意super是关键字,我想可以说它是一种引用,但是肯定和普通的引用不同, 
    这个java文法中就完整地定义了super的语法。 其实,上面三种说法的意思都差不多,都表示只是调用父类的构造函数,并不创建对象。不足之处,还望大家指正阿
      

  7.   

    我是这么理解的:
    当一个类的实例化一个对象时,会产生类所描述的属性和方法的实例,它所包含的属性和方法是这个实例独自拥有的
    如果这个类有父类,那么它会拥有父类所有可继承的属性和方法
    在实例化时,通过调用构造方法,依次初始化父类的属性,并不是产生一个父类的实例(因为不是组合或聚合)综上所述,我认为只生成B的一个实例但如果public class B extends C{  // B是C(is-a)但不能说B拥有C(has-a)
        Object obj = null;
        Class A = null;    B() {
            obj = new Object();
            A = new A();
        }

    这段代码就会产生3个实例。
      

  8.   

    补充下,上面例子实例化B的时候产生3个实例,B,Object和A的实例
      

  9.   

    还有引用的问题,引用就是指向对象的一个地址(可以这样理解),有引用就必有对象.super如果是一个引用,那他就应该指向某个对象.
      

  10.   

    一个类型是B的对象,是B也是A,是A也是Object
      

  11.   

    super不是引用,只是一个定位父类中的符号的一个关键字。
      

  12.   

    当new一个子类时 会隐式调用父类的无参构造方法 
    所以new一个B类时 先会调用A类的构造方法 
    产生A B类的两个对象
      

  13.   

    只会产生一个对象,那就是B,只不过B里包含A里的方法和属性
    ,同样也包含OBJECT里的方法和属性
    可以用SUPER调用A
      

  14.   

    只有一个B,你new B 时,根据类型和继承关系,以及方法表常量池等,也就是上下级的环境生成一个B
      

  15.   

    套用两个回复:
    public class B extends A(){ 
      public B(){ 
        super();//调用父类的构造器这时候没有A的对象产生吗? 
      } 

    //A 的构造器同样 
    public class A(){ 
    public A(){ 
      super();//调用Object的构造器,这时候到底有没有Object对象产生呢? 

    } 你调用了构造方法,但不产生对象?这怎么可能? 
    所以会有三个对象,只是A和Object的对象被包含在B对象里????
      

  16.   

    有三个对象,仅实例化了对象B,其余的没实例化, 可以看看Java 内存分配机制
      

  17.   

    1.如果创建了A对象的实例,那么意味着被B覆盖的A的某个方法fn()在new B()以后也会存在,那将B转型为A后,但是实际中调用 ((A)B).fn()调用的实际还是B中的fn(),还有A的那些私有属性,创建B就创建A,那给有多少的内存冗余啊.从这个意义上讲,如果你是java语言的设计者,你会搞这么冗余但是又用不到的东西给用户么?
    2.构造函数确实是在创建对象的时候调用,但是并不代表调用该构造就一定创建该构造所在对象吧? 真正的判断条件是 new 关键字.
    3
      

  18.   

    楼上不知道多态吗?
    子类对象会保存父类的私有属性,这是一定的,只不过子类不能直接访问,但可以通过super访问到。
      

  19.   


    那父类引用指向子类对象的时候,我们也可以用super去调用父类里面的方法和属性啊,所以在创建子类对象的同时还是应该会创建父类的对象吧
      

  20.   

    如果你是 A a = new B();这样绝对只会产生一个 对象 , 记住是对象, 只有一个, 因为 new 一下只会产生一个对象