从java中的抽象类扩展一个类?

时间:2014-01-27 10:11:07

标签: java java-ee-7

我在java抽象类下面。

public abstract class Base implements Serializable {


    private static final long serialVersionUID = 2602178514139825116L;

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


}

MainRequest.java

public class MainRequest extends Base {

    te static final long serialVersionUID = -1724534962722346709L;


    private String key;
    private String name;


    public MainRequest(String id){
        super.setId(id);
    }

    public MainRequest(String key, String name){
        this.key = key;
        this.name = name;
    }

    public String getKey() {
        return key;
    }


    public String getName() {
        return name;
    }


}

我的MainRequest .java班级是否正确?我还需要调用超类构造函数吗?对MainRequest.java的任何改进?

谢谢!

5 个答案:

答案 0 :(得分:1)

对于这种情况Base,无需abstract类,只需使用interface

答案 1 :(得分:1)

在MainRequest(String key,String name)构造函数中,不需要使用super()构造函数。 您没有使用默认构造函数MainRequest(){},因此在参数化构造函数中提供super()是jre的责任。 你使用了serializable接口,它没有abstruct方法,所以在实现这个接口时,没有必要定义那个接口的abstruct方法。因为,它什么都没有。 (它被称为标记接口,旨在完成IO操作时的某些任务)。如果你没有在参数构造函数中传递id值,那么jre.default值的默认值int将为0.任何问题?

答案 2 :(得分:0)

有一点似乎很奇怪。如果你的晚餐类有id属性,它似乎是所有智慧的用途。没有它,创建一个子类是不好的。所以将它添加到其他构造函数中:

public MainRequest(String id, String key, String name){
    super.setId(id);
    this.key = key;
    this.name = name;
}

答案 3 :(得分:0)

改进将是:

  • 实现Base(String id)之类的构造函数,并从MainRequest类中调用它,因此Base的每个子类都必须具有id值。

    public Base(String id) {
        this.id = id;
    }
    
  • 考虑在final类的id成员变量上使用Base并删除setId方法。在大多数情况下,你真的不想设置两次id,是吗?

    private final String id;
    
  • 使MainRequest(String id, String key, String name)之类的构造函数一次性设置所有内容,如:

    public MainRequest(String id, String key, String name) {
        super(id);
        this.key = key;
        this.name = name;
    }
    
  • 使用abstract类很好,因为你正在实现getId方法并且有一个构造函数但根本不想实例化这个基类。
  • 如果您只想在构造函数中设置一次这些变量,可以在finalkey成员上添加name关键字(假设,因为您已经拥有没有setter方法):

    private final String key;
    private final String name;
    
  • 在您的问题中发布工作代码(请参阅te => private

  • 将问题提交至https://codereview.stackexchange.com/:)

当然,有些要点取决于你真正想做的事情!但你没有说出你的意图的一些细节!

答案 4 :(得分:0)

为什么你把Class Base作为抽象? 由于您没有任何抽象方法,因此不需要该类是抽象的。