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.
}
}