我正在尝试获取子类变量的值,但不知道该怎么做。它返回超类属性0
,因为d
显然是类型Shape
。如何在不更改3
的类类型的情况下访问实例的正确值(d
)?有可能吗?
public class Testclass {
public static void main(String[] args) {
Shape d = new Triangle();
System.out.println(d.corners);;
}
}
class Shape{
int corners = 0;
}
class Triangle extends Shape{
int corners = 3;
}
class Square extends Shape{
int corners = 4;
}
答案 0 :(得分:0)
Shape
这会创建具有相同名称的三个不同变量。相反,您应该在class Shape{
int corners;
}
:
class Triangle extends Shape{
public Triangle() {
corners = 3;
}
}
现在在每个子类的构造函数中设置它的值。例如
{{1}}
对每个子类重复。
答案 1 :(得分:-1)
d
字段定义了两次
编译器在访问字段时依赖于声明的类型
当变量声明为Shape
时,Shape
中定义的字段在此处使用:
System.out.println(d.corners);
您可以将其投射到Triangle
以访问Triangle中定义的d
字段:
System.out.println(((Triangle)d).corners);
但更好的方法是不要在子类中复制一个字段,该字段在类中定义并由子类可见。
对于操纵它们的开发人员而言,阴影变量是一种容易出错的方法。
如果你需要在类和子类中声明相同的字段,那么哪一个类应该是私有的,而不是子类可以直接访问的,但如果需要,可以提供对getter的访问。