黑马程序员技术交流社区
标题: 关于final的一个问题 [打印本页]
作者: 原满 时间: 2013-5-31 10:51
标题: 关于final的一个问题
本帖最后由 原满 于 2013-6-1 10:07 编辑
public class FinalTest {
final String str1;
final String str2;
final String str3 = "abc";
{
str1 = "abc";
}
public FinalTest() {
str2 = "abc";
}
public void show() {
System.out.println(str1 + str1 == "abcabc");
System.out.println(str2 + str2 == "abcabc");
System.out.println(str3 + str3 == "abcabc");
}
public static void main(String[] args) {
FinalTest test = new FinalTest();
test.show();
}
}
运行结果:
false
false
true
求解释一下结果。
作者: 夜默 时间: 2013-5-31 11:11
本帖最后由 4968547610317 于 2013-5-31 11:32 编辑
final关键字的应用:当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值.
你的程序中,str1和str2都被final所修饰,构造代码块会先于show方法运行,将值赋给str1和str2。而str3一开始就被赋值.既三个变量都被赋值“abc”。
public void show() {
System.out.println(STR1 + STR1);
System.out.println(STR2 + STR2);
System.out.println(STR3 + STR3);
System.out.println((STR1 + STR1 )==( "abcabc"));
System.out.println((STR1 + STR1 ).equals( "abcabc"));
String s=STR3 + STR3;
System.out.println(s == "abcabc");
System.out.println(STR3 + STR3 == "abcabc");
}
abcabc
abcabc
abcabc
false
true
true
true
由结果可知用==是可以比较的,但是只能是一个固定值跟另一个值比较,里面不能有运算。用equals则没有这种问题
作者: 山鹰 时间: 2013-5-31 11:16
public class FinalText {
final String STR1;//final修饰的是变量是一个常量,字母应该大写
final String STR2;
final String STR3 = "abc";
{
STR1 = "abc";
}
public FinalText() {
STR2 = "abc";
}
public void show() {
System.out.println(STR1 + STR1);
System.out.println(STR2 + STR2);
System.out.println(STR3 + STR3);
System.out.println((STR1 + STR1) .equals("abcabc"));
System.out.println((STR2 + STR2) .equals("abcabc"));
System.out.println((STR3 + STR3) .equals("abcabc"));
}
public static void main(String[] args) {
FinalText test = new FinalText();
test.show();
}
}
结果为:
abcabc
abcabc
abcabc
true
true
true
final修饰的变量是一个常量,常量的字母应该大写
字符串的比较用equals
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |