还有就是编译时常量的一些性质,哪位大侠能给说一下?
解决方案 »
- 新手求解惑...谢了......
- 一个java生成exe的问题
- java学习
- 多线程访问jni接口的问题!
- 菜鸟问题 eclipse是IBM的产品吗?
- 请问,谁有JBuilder7下,用commAPI开发串口通讯的例子
- 为什么我的源代码全暴露了?
- 装了jbuilder后,原来的j2sdk不能在dos下使用,有啥办法
- JDBC的问题。提示ClassNotFound:sun.jdbc.odbc.Lookup.急急!!!!!!!!!!!!
- 如何让IE认识applet所带的数字签名,而不是让证书仓库认识这个带数字签名的applet,就是说不装jdk也可以在IE里面使用带有签名的applet,详情请进
- 求助一个JCOMBOBOX和图片加载的问题
- 今天看了一下JAVA,有些不明白的地方,希望大家指点一下
那么:如果我定义:static final int b=a+1; 那么b算不算?
还有,static final int c= "hello world".length()这个算不算?
}
}
public class Words {
private Words() { }; // Uninstantiable
public static final String FIRST = "the";
public static final String SECOND = null;
public static final String THIRD = "set";
}现在编译以后,输出结果是很明确的。
那么,当我把Words.java修改成以下形式:public class Words {
private Words() { }; // Uninstantiabl
public static final String FIRST = "physics";
public static final String SECOND = "chemistry";
public static final String THIRD = "biology";
}重新编译Words.java,但是不编译PrintWords.java,直接运行PrintWords,输出结果会是什么呢?
结果肯定是不会变的啊,因为你没有改变PrintWords.class里面的内容
class Temp{
private static final int a=10;
//编译期可以计算出来a=10,所以a是编译期常量
private static final int b=((int)(Math.random()*10));
//编译期不可以计算出b的值,所以b不是编译期常量
}
b算,c不算。将PrintWords 编译后的class文件反编译成Java文件如下:System.out.println((new StringBuilder("the ")).append(Words.SECOND).append(" ").append("set").toString());从中可以发现Words.FIRST 和Words.THIRD已经用常量代替了
public static void main(String[] args){
System.out.println(Temp.a); //A处
System.out.println(Temp.b); //B处
}
}class Temp{
static{
System.out.println("Temp类已被初始化");
}
public static final int a=10;
//编译期可以计算出来a=10,所以a是编译期常量
public static final int b=((int)(Math.random()*10));
//编译期不可以计算出b的值,所以b不是编译期常量
}
当我们把B处的输出语句注释掉后,打印结果是:10 这说明类没被初始化(说明a是编译期常量)
当我们把A处的输出语句注释掉后,把B处的语句复原,打印的结果是:
Temp类已被初始化
4(这是JAVA虚拟机自动生成的随机数)
这说明类被初始化(说明b不是编译期常量)
public static void main(String args[]){
System.out.println(Test.b);
System.out.println(Test.c);
}
}
class Test{
static final int a=1;
static final int b=a+1;
static final int c= "hello world".length();
static{
System.out.println("初始化类!");
}
}果然,访问b不会导致Test的初始化,访问C会。但是,难道在编译时,C的值无法计算出来吗?
java的大部分优化是由jvm进行的,那才是真正的深度编译优化。
public class Const{
public static void main(String args[]){
//System.out.println(Data.i1);
//System.out.println(Data.i2);//initialization!
//System.out.println(Data.b1);//initialization!
//System.out.println(Data.s1);
//System.out.println(Data.i3);//initialization!
//System.out.println(Data.a); //initialization!
//System.out.println(Data.e); //initialization!
}
}
class Data{
static{
System.out.println("initialization!");
}
public static final int i1=0;
public static final Integer i2=0;
public static final Boolean b1=true;
public static final String s1="0";
public static final int i3=s1.length();
public static final A a=new A();
public static final Enum e=E.A;
}
class A{}
enum E {
A,B,C,D,E,F,G;
}结论:
编译时常量只有可能是基本类型和String类型,而不可能是任何的引用类型,包括枚举,包装。