Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字段继承和向上转换异常行为_Java_Inheritance_Upcasting - Fatal编程技术网

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”隐藏class
Base
中的字段“i”

与方法不同,字段在java中不能被重写,因此其行为

我在这个问题上发现了一个非常深入的问题,你可能认为它有用。