比如 class A{
A a = new A();
}大家都知道创建了一个A对象,并一个内存空间,指向a但是 class B extends A{
B b = new B();
}问题是,B b = new B();创建了两个内存空间?创建了两个句柄吗。
A a = new A();
}大家都知道创建了一个A对象,并一个内存空间,指向a但是 class B extends A{
B b = new B();
}问题是,B b = new B();创建了两个内存空间?创建了两个句柄吗。
1.new B().在堆内存中开辟一个空间,并且空间附有地址值,
2.变量b 称之为引用变量,在栈内存中指向了堆内存中的B(),
3.这时把堆内存中B()的地址值赋值给了栈内存中的b.
4.这样栈内存中的b拿到了堆内存中的地址值,指向了堆内存中的B();
接着说继承,,当B继承 A.在创建B对象的同时,,也就是说 当B还没创建完的时候,,刚初始化B的构造函数的时候.
会先创建A对象,当A对象创建完成之后才会继续创建B对象..引用关键就是 栈内存中的b,指向了堆内存中的B(),但是堆内存中的B()里面有A()对象.
new B() 没有创建一个A对象与一个B对象,而是创建了一个既属于A也属于B的一个对象,这很好理解么,例如一个类叫衣服,另一个类叫衬衫继承衣服,如果买一件衬衫是实例化的话,我买这个衬衫难道能叫我买了衬衫与衣服两个东西么?当然,你可以自以为是的说java就是这么实现的,那请你研究好了,有根据了再说好么,别想当然.....。
另外,还想说明的是,构造函数并不完成开辟内存空间的责任,它只完成初对象初始化的工作,B对象确实会调用A对象的构造函数,但是并不代表就会开辟内存空间再生成一个A对象。
这个关系就充分说明了a,b两个之间的关系
奇异在8楼9楼。到底是开辟了B的内存空间(包括A)还是开辟了新的内存空间(包括A,B)
{
public static void main(String[] args)
{
System.out.println(new B());
}
}class A
{
private String str; public A()
{
this.str = "abc";
} public String toString()
{
return this.str;
}
}class B extends A
{
}result : abc;
new一个子类,是如何分配内存空间而已。1、开辟了B的内存空间(包括B)。2、开辟了新的内存空间(包括A,B)。3、同时分配A对象内存,B对象内存。选2.