面试题(一) 实例化,初始化 vs static

 今天第一天去面试就碰鼻子.. 还是基础不扎实,  几下点吧..    下面是一个让我这个小菜费脑筋的题

 运行如下代码:

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,把引用实例替换为直接实例。

 

如果我理解的还是不到位,有错误的地方,请留个言,明天详详细细的请教老师。谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值