【问题标题】:Is final String s = "Hello World" same as String s = "Hello World"?final String s = "Hello World" 和 String s = "Hello World" 一样吗?
【发布时间】:2014-07-24 08:42:17
【问题描述】:

如果一个类被定义为final,并且我们声明了一个最终类的实例......这会有什么不同吗?还是final 在这种情况下是多余的?

final String s = "Hello World" 

一样
String s = "Hello World"

【问题讨论】:

  • final 在一个类上和final 在一个变量/字段上是两个不同的东西
  • 只有引用是最终的,但根据 String 类,String 对象也是最终的。
  • 最终类 - 没有子类。最终变量/字段 - 您只能为其赋值一次。最终方法 - 没有覆盖。所以 java 中的 final 与 c 中的 const 或您可能听到的任何其他常量完全不同。

标签: java string class final


【解决方案1】:

当你在变量上使用final时,意味着它不能被重新赋值。考虑以下示例:

public class FinalExample {
    private final String a = "Hello World!"; // cannot be reassigned
    private String b = "Goodbye World!"; // can be reassigned

    public FinalExample() {
        a = b; // ILLEGAL: this field cannot be re-assigned
        b = a; 
    }

    public static void main(String[] args) {
        new FinalExample();
    }
}

如果你尝试运行它,你会在a=b得到一个错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The final field FinalExample.a cannot be assigned

    at FinalExample.<init>(FinalExample.java:7)
    at FinalExample.main(FinalExample.java:12)

现在,我想您想知道在 String 数据类型前面是否有 final 是否重要。尽管您可能听说String 是不可变的,但您仍然可以将String s = "Hello World!"; 之类的内容重新分配给另一个字符串值。这种区别是由于您实际上将String s 的引用重新分配给了一个新字符串。因此,以下是有效的:

String s = "Hello World";
s = "Goodbye World!";
System.out.println(s);

Output: Goodbye World!

但您可以使用final 声明来防止这种变化:

final String s = "Hello World";
s = "Goodbye World!";
System.out.println(s);

Output: 
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The final local variable s cannot be assigned. It must be blank and not using a compound assignment

如果您想确保没有人可以更改您的String 引用,那么final 声明非常有用。您也可以将 final 用于其他数据类型,以防止 reference 被更改。

【讨论】:

    【解决方案2】:

    final 变量不能绑定到另一个实例,所以这是无效的:

    final String s = "123";
    s = "234"; // doesn't work!
    

    final 类不能扩展

    final class A {
    }
    
    class B extends A { // does not work!
    }
    

    不要将这两者与immutable 类混淆(如String)。不可变类的实例不会改变它们的状态。 (不可变类没有直接的语言支持,但实际上大多数时候不可变类的所有属性都被声明为最终属性。)

    【讨论】:

      【解决方案3】:
      变量上的

      final与类是否为final无关

      final String s = "Hello World";
      s = "Goodbye";  // illegal
      
      String s2 = "Hello World";
      s2 = "Goodbye";  // legal
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 2012-06-05
        • 2013-11-25
        • 2016-06-01
        • 1970-01-01
        • 2012-01-04
        • 2014-10-15
        相关资源
        最近更新 更多