String str = new String("hello");
为什么只创建了两个对象?
我们在创建子类的实例的时候,系统不是会默认的调用父类的构造器吗?
调用构造器难道不会创建实例吗?
如果是这样的话,创建子类的实例时候,系统会往上一层一层的去找,一直到顶级的父类。。如果按照上述的方法,那会有object的构造器被调用。
这样产生的对象应该不只两个吧?

解决方案 »

  1.   

    产生实例跟每个类的Class对象有关系
    不可是一层层往上调用
      

  2.   

    调用的是子类的实例  所以是调用一次new 就产生了一个实例,"hello"本身就是一个对象
      

  3.   

    没错的,会调用Object的构造器,但是调用构造器不是创建实例。 构造器的作用是在获得了对象实例的空间之后,在实例的空间中进行初始化。
    也就是说,new String() 的过程实际上是这样
    1 先分配一块内存,大小等于 sizeof(String), 地址假设为 addr
    2 调用Objetc的构造器,初始化addr指向的,大小为 sizeof(Object)的一块空间
    3 然后调用String的构造器,初始化addr指向的,大小为 sizeof(String)的一块空间也就是这样,所以子类可以放心的初始化父类声明的成员,不用担心父类初始化的值和子类初始化的值不一致,因为子类的后调用,会覆盖父类原来的值 (假设子类可以访问哦)所以,楼主的问题就是这样: 构造器其实被调用了4次,但是只创建了2个实例
      

  4.   

    http://www.javaeye.com/topic/774673
    看下这篇文章
      

  5.   

    你的意思是说调用了new关键字之后,只开辟了一片空间?
      

  6.   

    String str = new String("hello");
    这个是J2SE平台下面创建两个对象
    一个是对象池里面放着一个对象,另外一个是new出来的
    而在J2ME平台下创建则是一个对象,因为J2ME没有池的概念
      

  7.   

    有没有什么方法可以得到对象池中的对象个数和new出来的对象个数呢