java对象上的超类如何工作?
比如说我有一个像这样的超级级Ugrad:
public class Ugrad{
int DM = 140;
int perYear() { return DM/4; }
}
我有一个名为Grad的子类,如下所示:
public class Grad extends Ugrad{
int DM = 28;
int perYear() { return DM/2; };
现在,我有一个tester类,在其中我做了一些打印来学习对象是如何工作的,比如:
//In the line-comments I denote what the result of the print will be.
public class Tester{
public void main(String[] args){
Grad g = new Grad();
System.out.println(g.DM); // 28
System.out.println(g.perYear()); // 14
Ugrad u = (Ugrad) g;
System.out.println(u.DM); //140
System.out.println(u.perYear()); //14
}
}
我的问题是super class cast如何在对象上工作? 为什么当u.DM等于140时,u.perYear打印14等于g.DM/2
# 1 楼答案
Grad
对象都隐式地是类Upgrad
的对象,因为 你的声明:Grad extends Upgrad
。 也就是说,这将起作用:您已经重写了
perYear()
方法。 在强制转换到超类并调用此方法后,由于Java的多态性原则和覆盖规则,它将保持在Grad
类中实现的状态: 事实上,这个问题已经在Stackoverflow上得到了回答。 引用Learning Java by Daniel Leuck & Patrick Niemeyer这与隐藏字段不同。 下面最好描述隐藏或隐藏字段: Subclassing and inheritance -> Shadowed Variables 链接中使用了一组不同的类型,但含义相同:
正如Inheritance -> What You Can Do in a Subclass中所说:
测试代码: