public class FinalTest1
{
public static final String X;
public static final String Y;
static
{
X = "ab";
Y = "cd";
}
public static void main(String[] args)
{
String a = "abcd";
String b = X + Y;
if (a == b)
System.out.println("a等于b,它们是同一个对象");
else
System.out.println("a不等于b,它们不是同一个对象);
}
}
运行结果 a不等于b,它们不是同一个对象
public class FinalTest2
{
public static final String X = "ab";
public static final String Y = "cd";
public static void main(String[] args)
{
String a = "abcd";
String b = X + Y;
if (a == b)
System.out.println("a等于b,它们是同一个对象");
else
System.out.println("a不等于b,它们不是同一个对象");
}
}
运行结果 a等于b,它们是同一个对象
public static final String X;
public static final String Y;
static
{
X = "ab";
Y = "cd";
}
public static void main(String[] args)
{
String a = "abcd";
String b = X + Y;
if (a == b)
这 段代码 之所以输出a不等于b,它们不是同一个对象就是因为abcd值位置的原因。在这段代码中
public static final String X;
public static final String Y;
static
{
X = "ab";
Y = "cd";
} 这 是一个独立的封装好了放在主函数里面的功能,而后面b=x+y是调用的这个功能
而a=abcd是直接赋值的与这个功能无关。也可以说是主函数中两个无关的值 做比较所以会输出
a不等于b,它们不是同一个对象
和 {
public static final String X = "ab";
public static final String Y = "cd";
public static void main(String[] args)
{
String a = "abcd";
String b = X + Y;
if (a == b)
System.out.println("a等于b,它们是同一个对象");
else
System.out.println("a不等于b,它们不是同一个对象");
}
而这段代码看起来和上面是一样的但是他们却大有区别。。在这段代码中X,Y只是这个主函数中的两个常量,
也可以说是直接给x.y赋的一个常量值吧。而a=abcd也是给a赋的一个变量值为abcd而b=x+y为加学运算,所以两个值都是abcd
但是因为是在一个主函数内而且是在同一个范围内相同的值。所以a==b所以输出 a等于b,它们是同一个对象
有不对的地方希望大家可以提出来 继续 改进。这个因为表达能力欠佳确实不知道怎么说,
public class FinalTest2
{
public static final String X = "ab";
public static final String Y = "cd";
public static String b = X + Y; //将b提取出来
public static void main(String[] args)
{
String a = "abcd";
if (a == b)
System.out.println("a等于b,它们是同一个对象");
else
System.out.println("a不等于b,它们不是同一个对象");
}
}
结果依然是相同
public class FinalTest1
{
public static final String X;
public static final String Y;
static
{
X = "ab";
Y = "cd";
}
public static String b = X + Y; //将b提取出来
public static void main(String[] args)
{
String a = "abcd";
if (a == b)
System.out.println("a等于b,它们是同一个对象");
else
System.out.println("a不等于b,它们不是同一个对象"+a+b);
}
}
结果依旧是不同
那这个静态的X和Y在内存是怎么存的呢?
静态在加载函数的时候已经加载进内存了,封装起来的
static
{
X = "ab";
Y = "cd";
}
也是静态的啊,加载进内存的时候是什么样的啊,还有,到底是什么时候调用的X = "ab" ,Y = "cd"和b=X+Y的呢?是在a=“abcd”之后吗?
b=X+Y不也是在常量池里创建了一个“abcd”对象吗?这个对象和a=“abcd”为什么不能一样呢?
在{}里定义的字符串也是从常量池里取出来的,那么调用b=X+Y,不也应该是把常量池中的字符串相加变成“abcd”的吗?
public class FinalTest3
{
public static final String X;
static
{
X = "ab"; //常量池中的“ab”
}
public static void main(String[] args)
{
String a = "ab"; //建立a=常量池中的“ab”
if (a == X)
System.out.println("a等于X,它们是同一个对象");
else
System.out.println("a不等于X,它们不是同一个对象");
}
}
运行结果是a等于x ,这是为什么啊?