请写出如下代码的结果,并说出理由,不要直接运行

liujun999999 2008-07-10 09:31:48

class Test {
static {
System.out.println("***");
}
public static final String a = "sss";

}

class Test1 {
public static void main(String[] args) {
System.out.println(Test.a);

}

}
...全文
484 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuaizq77 2008-07-11
  • 打赏
  • 举报
回复
***
sss
wensheng_zh2007 2008-07-11
  • 打赏
  • 举报
回复
个个都是强人啊
liujun999999 2008-07-11
  • 打赏
  • 举报
回复
49楼兄弟很搞笑啊,呵呵
skyqiang520 2008-07-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xunyiren 的回复:]
输出
sss

因变量a是final修饰的,外部调用类的静态常量是不会导致类的初始化的!


class Test {
    static {
        System.out.println("***");
    }
    public static String a = "sss";//注意这里已把final去掉,看运行结果

}

class Test1 {
    public static void main(String[] args) {
        System.out.println(Test.a);

    }

}
[/Quote]
httpsoul 2008-07-11
  • 打赏
  • 举报
回复
看了39楼,明白了
helei123a 2008-07-11
  • 打赏
  • 举报
回复
学习
要分
httpsoul 2008-07-11
  • 打赏
  • 举报
回复
我支持三楼的意见,等下跑一下试试
sagezk 2008-07-11
  • 打赏
  • 举报
回复
class Demo {
static {
System.out.println("***");
}
public static final String S = "sss";
}

class Test {
public static void main(String[] args) {
String s = Demo.S;
}
}


class Demo {
static {
System.out.println("***");
}
public static final String S = null;
}

class Test {
public static void main(String[] args) {
String s = Demo.S;
}
}


将两者的 Test 类

[code=BatchFile]javap -c -l -private -s -verbose Test[/code]

前后结果对比一下 JVM 指令,原因就一目了然了。
liujun999999 2008-07-10
  • 打赏
  • 举报
回复
结论:
调用类的final成员不会引发类的初始化操作,所以static语法块不会被执行
当staitc成员变量为null时,会查找static语法快运行以便能够正确初始化static成员
jingulang 2008-07-10
  • 打赏
  • 举报
回复
没有什么推翻之说吧

null就是不存在
mingggg 2008-07-10
  • 打赏
  • 举报
回复
强,一个null推翻上面的说法了!
liujun999999 2008-07-10
  • 打赏
  • 举报
回复
大家把
 public static final String a = "sss";

改成
 public static final String a = null;

再看看结果
xunyiren 2008-07-10
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 liujun999999 的回复:]
云水谣老兄,你没讲出为什么final不会导致类装载啊
[/Quote]

Java编译器把所有的类变量初始化语句和类型的静态初始化器通通收集到<clinit>方法内,该方法只能被Jvm调用,专门承担初始化工作。

楼主的例子是外部调用类的静态final常量, 并且该常量初始化语句是编译时的常量表达式。

只能说这种情况不符合"类首次主动被使用时"的初始化规则; 因为底层的细节我无法窥探, 我的理解是: 既然是类的静态final常量, 并且类变量初始化语句是编译时的常量表达式, 那么该常量就断然不会依赖于类本身(包括其继承的类层级)的任何类属性及类方法,所以没有必要在外部引用这样的类常量时进行初始化。

name99_6 2008-07-10
  • 打赏
  • 举报
回复
越是基础的越少人会啊。
wxinb 2008-07-10
  • 打赏
  • 举报
回复
xunyiren 说得有道理哈 支持
KOOK_OKKO 2008-07-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jdlsfl 的回复:]
Test只有被实例化的时候才会执行静态代码块
[/Quote]
qq278095755 2008-07-10
  • 打赏
  • 举报
回复
学习新知识.
chenniaoc 2008-07-10
  • 打赏
  • 举报
回复
哇 学习了啊

loujianchengdd 2008-07-10
  • 打赏
  • 举报
回复
*** sss
代码初始化顺序是先初始化静态代码块,再初始化静态变量
liujun999999 2008-07-10
  • 打赏
  • 举报
回复
云水谣老兄,你没讲出为什么final不会导致类装载啊
加载更多回复(38)

62,616

社区成员

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

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