Java 应该继承包私有字段还是在所有子类中创建私有字段?

Java 应该继承包私有字段还是在所有子类中创建私有字段?,java,inheritance,private,Java,Inheritance,Private,我很难理解某些类字段的继承。 如果一个字段在所有子类中都存在,但在所有子类中都不同,我应该如何编写它 我应该这样编码: class Product { private String name; double tax; Product(String name) { this.name = name; } } class CarProduct extends Product { CarProduct(String name) {

我很难理解某些类字段的继承。 如果一个字段在所有子类中都存在,但在所有子类中都不同,我应该如何编写它

我应该这样编码:

class Product {
    private String name;
    double tax;

    Product(String name) {
        this.name = name;
    }
}

class CarProduct extends Product {
    CarProduct(String name) {
        super(name);
        this.tax = 0.2;
    }
}

class PharmacyProduct extends Product {
    PharmacyProduct(String name) {
        super(name);
        this.tax = 0.05;
    }
}
还是像这样?哪个更正确

class Product {
    private String name;

    Product(String name) {
        this.name = name;
    }
}

class CarProduct extends Product {
    private double tax;

    CarProduct(String name) {
        super(name);
        this.tax = 0.2;
    }
}

class PharmacyProduct extends Product {
    private double tax;

    PharmacyProduct(String name) {
        super(name);
        this.tax = 0.05;
    }
}
更新 在@JB Nizet注释之后,我改变了为每个子类设置税值的方式:

class Product {
    private String name;
    private double tax;

    Product(String name) {
        this.name = name;
    }

    setTax(double tax) {
        this.tax = tax;
    }
}

class CarProduct extends Product {
    CarProduct(String name) {
        super(name);
        this.setTax(0.5);
    }
}

class PharmacyProduct extends Product {
    PharmacyProduct(String name) {
        super(name);
        this.setTax(0.05);
    }
}

这比前两个好吗?

如果tax是所有产品都应该具有的公共属性(这对我来说很有意义,但取决于您的具体用例),我会将
tax
成员保留在基类中,并让继承类将其值传递给基类构造函数:

class Product {
    private String name;
    double tax;

    Product(String name, double tax) {
        this.name = name;
        this.tax = tax;
    }
}

class CarProduct extends Product {
    CarProduct(String name) {
        super(name, 0.2);
    }
}

class PharmacyProduct extends Product {
    PharmacyProduct(String name) {
        super(name, 0.05);
    }
}

您可以将
产品
抽象化。有了这一点,第一种方法似乎是可行的,因为
tax
是所有
is-a产品的共同点,但是类的字段不应该尽可能地进行封装吗?即使我们必须在每个子类中复制类似于纳税申报的代码,您甚至不应该有一个纳税字段。只是一个始终返回相同值的方法getTax()。另外,Java是否有名为String、Integer和Double的类?否,因为String类的实例是一个字符串。从你的类名中删除
s
:这会使代码变得笨拙且难以阅读。你没有听我的评论。你仍然有一个无用的税收领域。相反,在基类中应该有一个抽象的getTax()方法,以及在每个子类中返回一个常量的实现。不需要任何字段。对不起,我是OOP中的noob。必须研究抽象…在我的用户案例中,我希望每个子类的税是固定的,而不是由用户设置的。因此,它只能在实例化时由子类设置。我更新了我的问题,以显示另一种可能的解决方案。@LuísAlves“在实例化时仅由子类设置”这正是上述代码所做的。但这与我的第一个选项不一样吗?@LuísAlves类似,但不完全相同。在第一个选项中,您让继承类直接操作
tax
。通过这种方式,它们没有直接访问它的权限,并且可以使用getter和setter(诚然,这里没有显示)来实现更好的封装。