源代码1:
public class Java15 { public static void main(String[] args) { String s1="疯狂java"; String s2="疯狂"+"java"; System.out.println(s1==s2); String str1="疯狂"; String str2="java"; String s3=str1+str2; System.out.println(s1==s3); } }
运行结果:
源代码2:
public class Java15 { public static void main(String[] args) { String s1="疯狂java"; String s2="疯狂"+"java"; System.out.println(s1==s2); final String str1="疯狂"; final String str2="java"; String s3=str1+str2; System.out.println(s1==s3); } }
运行结果:
源代码3:
public class Java15 { public static void main(String[] args) { String s1="疯狂java"; String s2="疯狂"+"java"; System.out.println(s1==s2); final String str1; str1="疯狂"; final String str2; str2="java"; String s3=str1+str2; System.out.println(s1==s3); } }
运行结果:
1.变量在编译时是无法确定的,而常量(直接量在编译时)是确定的;则上面源代码1中s1,s2是可以确定的,它们都指向常量池中的疯狂java,所以s1=s2;而str1,str2由于是变量,它们是不可以确定的,则它们指向就不同了,所以,str2!=str2;
2.在源代码2中由于将str1,str2都用了final修饰,都将他们定义为了宏定义,所以str1,str2将不再是变量;
3.对于final实例变量而言,只有在定义该变量时指定初始值才会有宏变量的效果,由于源代码3中在定义时并没有初始化,所以没有初始化效果,所以此时str1,str2是未知量,所以str1!=str2.
时间: 2024-10-08 03:39:29