字符串和最终

时间:2009-05-17 16:52:56

标签: java string variables final

以下陈述之间有什么区别

String name = "Tiger";

final String name ="Tiger";

虽然String类是final类,为什么我们需要创建一个String“CONSTANT”变量作为final?

7 个答案:

答案 0 :(得分:52)

此上下文中的

final表示变量name只能分配一次。再次为其分配不同的String对象会导致编译错误。

我认为这里混淆的原因是final关键字可以在几个不同的上下文中使用:

  • final class:该类不能被子类化。
  • 最终方法:无法覆盖该方法。
  • 最终变量:该变量只能分配一次。

有关每个案例的例子,请参阅final in Java上的维基百科文章。

答案 1 :(得分:4)

“final”在两种情况下意味着不同。

java.lang.String类是final。这意味着你不能继承它。

变量“name”是final,这意味着您无法将其更改为指向不同的String实例。因此,非最终的String变量不是常量,因为您可以在两个不同的时间读取它并获得不同的值。

碰巧,Java字符串对象也是不可变的。这意味着您无法修改特定String对象表示的值。将其与数组进行比较 - 您可以使用不同的对象替换数组对象的第一个元素,但不能使用不同的char替换String对象的第一个字符。这就是String.replace()返回一个新字符串的原因 - 它不能修改旧字符串。

String是final的一个原因是防止实现可变行为的String子类的实例代替String传递。

但是,您是否可以修改特定对象,以及是否可以为变量分配不同的对象,这些概念完全不同。一个是String对象的属性,另一个是String变量的属性,它们是对String对象的引用。

答案 2 :(得分:2)

请记住Java final keyword在这种情况下有两个目的:

  • 表示引用不能设置为另一个字符串 - 即您随后不能执行“name = ...”;
  • 但至关重要的是,这意味着正确发布到其他线程(有关详细信息,请参阅链接文章,或Goetz等人的着作“Java Concurrency in Practice”。

答案 3 :(得分:2)

查看The final word on the final keyword

String name = "scott";
name = "tiger"; // OK

final String gender = "male";
gender = "female"; // won't compile you cannot reassign gender cause it's final

答案 4 :(得分:1)

你对最终的不可改变感到困惑。

字符串,如Integer和Long,是一个不可变类,因为内部数据通过封装得到保护,不会被修改。

然而,就像Ayman所说,final指的是指向字符串的指针。

答案 5 :(得分:0)

如果变量标记为 final ,则无法更改该变量的值,即最终关键字与变量一起使用时会使其成为常量。如果您尝试要在程序过程中更改该变量的值,编译器会给你一个错误。

注意:              如果将引用类型的变量标记为final,则该变量不能引用任何其他对象。但是,您可以更改对象的内容,因为只有引用本身是最终的。

消息来源:Final Keyword in Java

答案 6 :(得分:0)

要推断默认情况下String对象是Final,本身就是一个模糊的语句。 Java的基础知识规定,如果实例变量未指向内存位置,则它有资格进行垃圾回收。 String对象也会发生相同的情况。它们是不可变的,但是它们的引用可以更改。为了克服这个问题,我们可以使用“ Final String s1 =” Final String“”,最终关键字将不允许对s1进行任何赋值,除非在首次声明时,使其真正不可变。

public class DemoStringF 
{
    String s1; //Declaring an Instance Variable to type String. 

    public static void main(String... args)
    {
        DemoStringF d = new DemoStringF ();
        d.s1 = "Intializing s1 here"; //Initializing the s1

          System.out.println("Value ref. by s1 is " +d.s1); //Displays the String 
                                                            by which s1 is 
                                                            initialized.

         System.out.println("Value of s1 is " +d.s1.hashCode()); //Displays the 
                                                                 value of the s1.

         d.s1 = d.s1.concat(" Adding String to s1"); //Changing the value ref. by 
                                                       s1.
        System.out.println("Value ref. by s1 after concat() is " +d.s1); 
                                                    //Displays a new value of s1.


        System.out.println("Value of s1 is " +d.s1.hashCode()); //Displays 
                                                            the value of the s1.
    }

    }

enter image description here