繁体   English   中英

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

[英]Constructor implementation inside an abstract class (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);
}

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

非常感谢!!!

在子类中,您隐藏了超类中定义的变量。 这是因为您已声明一个具有相同名称的字段: 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

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

因此,这暗示您的类要么缺少使用该字段的方法,要么该字段无用,因此可以将其删除。

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

您永远不会阅读此变量。 您唯一要做的就是赋予它一个值,但您从未读过它,而是它的价值。

我认为您应该将SizeFiltersdouble value SizeFiltersprotected ,然后删除在GreaterThanFilter类的子类中定义的double value 因此,您可以使用基本抽象类中继承的那个。
至于您的问题,以及所有其他提到的答案,是因为您从未读取过value属性,所以只需对其进行设置。 编译器告诉您,它从未使用过

您不应忽略该警告。 私有成员对子类不可见,因此,如果您不在抽象类中访问它,则根本不会对其进行访问。 如果您打算在子类中访问它,请添加一个吸气剂或对其进行保护。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM