Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非继承抽象类的哪个用途?_Java_Oop - Fatal编程技术网

Java 非继承抽象类的哪个用途?

Java 非继承抽象类的哪个用途?,java,oop,Java,Oop,关于非继承抽象类,良好实践告诉我们什么 它们存在于一个不旨在提供API的程序中有什么原因吗?系统地将此类类转换为非抽象类有意义吗?如果是,在哪些情况下?IMHO,它们没有用处,因为它们只能在继承时使用 将它们转换为非抽象类也没有用,因为。。。你没有用它们 抽象类是构建的蓝图,它不应该被实例化。也许某个地方有一个匿名类在扩展它? 但是在那里,意味着它们可以在将来使用,因此删除它们也不是你想要的好主意。简短回答:创建抽象类的唯一原因是继承它们。 注意:这就是为什么我们不能使用摘要和最终关键字的组合

关于非继承抽象类,良好实践告诉我们什么


它们存在于一个不旨在提供API的程序中有什么原因吗?系统地将此类类转换为非抽象类有意义吗?如果是,在哪些情况下?

IMHO,它们没有用处,因为它们只能在继承时使用

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

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

简短回答:

创建
抽象类的唯一原因是继承它们。


注意:这就是为什么我们不能使用
摘要
最终
关键字的组合来创建类或方法的原因,因为
最终
类不能被子类化。

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


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

好吧,
abstract
关键字禁止实例创建(为了创建实例,必须从抽象类继承),但是,抽象类可以有静态方法,例如

  // 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
中不允许抽象最终类
时,在C#
中抽象密封类
静态类

  // C# static == abstract sealed
  public static class MathLibrary {
    // Gamma function 
    public static double Gamma(double value) { ... }
    ...
  }
“非继承抽象类”

这完全违背了抽象类的全部观点。抽象类的概念是作为其他类构建的蓝图

例如,您可以构建一个Car抽象类,然后从该类继承来创建不同的carbrands类,这些类自动拥有Car所拥有的一切,但每个品牌都不同。通过这种方式,您可以避免在每个汽车品牌的汽车中编写本可以在汽车中编写的所有实例变量和方法


还要记住,您不能创建汽车实例,因为汽车不可能没有品牌,所以将汽车抽象化是有意义的。

为什么要否决投票?如果OP提供了来自JavaAPI的有效示例,我想这是一个非常有效的问题。在这个问题上使用Java标记可能是我的错误。实际上,我在元层次上想知道,我不认为这是“在元层次上”可以回答的,因为是特定编程语言的特定语法和语义决定了是否存在抽象类的有效用例,而这些抽象类不是从中继承的。另一点。。。注意不要使用“良好实践”和“最佳实践”之类的术语,您可以将它们视为“待扩展”类。不,它不是要变成具体的类。如果需要,可以对其进行扩展。[技术上可能!=有用]有更好的选择来实现这一点,但这可以被认为是一种好的实践吗?我个人更喜欢使用众所周知的设计模式。这有助于使您的代码干净、结构化,并使其他开发人员更容易理解。所以我个人投票支持模式,而不是抽象类+静态方法。情人眼里出西施,那是行不通的。如果类是抽象的,则不能创建singleton实例。JVM将不允许您使用反射创建抽象类的实例。我不是这么说的!我说过,与其使用静态方法来实现抽象类,不如使用具有singleton/utillity模式的普通类。谢谢你的投票;)这不是我的目标,而是“谢谢你”:祝你今天过得愉快……我从来没有提到最后一个关键词,我只是想知道,在OO程序中没有继承方法的情况下,抽象类的存在告诉了我们什么好的实践?我提到了最后一个关键字来解释抽象类的逻辑:它们必须被扩展,否则就没有存在的意义或理由:)好吧,我明白了:-)这正是我的观点。它完全违背了抽象类的全部观点,所以它可以被认为是一种糟糕的做法吗?