Java 弦乐

Java 弦乐,java,string,variables,final,Java,String,Variables,Final,以下陈述的区别是什么 String name = "Tiger"; final String name ="Tiger"; 虽然String类是final类,但为什么我们需要创建一个字符串“常量”变量作为final?final在这种上下文中意味着变量名称只能分配一次。再次为其指定不同的字符串对象将导致编译错误 我认为混淆的根源在于final关键字可以在几种不同的上下文中使用: 最终类:该类不能被子类化 final方法:无法重写该方法 最终变量:该变量只能分配一次 有关每种情况的示例,请参

以下陈述的区别是什么

String name = "Tiger";

final String name ="Tiger";

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

final
在这种上下文中意味着变量
名称只能分配一次。再次为其指定不同的
字符串
对象将导致编译错误

我认为混淆的根源在于
final
关键字可以在几种不同的上下文中使用:

  • 最终类:该类不能被子类化
  • final方法:无法重写该方法
  • 最终变量:该变量只能分配一次

有关每种情况的示例,请参见上的维基百科文章。

您将immutable与final混淆了

String与Integer和Long一样,是一个不可变的类,因为内部数据通过封装而不受修改

但是,正如Ayman所说,final指的是指向字符串的指针。

请记住,在本例中,final有两个用途:

  • 这意味着不能将引用设置为另一个字符串——也就是说,您不能随后执行“name=…”
  • 但至关重要的是,这意味着引用被正确地发布到了其他线程中(更多细节请参见链接文章,或Goetz等人的著作《Java并发性的实践》)
    • 在这两种情况下,“final”的意思不同

      String类是final类,这意味着不能从中继承

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

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

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

      但是,是否可以修改特定对象,以及是否可以将不同的对象分配给变量,是完全不同的概念。一个是字符串对象的属性,另一个是字符串变量的属性,它们是对字符串对象的引用。

      请看一看


      如果变量标记为final,则该变量的值不能更改,即与变量一起使用时,final关键字使其成为常量。如果您在编程过程中试图更改该变量的值,编译器将给您一个错误

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


      来源:

      推断字符串对象在默认情况下是最终的,这本身就是一个模糊的语句。Java的基本原理是,如果实例变量不指向内存位置,它就有资格进行垃圾收集。字符串对象也会发生同样的情况。它们是不可变的,但它们的引用可以更改。要r为此,我们可以使用“Final String s1=”Final String“Final关键字将不允许对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.
          }
      
          }
      

      记住,“final”也是关于向其他线程安全发布的(请参见下面的答案)。这里的final指的是被设置为final的字符串,而不是字符串本身。是的,final的语义在并发应用程序中非常重要,而不是在普通Java应用程序中,因为Java程序员倾向于接受易变性。
      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.
          }
      
          }