【问题标题】:Can an abstract class have a final method?抽象类可以有最终方法吗?
【发布时间】:2010-11-20 22:15:38
【问题描述】:

Java 中的抽象类可以有 final 方法吗?

【问题讨论】:

    标签: java abstract-class final


    【解决方案1】:

    是的,这些方法不能在子类中被覆盖。一个例子就是模板方法模式......

    【讨论】:

    • 你应该给出更多的解释。模板方法并不意味着最终,虽然它确实让生活更简单。
    • 好吧,强烈推荐 final :) 我认为不使用 final 作为模板方法是错误的......
    【解决方案2】:

    是的,它可以...需要更多字符

    【讨论】:

      【解决方案3】:

      当然,这意味着你可以继承它,但你不能覆盖那个特定的方法。

      【讨论】:

        【解决方案4】:

        是的。 abstract 修饰符可以省略类的某些实现(即有一些 abstract 方法),但不会对您施加任何限制。

        【讨论】:

          【解决方案5】:

          是的。

          提示:只需启动您最喜欢的 IDE(eclipse、netbeans 等)并尝试一下。如果它不起作用,它会抱怨。

          【讨论】:

          • -1。 SO的重点不是告诉人们“自己尝试”。如果每个在互联网上搜索这个问题的人都必须启动一个 IDE 并在有人可以为这个问题提供完整和全面的答案时亲自尝试,那是浪费精力和时间:stackoverflow.com/questions/1299398/1299434#1299434
          • 是的,你的权利,我接受反对票,但这是 keyur 关于抽象类的第三个琐碎问题,所以我豁免了。
          • @Andreas_D:我错过了 keyur 就同一主题提出了很多问题,我已经看到了足够多的“你为什么不自己尝试一下”的答案和 cmet 今天早上我有点反应反对票太快了。我已将其删除(这是否意味着您可以恢复您的代表?)因为您的答案实际上并不正确。
          • @Andreas_D:寻找在抽象类中使用 final 方法的不同方面、原因和解释的人,例如via Google 并不真正关心 keyur 的其他问题(我也不关心),因此仅仅为了“惩罚” OP(指其他愚蠢的问题)而给出不必要的讽刺答案并不是一个好点。这些“自己尝试”的答案根本没有帮助。还要考虑那些只想(快速)知道答案或当时没有机会尝试(坐在公共汽车上,使用手机)的人。顺便说一句,这个问题不是“微不足道的”。 -1,对不起。
          • @Sk8erPeter - 你看过那个问题的日期吗?它已经 4 岁了,keyur 已经消失(灰色),如果它出现在这几天会立即关闭 :) 看看我对第一次反对票的评论,这解释了这个问题的全部;)
          【解决方案6】:

          当然。以Template method pattern 为例。

          abstract class Game
          {
              protected int playersCount;
          
              abstract void initializeGame();
          
              abstract void makePlay(int player);
          
              abstract boolean endOfGame();
          
              abstract void printWinner();
          
              /* A template method : */
              final void playOneGame(int playersCount) {
                  this.playersCount = playersCount;
                  initializeGame();
                  int j = 0;
                  while (!endOfGame()) {
                      makePlay(j);
                      j = (j + 1) % playersCount;
                  }
                  printWinner();
              }
          }
          

          扩展 Game 的类仍然需要实现所有抽象方法,但它们无法扩展 playOneGame,因为它被声明为 final。

          抽象类也可以有既不是抽象也不是最终的方法,只是常规方法。这些方法必须在抽象类中实现,但由实现者决定扩展类是否需要覆盖它们。

          【讨论】:

          • 太棒了!支持提出模板方法模式
          • 但它的用途是什么
          • @Bill the Lizard:很好的答案!但我有一个问题:如果 playOneGame() 方法是正常的(不是最终的)怎么办。是一样的吗?在这里使用 final 而不是不使用任何关键字有什么好处?谢谢
          • @BilltheLizard:谢谢,但我没有发现使用 final 关键字比不使用任何关键字有什么优势。
          【解决方案7】:

          是的,可以。但是final方法本身不能是abstract(同一个类中的其他非final方法可以)。

          【讨论】:

            【解决方案8】:

            是的。

            【讨论】:

            • 当用户本身也太懒时,变得懒惰并只回答是和否是好的。我认为您的回答值得我喜欢。
            【解决方案9】:

            抽象类中的方法可以定义也可以不定义。如果我们扩展抽象类,那么只有它才有意义,所以我们在 Abstract 中声明或定义的任何方法都将在子类中覆盖。所以我们可以在抽象类中声明一个方法为final,在子类中它会被覆盖。

            【讨论】:

            • 我明白你在这里想说什么,但请编辑你的答案,因为现在非常不清楚。
            【解决方案10】:

            是的,“抽象”类中可能有“最终”方法。 但是,类中的任何“抽象”方法都不能声明为最终方法。 它会给出“修饰符的非法组合:abstract and final”错误。

            public abstract final void show();
                illegal combination of modifiers: abstract and final
            

            这是实现的工作示例。

            abstract class Sian                 //ABSTRACT CLASS
            {
                public final void show()        // FINAL METHOD
                {
                     System.out.println("Yes");
                }
                public void display()
                {
                     System.out.println("Overriding");
                }
                public abstract void success();
            }
            class Ideone extends Sian               //INHERTING ABSTRACT CLASS
            {
                public void display()
                {
                    System.out.println("Overridden");
                }
                public void success()               //OVERRIDING THE ABSTRACT METHOD
                {
                    System.out.println("Success overriding");
                }
                public static void main (String[] args) throws java.lang.Exception
                {
                    Ideone id = new Ideone();       //OBJECT OF SUBCLASS
                    id.show();                      //CALLING FINAL METHOD
                    id.display();                   //OVERRIDDEN METHODS
                    id.success();
                }
            }
            

            输出:-

            Yes
            Overridden
            Success overriding
            

            这里是ideone链接:-http://ideone.com/G1UBR5

            【讨论】:

              【解决方案11】:

              假设我想设计一个有一些实现的类,但我不希望其他(子类)实现它而是其他方法,那么在这种情况下,我们需要一个最终实现的方法和明显的选择抽象类。

              【讨论】:

                【解决方案12】:

                是的,我们可以编写带有实现的最终方法。

                public abstract class AbstractWithfinalMethod {
                  public static  final boolean m1() {
                    System.out.println(" M1 method executed");
                    return true;
                  }
                
                  public static void main(String[] args) {
                    System.out.println(m1());
                  }
                }
                

                输出: 执行的 M1 方法 真的

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-11-16
                  • 1970-01-01
                  • 2018-05-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-02-17
                  相关资源
                  最近更新 更多