日期:2014-05-20  浏览次数:20765 次

关于new的问题
如下:
建造一个类
class A
{
  A(){}
}
class B{
  B(){}
}
下面的情况各发生了什么事情?
一:A a=new A();
二:new A();
三:如果在类A中还有静态的成员变量(已赋值)或静态成员函数,以上语句又各发生什么事情?
四:如果在类A中还有静态的成员变量(已赋值),B中有A的对象实例,B a=new B(); new B();发生了什么事情。
注:我指的发生落伍什么事情主要指他们各自执行的顺序,和那些执行了,那些没有执行,怎么执行的(内存中的情况)。看了《think in java》上“静态数据的初始化”那想到的,有点模糊。


------解决方案--------------------
A a=new A() 声明一个引用变量 :要求java虚拟机分配空间给引用变量,并将此变量命名为a.
new A()先调用A的构造方法了,然后返回一个引用.
其他的也不是很清楚。。。
------解决方案--------------------
JAVA的整体初始化顺序:父类静态初始化→子类静态初始化(在main方法之前)→子类创建对象后→父类的非静态变量初始化→父类的构造方法初始化→子类的非静态变量初始化→子类的构造方法初始化。
------解决方案--------------------
建议楼主感性认识一下吧,step into...
------解决方案--------------------
一:A a=new A();
因为A类没有显式的声明父类,所以系统自动使该类继承Object,所以在调用A的构造方法时,系统首先调用Object类的构造方法,然后再调用A的构造方法。而new会在JAVA虚拟机的堆内存中申请空间,存储A对象的内容,然后把该对象在堆内存中的首地址赋值给对象a。
二:new A(); 
创建对象的过程和一一样,只是由于没有指向该对象的引用,该对象会被认为是垃圾对象,很快就会被垃圾收集器收集,释放占用的内存。
三:如果在类A中还有静态的成员变量(已赋值)或静态成员函数,以上语句又各发生什么事情? 
如果有静态变量,则在第一次使用该类时,如创建对象或调用该类的构造方法,为该变量申请内存,以后再也不会申请了。
如果是静态成员函数,则会自动初始化该方法,以后就直接调用了。
四:如果在类A中还有静态的成员变量(已赋值),B中有A的对象实例,B a=new B(); new B();发生了什么事情。
对象的初始化过程和一一样,如果有属性的话,在执行构造方法内部的代码以前,会初始化属性。