public class StringStaticTest {
public static final String A ="a";
public static final String B ="b";
public static void main(String args[]){
String s1 = A+B ;
String s2 = "ab" ;
if(s1==s2){
System.out.println("s1等于s2,它们是同一个对象") ;
}else{
System.out.println("s1等于s2,它们不是同一个对象") ;
}
}
}
这段代码的运行结果如下:
1、s1等于s2,它们是同一个对象
这又是为什么呢?原因是这样的,对于常量来讲,它的值是固定的,因此在编译期就能被确定了,而变量的值只有到运行时才能被确定,因为这个变量可以被不同的方法调用,从而可能引起值的改变。在上面的例子中,A和B都是常量,值是固定的,因此s的值也是固定的,它在类被编译时就已经确定了。
public class StringStaticTest {
public static final String A ;
public static final String B ;
static {
A ="a" ;
B ="b" ;
}
public static void main(String args[]){
String s1 = A+B ;
String s2 = "ab" ;
if(s1==s2){
System.out.println("s1等于s2,它们是同一个对象") ;
}else{
System.out.println("s1等于s2,它们不是同一个对象") ;
}
}
}
它的运行结果是这样:
1、s1不等于s2,它们不是同一个对象
只是做了一点改动,结果就和刚刚的例子恰好相反。我们再来分析一下。A和B虽然被定义为常量(只能被赋值一次),但是它们都没有马上被赋值。在运算出s的值之前,他们何时被赋值,以及被赋予什么样的值,都是个变数。因此A和B在被赋值之前,性质类似于一个变量。那么s就不能在编译期被确定,而只能在运行时被创建了。 |
|