java编译时常量
遇到的问题是想重新编译某个java文件(比如A.java),里面有个常量(比如finalinta)和上次编译时不一样,但是另一个使用A.class的a的文件(比如B.java)由于在javac在上次编译的时候将当时的A.class里面的常量直接给内联了,所以就达不到想要的效果。
如果是这样的话,对于String可以使用.intern()来防止编译器进行优化,对于其他类型,可以要么不定义为常量,要么将常量定义为private,然后使用一个static方法来返回这个常量。
B. java中,常量占内存空间吗
任何的计算机语言中,一个量都是要占用空间。不管是常量还是变量。
只不过常量在编译型的语言中,编译后就可以确定其偏移地址。
而变量是在运行时才能确定。
由此可知,常量可以做一些初始化的动作。
希望对你有帮助!
C. JAVA语言中,什么是变量,如何定义一个变量什么是常量
变量:
变量是程序运行过程中它的值是允许改变的量。
变量定义:定义必须严格按照标识符的命名规则,即0~9数字、字母、下滑线、$等组成,且首字母不能是数字、不能是java关键字。
变量格式为[访问修饰符][修饰符]数据类型 变量名[=初始值]。
eg:public static int a=0;
byte b=2;
常量:
常量是不可改变的量,一次赋值,永不改变。
常量定义:常量需要有final修饰符修饰。常量声明时必须初始化。常量标识符必须大写,且多个单词时用下滑线连接。
注意:有时候常量也可以不用在声明时就初始化。
eg:做局部变量
public class Test {
public static void main(String[] args)
{
final int Y;
Y=9;
}
}
做静态全局变量时,若声明时不服初值,必须在静态代码块中赋初值。
static final int Y;
static{
Y=9;
}
做非静态全局变量时,若声明时不服初值,则必须在非静态代码块中赋值。
(3)java编译时常量扩展阅读:
使用变量时注意事项:
作用域:变量定义在那个大括号内,它就在这个大括号内有效。并且,在同一个大括号内不能同时定义同名的变量。
初始化值:没有初始化值得变量不能直接使用。 只要在使用前给值就行,不一定要在定义是给值。
定义变量的格式: a:数据类型 变量名 = 初始化值; b:数据类型 变量名;变量名 = 初始化值;c:在一行上建议只定义一个变量可以定义多个。
参考资料来源:网络-Java
D. java 中的编译期常量是什么使用它又什么风险
编译期常量就是所谓的 public final static 常量。
由于在编译时就确定了值,在使用的场合会直接写成值。而不是直接到原来的类中读取。
这样会有一个问题。 如果 类 A 提供了常量 类B使用了常量。并都进行了编译。
然后,修改了类A的源码,调用系统进行编译。
系统发现类A是新的代码,编译了,类B是旧的代码,就不进行编译,使用旧的类。
由于类B中直接编译进了旧的值,导致类A的修改无法反映到类B中。
这样造成了风险。
E. java中不存在byte/short型常量的表示法。但可以把一定范围内的int型常量赋
1、所谓常量,就是在程序运行时,不会被修改的量,在java中定义常量的表达式是声明物吵的时候加上 static final修饰符,表明该变量不可被修改,称之为常量
2、java中可以声明byte/short的常量,比如码岁:public static final byte a = 1;但是,byte的值必须在byte类型的范围内,即:-128~+127
3、java中的整数,像:1,2,234,1000等默认都是int类型的,在-128~+127范围内的值可以直接迟蚂睁赋值给byte类型,自动识别为byte,同理,在-32768~+32767之间值也可以直接赋值给short
F. 什么是常量Java中,常量的定义规则有哪些
在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字)来定义常量。
G. java类常量和一般常量之间到底有什么区别尼
变量分类
1. 类变量
l 在类定义中使用关键字static修饰的字段
l 在接口声明中使用或者不使用static修饰的字段
说明:当准备好类或接口时就会创建一个类变量并将其初启散镇始化为一个默认值。当卸载类或接口时,就会有效的使类变量停止存在
2. 实例变量
在类声明中不使用关键字static声明的字段
3. 数组元素(未命名的变量)
无论何时创建一个作为数组的新对象,都会创建这些变量并将其初始化为默认值。当数组不在被引用时,就会有效地使数组元素停止存在。
4. 方法参数变量
对于方法声明中声明的每个参数,当调用该方法时,都会创建一个新的掘启参数变量。新变量会用来方法调用的相应的参数值进行初始化。当方法体执行完成时,就会有效地是方法参数停止存在。
5. 构造函数参数变量
对于构造函数中声明的每个参数,每当类实例创建表达式或显示构造函数调用调用该构造函数时,就会创建一个新的参数变量。新变量会用来自创建表达式或构造函数调用的相应的参数值进行初始化。当构造函数体执行完成时,就会有效地使构造函数参数停止存在。、
6. 异常处理程序参数变量
每当悄粗catch语句或者try语句捕获一个异常时,就会创建一个异常处理程序参数。新变量会用与异常关联的实际对象进行初始化。当与catch子句关联的代码块执行完成时,就会有效地使异常处理程序参数停止存在。
7. 局部变量
通过局部变量声明语句声明的变量。局部变量使用前一定要赋值。局部变量不会自动初始化为默认值
8. Final变量
Final修饰的变量,只能被赋值一次,除非在赋值之前明确地取消对fianl变量进行赋值,否则,对final变量赋值,将会引发编译时错误。
变量的初始值
在使用变量值之前,程序中每个变量都必须有一个值:
1. 每个类变量、实例变量或数组元素都会在创建时使用默认值对其进行初始化,以下是java中数据类型与其默认值的对应关系
byte、short、int :0
long :0L
float :0.0f
double :0.0d
char :空字符(即:/u0000)
boolean :false
应用类型 :null
2. 每个方法的参数都会被初始化为方法调用者提供的对应参数值
3. 每个构造函数参数都会被初始化为类实例创建表达式或显示构造函数调用提供的对应参数值
4. 异常处理程序参数将被初始化为抛出一个表示异常的ix
5. 在使用局部变量之前,必须通过初始化或赋值显示地为其赋值,编译器可以使用明确赋值的规则对这种赋值方式ing验证
文章出自CSDN,http://blog.csdn.net/shibenjie/article/details/4331693
H. java 静态变量和静态常量
静态变量是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储巧配搭方式,但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。
对于自动变量,它属于动态存储方式。但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。
而在以Pascal为代表的许多程序语言中,所有局部变量都由系统自动分配存储空间,而所有全局变量的存储空间则以静态分配的方式获取,因此由于实际上“局部变量”和“全局变量”这两个术语已足以涵盖所有的情况,在这些程序语言中通常不使用“静态变量”这一术语,而直接以“全局变量”代之。
在这些程序语言中,静态变量就是全局变量,而即使在有明确区分全局和静态变量的程序语言中,在编译后的代码里二者也以相同的方式获取存储空间。而今术语“静态变量”的概念则主要基于C族语言的“static”的定义。
静态变量也可以用于存储常数。具体来说,静态变量可用const,constant或final等关键卖卜字标识,这时其值就会在编译时设定,并且无法在运行时改变。编译器通常将静态常量与孝拿文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区
I. Java中枚举和常量的区别
常量
publicclassConstant{
publicstaticfinalStringCONST_ONE="bb";
publicstaticfinalStringCONST_TWO="cc";
}
常量作为参数时,是String,int等弱类型,开发人员可以传入没有在常量接口里定义的值,这个问题无法通过编译器发现。
由于开发人员可以直接写常量,所以不能用==对比,只能用equals对比,不能优化性能。
开发人员没有参考资料时,不可能知道某个int类型的参数到底应该赋什么内容。
编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译引用常量的贺核类拿或,因为里面存的是旧值。
如果常量类的构造器不私有,无法限制开发员继承/实现接口,开发员能够在子接口里继续添加常量.而这些常量可能得不到祖先层的支持。
枚举常量类
publicclassConstant{
privateStringname;
privateEnumClassA(){
this.name=name;
}
_ONE=newConstant("bb");
_ONE=newConstant("cc");
}
私有构造函数,避免被继承和扩展。
定义方法的参数时,必须用枚举常量类类型,如上面的Constant,这样就转变消拍伍成了强类型,不会出现弱类型引用的问题。
常量值地址唯一,可以用==直接对比,性能会有提高。
编译时,没有把常量值编译到代码里,即使常量的值发生变化,也不会影响引用常量的类。
enum类型
publicstaticenumEnumConstant{
ONE(1),TWO(2),THREE(3);
privateintnum;
EnumConstant(intnum){
this.num=num;
}
publicintgetValue(){
returnnum;
}
}