子类变量的Java访问值
我试图得到一个子类变量的值,但不知道怎么做。它返回超级类属性子类变量的Java访问值,java,Java,我试图得到一个子类变量的值,但不知道怎么做。它返回超级类属性0,因为d的类型显然是Shape。如何在不更改d的类类型的情况下访问实例(3)的正确值?可能吗 public class Testclass { public static void main(String[] args) { Shape d = new Triangle(); System.out.println(d.corners);; } } class Shape{ i
0
,因为d
的类型显然是Shape
。如何在不更改d
的类类型的情况下访问实例(3
)的正确值?可能吗
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;
}
这将创建具有相同名称的三个不同变量。相反,您应该在Shape
中声明一次变量:
class Shape{
int corners;
}
现在在每个子类的构造函数中设置它的值。比如说
class Triangle extends Shape{
public Triangle() {
corners = 3;
}
}
对每个子类重复。定义了两次
d
字段。编译器在访问字段时依赖于声明的类型。
当变量声明为
Shape
时,此处使用Shape
中定义的字段:
System.out.println(d.corners);
您可以将其强制转换为Triangle
,以访问Triangle中定义的d
字段:
System.out.println(((Triangle)d).corners);
但更好的方法是不要复制子类中的字段,即在类中定义并由子类可见的字段。对操作变量的开发人员来说,隐藏变量是一种容易出错的方法
如果您需要在类和子类中声明相同的字段,那么类中的哪一个应该是私有的,并且子类不能直接访问,但是如果需要,可以使用getter提供对的访问。我建议将Shape类设置为接口。您不应该在子类中隐藏超类的属性(这正是你正在做的)来避免你现在遇到的问题。看一看,这应该可以解决你的问题。我还没有了解它们。如果这是解决问题的方法,那么可能就回答了这个问题。@Ben下面的我的答案是一个使用构造函数的示例。
System.out.println(((Triangle)d).corners);