问一个关于类加载和声明的问题

老冯_f 发布于 2014/03/12 10:44
阅读 187
收藏 0

华为云11月刊推送:DIY微信问答机器人,高性能计算代码的20个技巧!>>>

class P1{
    static
    {
        System.out.println(1111111111);
    }
    static String name="ss";
    }
 
 class Test{
    public static void main(String[] args){
  P1 p=null;
  System.out.println(p.name);
  }
}

当执行到P1 p=null;时,P1类应该没有加载近内存,因为把System.out.println(p.name);
注释掉,静态代码快没有执行。
但是System.out.println(p.name);去掉注释的时候,静态代码块却执行了,仅仅是声明了一个P1类变量加载P1类了吗?

加载中
1
Timco
Timco
当调用类的变量或方法时,类才会加载到jvm中。这样应该就可以理解了吧
老冯_f
老冯_f
回复 @Timco : 我好像明白了
Timco
Timco
回复 @女汉子_油菜花 : so,调用p.str(实际调用的是P1.str,静态变量归Class对象管)->P1的静态变量或方法被使用->P1.class被加载->Class<P1>创建->完成P1的静态变量初始化->输出p.str。所以对于类的静态方法和静态变量,推荐使用P1.str而不是实例p.str的调用方式
Timco
Timco
回复 @女汉子_油菜花 : 静态方法,静态变量,静态域的初始化和调用与具体实例无关,由每个对象对应的Class对象负责。这个Class对象在.class文件加载的时候才会创建,而.class文件只有当对象的静态方法和静态变量被使用的才会加载到jvm中。
老冯_f
老冯_f
理解了!那为什么没实例化的p也能调用类中的静态成员呢
1
HuaJiaoDI
HuaJiaoDI
p没有被实例化,无论是类本身还是类声明的变量去调用静态的东西,都会加载类的。
老冯_f
老冯_f
回复 @HuaJiaoDI : 对,调用非静态的方法是报异常。那也就是说只要用到类中的东西,类就会加载?那,没有实例化的变量为啥能调用类中的静态成员呢
HuaJiaoDI
HuaJiaoDI
楼主可以在定义一个非静态方法,然后在调用完静态变量后,再调用这个方法,看看结果。(肯定报空指针了)
1
Timco
Timco
public class Test1 {
	public static void main(String[] args) {
		Test test1 = null;
		Test test2 = null;
		System.out.println("begin");
		System.err.println(test1.str);
		test1 = new Test();
		test2 = new Test();
		System.out.println("共同的Class对象:"+(test1.getClass()==test2.getClass()));
	}
}
class Test{
	static {
		System.out.println("hello1");
	}
	static String str = "hello2";
}

你跑一下这段代码,看看begin和hello1的执行顺序,然后可以参照我的一篇博客看看 http://my.oschina.net/u/998081/blog/177882  



老冯_f
老冯_f
回复 @Timco : 额。。我知道了
老冯_f
老冯_f
回复 @Timco : 快教我怎么设成最佳答案,好像改版了呢
Timco
Timco
回复 @女汉子_油菜花 : 明白了,请设为好评 o(^▽^)o
老冯_f
老冯_f
嗯,谢谢你,这是用到反射了呢吧
0
老冯_f
老冯_f
求指点,谢谢
0
huan
huan
死代码,根本不会执行
老冯_f
老冯_f
执行了
返回顶部
顶部