我正在尝试在抽象类中创建一个构造函数,然后让另外两个类扩展它。但是 - 我在一些变量下得到这条黄线,说它从不在本地读取,但是如果我删除它,我会收到编译错误。
看起来像这样:
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);
}
我应该忽略那个警告还是我做错了什么?
非常感谢!!!
答案 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或使其受保护。
另一方面,如果抽象类的唯一目的是共享成员,我建议你避免这样做。您应该共享功能(方法),但不能共享成员。