【问题标题】:java basics about final keyword关于final关键字的java基础
【发布时间】:2009-08-29 14:29:02
【问题描述】:

final 关键字可以用于方法吗?

【问题讨论】:

标签: java methods final


【解决方案1】:

绝对! final 关键字几乎可以应用于任何事物,在每种情况下都意味着“你不能再改变它了”。

以下是应用于...时的含义

变量:您根本无法为变量分配新值(当然,将其呈现为常量

方法:您不能在子类中重新实现(即覆盖)此方法

:不能定义子类

在每种情况下,我们只是表明:一旦声明了这个东西,这就是你将看到的最后一个值(或实现)。

【讨论】:

  • 您应该在答案中添加一个小节,以区分变量指向原始类型与引用类型的情况。这有意义吗?然后我将删除我给你的 -1。
  • 这里没有引用类型和原始类型之间的区别。我假设您是在暗示这样一个事实:即使指向一个的变量是final,引用类型也可能不是不可变的?如果是这样,那超出了原始问题的范围。但是,欢迎您以任何您认为会增强现有答案的方式进行建设性评论。不过,由于此答案已有数年历史,并且迄今为止仅被查看了 528 次,因此我建议您将精力集中在更当前的问题上。
  • 您的回答至少可以说具有误导性。它可能已被 n 人查看 m 次,但这仍然具有误导性。不变性在类设计中占有重要地位。所以这绝对应该被提及。
  • 确实如此! StackOverflow 鼓励增强现有答案的 cmets,我相信未来的读者会欢迎您想添加任何额外的说明。
【解决方案2】:

是的,可以将方法声明为final。这意味着方法不能被其子类覆盖。

来自The Java Language Specifications, Third EditionSection 8.4.3.3

一个方法可以声明为final 防止子类覆盖或 隐藏它。这是一个编译时错误 试图覆盖或隐藏决赛 方法。

更多信息,The Java TutorialsWriting Final Classes and Methods 页面有更多信息。

【讨论】:

    【解决方案3】:

    是的。

    你可以使一个方法最终

    public class A {
       public static final void f() {
          System.out.println("test");
       }
    }
    

    使方法成为最终方法通常有两个原因

    1. 当一个方法是最终的,它“可能”被内联。
    2. 当一个方法是 final 时,该方法是不可能被覆盖的。

    【讨论】:

    • 一个更现实的情况是最终的非静态方法,确定吗?
    【解决方案4】:

    当然可以。使其无法覆盖。

    【讨论】:

      【解决方案5】:

      好的,请查看The Final Word on the Final Keyword

      public abstract class AbstractBase
      {
          public final void performOperation()    // cannot be overridden
          {
              prepareForOperation();
              doPerformOperation();   
          }
      
          protected abstract void doPerformOperation();    // must override
      }
      

      【讨论】:

        【解决方案6】:

        是的。

        最终方法不能被子类覆盖。这通常用于防止子类改变类的关键行为。

        【讨论】:

          【解决方案7】:

          作为其他答案的注释。您可以使用 final。在实践中,我很少看到有人使用它,我不知道为什么。

          这些天我写的很多代码都是为多线程环境而设计的,我倾向于使 final 类成为不可变的(如果它是一个值类),以便它是线程安全的。

          将某些方法标记为最终方法(而不是其他方法)的问题在于,您是在声明该方法有一些特别之处,而其他方法没有什么特别之处。根据我的经验,这很少是人们真正的意思。

          如果一个类是为了继承而设计的,你需要保持它干净并保持它的小,以防止不必要的副作用。所有这一切都取决于您是为自己和团队编写代码,还是为更广泛的受众编写代码 - 即开源项目或商业项目的公共 API。

          【讨论】:

            【解决方案8】:

            是的,final 关键字可以用于方法。它将保持不变性。它可以防止方法之间被破坏。例如,假设 X 类的某个方法的实现假定方法 M 将以某种方式运行。将 X 或 M 声明为 final 将防止派生类重新定义 M 以导致 X 行为不正确。

            【讨论】:

              猜你喜欢
              • 2012-12-30
              • 1970-01-01
              • 2016-08-14
              • 1970-01-01
              • 2016-04-05
              • 2011-06-09
              • 2012-07-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多