由以下的问题引出了另外有关创建对象的问题:
String s = new String("xyz");创建了几个String Object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
以下这三道题出自于http://zangweiren.iteye.com/blog/209895?page=4#comments讨论,为了以后方便看,借用整理了一下:
/**
字符串测试题1
@author Eastsun
*/
public class StrTest1 {
static String s1 ="Hello,";
static String s2 ="World";
public static void main(String[] args){
String s3 = s1 + s2;
String s4 ="Hello,World";
System.out.println(s3==s4);
}
}
/**
字符串测试题2
@author Eastsun
*/
public class StrTest2 {
final static String s1 ="Hello,";
final static String s2 ="World";
public static void main(String[] args){
String s3 = s1 + s2;
String s4 ="Hello,World";
System.out.println(s3==s4);
}
}
/**
字符串测试题3
@author Eastsun
*/
public class StrTest3 {
final static String s1;
final static String s2;
static {
s1 ="Hello,";
s2 ="World";
}
public static void main(String[] args){
String s3 = s1 + s2;
String s4 ="Hello,World";
System.out.println(s3==s4);
}
}
解答分析
第一题:
s1和s2都是变量,因此它们通过“+”运算得出的s3的值在编译期无法确定,只能在运行时确定。因为在运算出s3的值之前,s1和s2的值都有可能被其他类的方法改变,因此s3是运行时新建的对象,和s4不是一个,因此输出false。
第二题:
s1和s2都是以确定的常量,因此s3的值在编译期已经确定,它只能是“Hello,World”,因此s3的定义等同于:
String s3="Hello,World";
故s3和s4是同一个对象,程序输出结果为true。
第三题:
s1和s2虽然被定义为常量(只能被赋值一次),但是它们都没有马上被赋值。在运算出s3的值之前,他们何时被赋值,以及被赋予什么样的值,都是个变数。因此s1和s2在被赋值之前,性质类似于一个变量。参照第一题的理论,输出结果应为false。