哪个用于非继承的抽象类?

时间:2016-01-28 10:15:54

标签: java oop

良好做法告诉我们有关非继承抽象类的内容是什么?

它们是否有理由存在于不旨在提供API的程序中?将这些类系统地转换为非抽象类是否有意义?如果是这样的话?

5 个答案:

答案 0 :(得分:2)

好吧,abstract关键字禁止创建信息(为了创建一个必须从抽象类继承的实例),然而, abstract 类可以有 static 方法,例如

  // abstract: there's no sence in creating an instance of this class
  abstract class MathLibrary {
    // private: there's no sence in inheriting from this class
    private MathLibrary() {}

    // Gamma function
    public static double gamma(double value) { ... }
    ...
  }

请注意,当不允许使用Java abstract final class时,在C#中abstract sealed classstatic class

  // C# static == abstract sealed
  public static class MathLibrary {
    // Gamma function 
    public static double Gamma(double value) { ... }
    ...
  }

答案 1 :(得分:1)

简答:

用于创建Abstract类的唯一原因继承他们。

注意:这就是为什么我们无法使用abstractfinal关键字的组合创建一个类或方法因为final类不能被子类化。

答案 2 :(得分:0)

恕我直言,他们没有用,因为他们只能在继承时使用。

将它们转换为非抽象类也不会有用,因为......你没有使用它们。

抽象类是构建的蓝图,它不应该被实例化。也许在哪里有一个匿名类扩展它? 但在那里,意味着它们可以在将来使用,所以删除它们可能不是你追求的好主意。

答案 3 :(得分:0)

嗯,实际上对我来说没有理由这样做。 我现在可以想象的任何情况下,最好使用其他方式/设计模式,如单例,实用程序等。

也许你可以使用它们作为模板在运行时通过反射等继承......(但这也是继承)。

答案 4 :(得分:0)

  

“非继承的抽象类”

这完全打败了抽象类的全部观点。抽象类的想法是构建其他类的蓝图。

例如,您可以构建一个Car抽象类,然后从该类继承以创建不同的Car Brands类,这些类会自动拥有Car所拥有的所有内容,但每个Brand都不同。这样,您就可以避免在每个汽车品牌中编写可以在Car中编写的所有实例变量和方法。

另外请记住,你不能创建一个Car实例,因为它不可能让一辆车没有品牌,所以让Car抽象是有意义的。