案例1: 在下面的示例中,如果我调用a.i,则打印10作为答案。但是A a = new B();不是这个像b的对象正在创建,所以应该打印值20而不是10。
class A
{
int i = 10;
}
class B extends A
{
int i = 20;
}
public class MainClass
{
public static void main(String[] args)
{
A a = new B();
System.out.println(a.i);
}
}
案例2: 另外,如果我使用类中的方法创建与上面相同的程序而不是像上面的情况那样打印变量值,那么结果是不同的:
class A{
void test(){
System.out.println("hi");
}
}
class B extends A{
void test(){
System.out.println("hello");
}
}
public class Test {
public static void main(String[] args) {
A a=new B();
System.out.println(a.test);
}
现在在这种情况下打印hi而不是hello,那么当我尝试打印变量值和使用方法时,为什么行为会有所不同?重叠只发生在方法之间而不是变量?
答案 0 :(得分:2)
在Java中,只有方法可以是overriden,而不是实例变量。
当您声明一个与超类中现有字段同名的字段时,新字段会隐藏现有字段。超类中的现有字段仍然存在于子类中,甚至可以使用
检查这些 -
Java教程 - Hiding Fields
JLS示例 - Hiding of instance fields
答案 1 :(得分:2)
因为第一个示例中的内容与多态无关,因为不会动态调度读取的字段。
您拥有的是名称阴影,因此i
语句中的A.i
引用A
中声明的字段,此时B.i
是不可见的。