当前位置: 技术问答>java相关
高手请进来
来源: 互联网 发布时间:2015-05-12
本文导语: Class A 有一个static final attribute a=1; Class B 使用A的a. 如果编辑Class A,令a=2. 重新编译Class A,而不编译B,结果B的执行过程中 A的a任为1。 为什么会这样? 难道修改一个Class的static 属性,一定要把所有使用到这个C...
Class A 有一个static final attribute a=1;
Class B 使用A的a.
如果编辑Class A,令a=2. 重新编译Class A,而不编译B,结果B的执行过程中 A的a任为1。
为什么会这样?
难道修改一个Class的static 属性,一定要把所有使用到这个Class的Class都重新编译一遍吗?
有什么办法可以解决这个问题吗?或者有什么办法可以避免这种情况的产生吗?
Class B 使用A的a.
如果编辑Class A,令a=2. 重新编译Class A,而不编译B,结果B的执行过程中 A的a任为1。
为什么会这样?
难道修改一个Class的static 属性,一定要把所有使用到这个Class的Class都重新编译一遍吗?
有什么办法可以解决这个问题吗?或者有什么办法可以避免这种情况的产生吗?
|
好像不可以。就麻烦将就着编译吧。
|
似乎是没有什么解决办法。。。。
|
public class A{
public final int i;
A(){i=1;};
}
public class B{
public static void main(String[] args){
A a=new A();
System.out.println(a.i);
}
}
javac A.java
javac B.java
java B
1
public class A{
public final int i;
A(){i=2;};
}
javac A.java
java B
2
至于static就不是问题了,你自己想想该怎么处理吧
public final int i;
A(){i=1;};
}
public class B{
public static void main(String[] args){
A a=new A();
System.out.println(a.i);
}
}
javac A.java
javac B.java
java B
1
public class A{
public final int i;
A(){i=2;};
}
javac A.java
java B
2
至于static就不是问题了,你自己想想该怎么处理吧
|
因为static final的变量,编译的时候是直接将其值代进去编译的,而不是用A.xxx,这个在反编译B的时候就可以看出来
|
同意sojkey(), final类型的primitive变量是按值被编译进class的,而不是按引用,所以你改了A中的i变量并不能改变B的Class. 只有重新编译B,让它再去取一次A的i值。