Java 在抽象类中创建方法,而不是在扩展它的类中重写它们,这是一种好的做法吗?

Java 在抽象类中创建方法,而不是在扩展它的类中重写它们,这是一种好的做法吗?,java,inheritance,methods,abstract,Java,Inheritance,Methods,Abstract,我有一个问题 我应该在抽象类中创建getter和setter方法吗?下面的示例包含抽象类中的这些方法,抽象类由单个类扩展。在抽象类中有不同的方法是一种好的实践吗?我应该在单个类中重写这些方法吗?但是,覆盖这些属性对我来说没有意义,因为它们不会做任何不同的事情,只是设置和获取不同的属性。有什么建议吗 public abstract class Human { private String name; private String surname; public Human

我有一个问题

我应该在抽象类中创建getter和setter方法吗?下面的示例包含抽象类中的这些方法,抽象类由单个类扩展。在抽象类中有不同的方法是一种好的实践吗?我应该在单个类中重写这些方法吗?但是,覆盖这些属性对我来说没有意义,因为它们不会做任何不同的事情,只是设置和获取不同的属性。有什么建议吗

public abstract class Human {
    private String name;
    private String surname;

    public Human(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }
}


public class Individual extends Human{
    private String dob;

    public Individual(String name, String surname, String dob) {
        super(name, surname);
        this.dob = dob;
    }

    public String getDob() {
        return dob;
    }

    public void setDob(String dob) {
        this.dob = dob;
    }

    public void viewIndividual(){
        System.out.println("First name of individual is: " + getName());
        System.out.println("Surname of individual is: " + getSurname());
        System.out.println("Date of birth of individual is: " + getDob());
    }
}
我应该在抽象类中创建getter和setter方法吗

是的,如果一个方法对于一个抽象类的大多数预期实现是通用的,那么在抽象类中实现这些方法是非常好的。如果为
人的属性设置getter和setter真的很好,那么很难说。您当前使用它的方式没有多大意义,因为您在一个类中混合了行为方面(viewIndividual)和数据方面(getter和setter)。考虑到上面的代码,您可以在抽象类中使用受保护的成员,并可能使用setter来避免实现中的代码重复。但是,如果您想将对象用作JavaBean,这很好

在抽象类中有不同的方法是一种好的实践吗

你是说抽象方法和非抽象方法?是的,这很标准。举个例子:

public abstract class Example {

  public final void publicMethod() {
    // do some preparations
    internalMethod();
    // do some cleanup
  }

  protected abstract void internalMethod();
}
Example
实现的使用者将只能访问
publicMethod
,并保证执行所有需要的准备和清理任务,而不会在
Example
实现中反复重复此代码,因为只需覆盖
internalMethod

我应该在单个类中重写这些方法吗

不,绝对不是。至少只要不向方法添加额外的功能,就不应该仅仅为了在可实例化类中实现抽象方法而重写抽象方法


一般来说,如果在深层类型层次结构中实现某些东西,您应该小心继承,因为代码往往变得很难理解。IMHO层次结构开始变得难以使用,层次结构级别已经为4-5,但这可能是基于大量意见的。有一条规则是,优先选择组合而不是继承,以避免对简单的实用工具过度使用继承。

这是可以的。但抽象类的要点是至少要有一个抽象方法。这正是抽象类的要点(与接口相反),您可以定义一些不必重写的方法。抽象类的子类必须实现(重写)其抽象超类的所有抽象方法。超类的非抽象方法是按原样继承的。如果需要的话,它们也可以被重写。让getter和setter处于一个周期是不好的做法。你把你的类当作一堆愚蠢的数据。根据对象的行为来思考对象。在您的情况下,您应该能够打印个人
。也许这就是它能做的,没关系。为什么您需要能够更改每个字段?如果您认为抽象类的某些默认方法不应该被重写,您可以将它们设置为final。该类的其他实现当然会使用/访问这些方法,但不能覆盖它们。