Class.forName()和静态代码块的问题

knxw0001 2012-12-02 03:33:32
如一个类class A {
static {
system.out.println("aaaaa");
}
}

另一个类中class B{
main(){//main方法,大家知道就行了
Class.forName(A);
}
}

就会打印出“aaaaa”,为什么呐?
...全文
484 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wj_1116_cs 2014-03-06
  • 打赏
  • 举报
回复
请教一下.调用了 类名.Class,静态代码没有执行,newInstance的时候静态代码才执行.那么这个时候类到底加载了没有呢? 如果说加载了,那么静态代码的初始化和类的加载应该是分开的了?
Derek-Chen 2012-12-04
  • 打赏
  • 举报
回复
引用 6 楼 zk3389 的回复:
引用 2 楼 duxingzhe0311 的回复:因为楼主写的那句话会导致你那个类的初始化。 只有在首次主动使用的时候会导致类的初始化。 主动使用的几种情况: 1:创建类的实例,例如:new XX(); 2:访问某个类或者接口的静态变量,或者对该静态变量赋值; 3:调用类的静态方法 4:反射,例如:Class.forName("XX"); 5:初始化一个类的……
静态代码块 在类被加载是就会去执行
wonkju 2012-12-03
  • 打赏
  • 举报
回复 1
楼上说的都很好的,我也说一下吧,是这样子的: 反射LZ懂吧,Java中,当你编译成.class 字节码时,即Java的Class对象(JVM)是自动帮你生成的,其中这个过程中,它load Class对象,并将它初始化(如果有static block则执行),它是优先与main执行的。
knxw0001 2012-12-03
  • 打赏
  • 举报
回复
qq1137668388 2012-12-02
  • 打赏
  • 举报
回复
静态代码块随着类的加载现而加载,只要有调用这个类,就会执行静态代码块中的内容
Jacky-止涯 2012-12-02
  • 打赏
  • 举报
回复
引用 楼主 knxw0001 的回复:
就会打印出“aaaaa”,为什么呐?
类中的代码块,分成静态的和非静态的。静态代码块是属于类的,而非静态是属于实例化对象的。 使用Class.forName("A")是加载类,所以类的静态代码块会执行。 像楼主的代码,如果把代码块的static去掉,那么代码就不会执行了。 如果要执行非静态代码块,那么需要把加载的类实例化:Class.forName("A").newInstance() 如下面代码所示。

    public static void main(String[] args) throws Exception {
        Class c = Class.forName("com.jscai.test.A");  // 加载类,执行静态代码块
        c.newInstance();                              // 实例化对象,执行非静态代码块
    }
class A {
    {  // 非静态代码块
        System.out.println("instance"); 
    }
    static {   // 静态代码块
       System.out.println("static");
    }
}
zk3389 2012-12-02
  • 打赏
  • 举报
回复
引用 2 楼 duxingzhe0311 的回复:
因为楼主写的那句话会导致你那个类的初始化。 只有在首次主动使用的时候会导致类的初始化。 主动使用的几种情况: 1:创建类的实例,例如:new XX(); 2:访问某个类或者接口的静态变量,或者对该静态变量赋值; 3:调用类的静态方法 4:反射,例如:Class.forName("XX"); 5:初始化一个类的子类 6:Java虚拟机其董事会被标注为启动的类……
加载类的时候会执行静态代码块的内容,且仅执行一次
  • 打赏
  • 举报
回复
引用 2 楼 duxingzhe0311 的回复:
因为楼主写的那句话会导致你那个类的初始化。 只有在首次主动使用的时候会导致类的初始化。 主动使用的几种情况: 1:创建类的实例,例如:new XX(); 2:访问某个类或者接口的静态变量,或者对该静态变量赋值; 3:调用类的静态方法 4:反射,例如:Class.forName("XX"); 5:初始化一个类的子类 6:Java虚拟机其董事会被标注为启动的类……
哥们总结的不错啊,这是类主动使用的6种方式,我们常见的1,2,3,5这几种,另两种并不怎么用。。。
  • 打赏
  • 举报
回复
在B类中执行Class.forName(A);时候,jvm会用ClassLoader自动加载A这个类,直接初始化A类,建议看看关于jvm的类加载的知识,有助于对java深一步的理解。。。
xingfuzhuzi1314 2012-12-02
  • 打赏
  • 举报
回复
LZ, 你classA 这个类声明了这个静态块,当累初始化的时候,就会加载。 当classB,直接Class.forName("A");的时候,系统会加载发射生成A,所以直接初始化,打印出了aaaa
rockets311 2012-12-02
  • 打赏
  • 举报
回复
因为楼主写的那句话会导致你那个类的初始化。 只有在首次主动使用的时候会导致类的初始化。 主动使用的几种情况: 1:创建类的实例,例如:new XX(); 2:访问某个类或者接口的静态变量,或者对该静态变量赋值; 3:调用类的静态方法 4:反射,例如:Class.forName("XX"); 5:初始化一个类的子类 6:Java虚拟机其董事会被标注为启动的类,例如:java XX 楼主说的情况,应该是满足上面所说的第四条了。
knxw0001 2012-12-02
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧