黑马程序员技术交流社区

标题: 很有趣,你明白吗? [打印本页]

作者: 何洪森    时间: 2012-2-8 23:21
标题: 很有趣,你明白吗?
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就不能在编译期被确定,而只能在运行时被创建了。
作者: 王建雨    时间: 2012-2-9 10:20
不是很理解,LZ的解释很混乱,看不明白。还是请高手解释一下吧。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2