Java字段继承和向上转换异常行为
这个问题的灵感来自我偶然发现的 给定以下代码:Java字段继承和向上转换异常行为,java,inheritance,upcasting,Java,Inheritance,Upcasting,这个问题的灵感来自我偶然发现的 给定以下代码: 公共类测试{ 公共静态void main(字符串[]args){ 派生b=新派生(); 基数a=b; 系统输出打印项次(“b.i->”+b.i); 系统输出打印项次(“a.i->”+a.i); System.out.println(“b.getI()->”+b.getI()); System.out.println(“a.getI()->”+a.getI()); } } 阶级基础{ int i=1; 公共int getI(){ 返回i; } } 类
公共类测试{
公共静态void main(字符串[]args){
派生b=新派生();
基数a=b;
系统输出打印项次(“b.i->”+b.i);
系统输出打印项次(“a.i->”+a.i);
System.out.println(“b.getI()->”+b.getI());
System.out.println(“a.getI()->”+a.getI());
}
}
阶级基础{
int i=1;
公共int getI(){
返回i;
}
}
类派生的扩展基{
int i=2;
公共int getI(){
返回-i;
}
}
//输出:
//b.i->2
//人工智能->1
//b.getI()->-2
//a.getI()->-2
有人能解释一下为什么a.i
返回1
?它不应该访问Derived
类中的i
字段吗
此外,在调试代码时,我可以看到如下内容:
在那里,您可以看到Derived
类正在存储对Base.i
的引用
为什么会这样?
Base.i
不应该被派生的.i
继承和覆盖吗?因为Java中没有字段多态性。这意味着子类中的字段只是隐藏超类中的字段,而不是重载它。在深入搜索之后,我终于找到了这个问题的答案
关键是,成员变量不能像方法一样被重写,它们只是隐藏的,而向上转换允许访问基类中的隐藏方法。您遇到了Java的一个特性,称为变量隐藏。
Derived
中的字段“i”隐藏classBase
中的字段“i”
与方法不同,字段在java中不能被重写,因此其行为
我在这个问题上发现了一个非常深入的问题,你可能认为它有用。