java - 有一个没有抽象方法的抽象类有什么意义呢?

标签 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 */ }  
}

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

我能想到的一个是,当我将它声明为抽象时,它不会被实例化。 但是,我可以通过将其具体化并将其构造函数设为私有(private)来产生相同的效果。

TIA。

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

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

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

最佳答案

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

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

你可以有这样的东西:

public abstract class ObjectWithId {
    private final String id;

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

    public final String getId() {
       return id;
    }
}

然后您可以扩展它来声明具有 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;
    }
}

但是在引入泛型之前(直到 Java 版本 1.4),这不会像抽象类解决方案那样优雅并且明显更好,因为您必须在类型安全性方面进行交易。

关于java - 有一个没有抽象方法的抽象类有什么意义呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25692811/

相关文章:

c# - 奇怪的继承修改

java - 类中几个方法的强制签名

java - 抽象类以摆脱 Activity 中的冗余代码

java - 错误 :Execution failed for task

java - 在 fragment 之间共享代码

java - 使用 eclipse 中的 rJava/JRI 包时,一些命令在 rtest.java 中失败

java - SAXParser 说 :"java.net.SocketException: Network is unreachable"但 xmlint 或 curl 都可以

C++ 初始化列表忽略调用父类构造函数

c# - 实现抽象方法时更改参数类型

c++ - undefined reference 和非虚拟 thunk