A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何洪森 黑马帝   /  2012-2-8 23:21  /  1848 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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就不能在编译期被确定,而只能在运行时被创建了。

1 个回复

倒序浏览
不是很理解,LZ的解释很混乱,看不明白。还是请高手解释一下吧。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马