Java类访问子类变量的值

时间:2018-04-06 16:51:21

标签: java

我正在尝试获取子类变量的值,但不知道该怎么做。它返回超类属性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;
}

2 个答案:

答案 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的访问。