今天第一天去面试就碰鼻子.. 还是基础不扎实, 几下点吧.. 下面是一个让我这个小菜费脑筋的题
运行如下代码:
package test1;
public class A {
B b = new B();
A(){
System.out.println("a");
}
}
package test1;
public class B {
B(){
System.out.println("b");
}
}
package test1;
public class C {
public static void main(String[] args) {
A a = new A();
}
}
!-- 在这里输出的应该是 b a , A类在实例化之前先初始化, 所以B先被实例化,输出b 然后调用A的构造方法输出a。
如果想调用普通方法 不想类被初始化, 把方法写成static的就可以了,不实例化直接调用方法,避开了初始化。--!
-------------------------------------------------------------------------------------------------------------------------------
评论怎么只能删除不能回复呢? 就在这里回复吧。 上面说的太粗糙,今天又问了理论强的网友,我想实例化这个过程应该理解的差不多了。
C类中main方法执行的时候,虚拟机在把A类读入内存后,会先验证是不是class文件,然后做好准备工作,其实就是去分配内存,然后开始解析class文件到java运行时内存区,解析class文件的时候,首选是magic number(魔数),然后是版本号,然后是常量池,后来是方法等。在常量池初始化的时候,如果需要用到其他的类B,这个时候虚拟机实例主进程等待,然后加载B,把B解析后创建实例,然后把A实例的成员变量b的引用指向刚刚创建的B的实例。初始化成员变量完成后,开始分配内存到堆空间中,然后实例完成后,会把A类的实例的引用执行C类中的a,把引用实例替换为直接实例。
如果我理解的还是不到位,有错误的地方,请留个言,明天详详细细的请教老师。谢谢