拥有一个没有抽象方法的抽象类有什么意义?

use*_*721 5 java inheritance abstract-class

可以有一个实现其所有方法的抽象类- 其中没有抽象方法.

例如.:

public abstract class someClass { 
    int a; 
    public someClass (int a) { this.a = a; } 
    public void m1 () { /* do something */ } 
    private void m2 () { /* do something else */ }  
}
Run Code Online (Sandbox Code Playgroud)

具有这样一个抽象类的优点(如果有的话)与具体相同的类相比有什么优势呢?

我能想到的是,当我将其声明为抽象时,它将不会被实例化.但是,通过使其具体化并且其构造函数是私有的,我可以产生相同的效果.

TIA.

// ==================

编辑:我能想到的另一个用途:

它可能会扩展另一个抽象类或实现一个接口而不实现该类的抽象方法 - 尽管它正在实现它自己的所有方法.无论它值多少钱.

biz*_*lop 2

它有一个概念意义:这个类有一个本身没有意义的行为。

诚然,如果没有明确定义的扩展点(即抽象方法),很难想象这样的场景,但有时它会是您的问题的相当准确的模型。

你可以有这样的东西:

public abstract class ObjectWithId {
    private final String id;

    public ObjectWithId( String id ) {
       this.id = id;
    }

    public final String getId() {
       return id;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以扩展它来声明具有 id 的不同类型的对象。在这里,您有一个完全指定和实现的行为,但对子类可能表现出的任何其他行为没有限制。

但请注意,对同一事物进行建模的一种更简洁的方法是使用组合而不是继承。

public final class ObjectWithId<T> {
    private final String id;
    private final T ob;

    public ObjectWithId( String id, T ob ) {
       this.id = id;
       this.ob = ob;
    }

    public String getId() {
       return id;
    }

    public T getObject() {
       return ob;
    }
}
Run Code Online (Sandbox Code Playgroud)

但在引入泛型之前(直到 Java 版本 1.4),这不会那么优雅,也不会比抽象类解决方案更好,因为您必须以类型安全为代价。