String str = new String("hello");
为什么只创建了两个对象?
我们在创建子类的实例的时候,系统不是会默认的调用父类的构造器吗?
调用构造器难道不会创建实例吗?
如果是这样的话,创建子类的实例时候,系统会往上一层一层的去找,一直到顶级的父类。。如果按照上述的方法,那会有object的构造器被调用。
这样产生的对象应该不只两个吧?
为什么只创建了两个对象?
我们在创建子类的实例的时候,系统不是会默认的调用父类的构造器吗?
调用构造器难道不会创建实例吗?
如果是这样的话,创建子类的实例时候,系统会往上一层一层的去找,一直到顶级的父类。。如果按照上述的方法,那会有object的构造器被调用。
这样产生的对象应该不只两个吧?
不可是一层层往上调用
也就是说,new String() 的过程实际上是这样
1 先分配一块内存,大小等于 sizeof(String), 地址假设为 addr
2 调用Objetc的构造器,初始化addr指向的,大小为 sizeof(Object)的一块空间
3 然后调用String的构造器,初始化addr指向的,大小为 sizeof(String)的一块空间也就是这样,所以子类可以放心的初始化父类声明的成员,不用担心父类初始化的值和子类初始化的值不一致,因为子类的后调用,会覆盖父类原来的值 (假设子类可以访问哦)所以,楼主的问题就是这样: 构造器其实被调用了4次,但是只创建了2个实例
看下这篇文章
这个是J2SE平台下面创建两个对象
一个是对象池里面放着一个对象,另外一个是new出来的
而在J2ME平台下创建则是一个对象,因为J2ME没有池的概念