【问题标题】:Defining an abstract class without any abstract methods定义一个没有任何抽象方法的抽象类
【发布时间】:2011-06-16 05:59:26
【问题描述】:

我可以在不添加抽象方法的情况下定义抽象类吗?

【问题讨论】:

  • 装饰器模式中有一个很好的例子,见hereWindowDecoratorCoffeeDecorator 都是 abstract 类,但都不包含 abstract 方法。

标签: java class inheritance methods abstract


【解决方案1】:

其实抽象类没有抽象方法是没有意义的。抽象类就像一个父亲。这个父亲有一些属性和行为,当你作为孩子想做父亲的孩子时,父亲说孩子(你)必须这样,是我们的MOTO,如果你不想做,你不是我的孩子。

【讨论】:

    【解决方案2】:

    你可以,我心中的问题是你应该更多。从一开始,我就会说没有硬性和快速的答案。为您当前的情况做正确的事。

    对我来说,继承意味着“is-a”关系。想象一个狗类,它可以通过更专业的子类型(Alsatian、Poodle 等)进行扩展。在这种情况下,将狗类抽象化可能是正确的做法,因为子类型是狗。现在让我们假设狗需要项圈。在这种情况下,继承没有意义:在狗和项圈之间建立“is-a”关系是无稽之谈。这绝对是一种“有”的关系,衣领是一个合作对象。将项圈抽象为狗可以拥有一个是没有意义的。

    我经常发现没有抽象方法的抽象类实际上是在表达一种“有”的关系。在这些情况下,我通常发现不使用继承可以更好地分解代码。我还发现没有抽象方法的抽象类通常是代码异味,至少应该会导致代码审查中提出问题。

    同样,这完全是主观的。在某些情况下,没有抽象方法的抽象类是有意义的,这完全取决于解释和证明。为您正在从事的工作做出最佳决定。

    【讨论】:

      【解决方案3】:

      当然。

      声明一个类抽象只意味着你不允许它自己实例化。

      声明方法抽象意味着子类必须提供该方法的实现。

      这两个是独立的概念,但显然你不能在非抽象类中拥有抽象方法。您甚至可以使用 final 方法创建抽象类,但不能反过来。

      【讨论】:

        【解决方案4】:

        是的,我们可以声明一个没有任何抽象方法的抽象类。将类声明为抽象的目的不是实例化该类。

        那么两种情况

        1) 带有抽象方法的抽象类。

        这些类型的类,我们必须从这个抽象类继承一个类,并且必须覆盖我们类中的抽象方法, 例如:GenricServlet 类

        2) 没有抽象方法的抽象类。

        这些类型的类,我们必须从这个抽象类继承一个类, 例如:HttpServlet 类 这样做的目的是,如果你不在子类中实现你的逻辑,你可以获得父逻辑

        please check the HttpServlet source code

        【讨论】:

          【解决方案5】:

          是的,你可以定义一个没有抽象方法的抽象类。但是,如果内部没有方法,则最好使用接口

          【讨论】:

          • 占用最少 30 个字符限制的好主意。
          • 如果没有抽象方法,那么如何使用接口呢?接口默认所有方法都是抽象的。
          【解决方案6】:

          是的,你可以。有时您可能会被问到这个问题,这样做的目的是什么? 答案是:有时我们必须限制类自己实例化。在这种情况下,我们希望用户扩展我们的抽象类并实例化子类

          【讨论】:

            【解决方案7】:

            是的,你可以创建没有任何抽象方法的抽象类,没有抽象方法的抽象类最好的例子是 HttpServlet
            抽象方法是一种没有主体的方法,如果您在类中声明了至少一个方法,则该类必须声明为抽象类,但如果您声明了抽象类,则它不是强制在类中声明抽象方法。

            你不能创建抽象类的对象,这意味着它不能被实例化。

            【讨论】:

              【解决方案8】:

              是的,你可以这样做。

              声明类抽象意味着该类不会被任何其他类实例化。

              其中应该至少有一个抽象方法,其含义是,如果您没有声明方法,则可以在该类中声明抽象方法。

              示例:

              public abstract class abs {
              
                  protected int cx = 0, cy = 0;
              
                  public void p() {
                      System.out.print("hello");
                  }
              }
              

              这肯定会奏效。

              【讨论】:

                【解决方案9】:

                是的,我们可以有一个没有抽象方法的抽象类,因为它们都是独立的概念。声明一个类抽象意味着它不能被自己实例化,只能被子类化。声明方法抽象意味着 Method 将在子类中定义。

                【讨论】:

                • 为什么我不希望该类不能被实例化?有什么好的理由,例如?
                【解决方案10】:

                是的,你可以。 java中使用的抽象类表示您不能创建该类的对象。以及子类必须为该方法提供实现的抽象方法。

                所以你可以很容易地定义一个没有任何抽象方法的抽象类。

                例如:

                public abstract class AbstractClass{
                
                    public String nonAbstractMethodOne(String param1,String param2){
                        String param = param1 + param2;
                        return param;
                    }
                
                    public static void nonAbstractMethodTwo(String param){
                        System.out.println("Value of param is "+param);
                    }
                }
                

                这很好。

                【讨论】:

                  【解决方案11】:

                  是的,您可以声明一个您不能仅使用已经实现的方法自行实例化的类。如果您想在将来添加抽象方法,或者如果您不希望直接实例化该类(即使它没有抽象属性),这将很有用。

                  【讨论】:

                  • 问题不在于空的抽象类,而只是没有抽象方法的抽象类。据我所知,使用完全空的抽象类没有正当理由。
                  • 答案已修复。如果您有充分的理由希望稍后添加抽象方法并且不必处理重构任何其他父类,则使用空抽象类可能会很有用。
                  • 在层次结构的中间,如果该类的派生与父级的其他派生具有不同的合同义务,则完全空的(继承规范除外)抽象类可能有意义。
                  【解决方案12】:

                  是的,你可以做到。你为什么不尝试这样做呢?

                  【讨论】:

                  • 这不仅仅是 OP。看看这个问题得到的所有支持!
                  • @karim79 不需要高大的马和所有那些倒酱油的东西。尝试并不能完全揭示为什么允许它,而询问它可能会。
                  • @bizclop - 亲自尝试可能会产生一个更有成效的问题。没有高马。这很简单。他的问题是“我可以吗?”而不是“为什么会这样……”。
                  • 如果可以用简单的是或否来回答问题,那么提问者应该考虑改写,使用谷歌,或者只是尝试一下。
                  • @karim79 是的,这个问题本来可以用更好的措辞来表达的,但我想向前迈出一步并不需要太多的努力。
                  猜你喜欢
                  • 2014-10-30
                  • 2017-04-10
                  • 1970-01-01
                  • 2011-07-10
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-03-12
                  • 2012-10-22
                  相关资源
                  最近更新 更多