子类变量的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);