抽象类(Java)中的构造函数实现

时间:2014-05-28 09:48:45

标签: java

我正在尝试在抽象类中创建一个构造函数,然后让另外两个类扩展它。但是 - 我在一些变量下得到这条黄线,说它从不在本地读取,但是如果我删除它,我会收到编译错误。

看起来像这样:

public abstract class SizeFilters {

private double value; // this one never read locally
private int MIN_VALUE = 0;

public SizeFilters(double value) {
    if (value >= MIN_VALUE) {
        this.value = value; 
    } else {
        throw new IllegalArgumentException(
                "Value must be a positive number.");
    }
}

延伸的课程:

public class GreaterThanFilter extends SizeFilters {

private double value;

public GreaterThanFilter(double value) {
    super(value);
}

我应该忽略那个警告还是我做错了什么?

非常感谢!!!

6 个答案:

答案 0 :(得分:1)

在您的子类中,您是hiding超类中定义的变量。这是因为您声明了一个具有相同名称的字段:value

public abstract class SizeFilters {
  private double value; // this one never read locally


public class GreaterThanFilter extends SizeFilters {
  private double value; // hides the field in the parent class

因此,即使您在子类中的其他位置使用value字段,超类字段也始终会发出警告,因为该字段永远不会被读取。

我怀疑您需要从子类中删除value字段,并在超类中提供getValue()方法以提供对它的访问权限。或者只是在超类protected而不是private中创建字段。

答案 1 :(得分:0)

警告基本上告诉您,您的类有一个字段,该字段已初始化,但从未被类的任何方法使用(并且子类不能使用它,因为它是私有的)。

所以它暗示你的班级缺少使用该领域的方法,或者该领域没用,因此可以删除。

答案 2 :(得分:0)

您收到警告的原因很可能是因为它实际上从未与构造函数分开使用。如果您以后要在课堂上使用它(使用getter方法或其他方式),请忽略警告。

答案 3 :(得分:0)

你永远不会读到这个变量。你唯一能做的就是给它一个价值,但你永远不会读它和它的价值。

答案 4 :(得分:0)

我认为您应该将double value中的SizeFilters设为protected,然后删除子类中定义的GreaterThanFilter。{{1}}。因此,您使用基础抽象类中的继承者 至于你的问题,以及提到的所有其他答案,这是因为你从未读过value属性,你只需设置它。并且编译器告诉你,它从未使用过

答案 5 :(得分:0)

你不应该忽视警告。 私有成员对于子类是不可见的,因此如果您不在抽象类中访问它,则根本不会访问它。如果您计划在子类中访问它,请添加一个getter或使其受保护。

另一方面,如果抽象类的唯一目的是共享成员,我建议你避免这样做。您应该共享功能(方法),但不能共享成员。