黑马程序员技术交流社区

标题: 关于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