Java 继承问题:创建同一类对象的结果不同
案例1: 在下面的示例中,如果我调用a.i,它将打印10作为答案。但是A=新的B();这不是像b的对象正在被创建,所以值20应该被打印,而不是10Java 继承问题:创建同一类对象的结果不同,java,Java,案例1: 在下面的示例中,如果我调用a.i,它将打印10作为答案。但是A=新的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(); Sys
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,那么,为什么我尝试打印变量值和使用方法时的行为不同呢?过度隐藏发生在仅使用方法和不使用变量的方法之间?在Java中,只有方法可以是,而不是实例变量 当您在超类中声明与现有字段同名的字段时,新字段将隐藏现有字段。超类中的现有字段仍存在于子类中,甚至可以使用 检查这些- Java教程-
JLS示例-在Java中,只能是方法,不能是实例变量 当您在超类中声明与现有字段同名的字段时,新字段将隐藏现有字段。超类中的现有字段仍存在于子类中,甚至可以使用 检查这些- Java教程-
JLS示例-因为第一个示例中的内容与多态性无关,因为读取的字段不是动态调度的
然而,您拥有的是名称阴影,因此语句
a.i
中的i
引用了a
中声明的字段,B.i
此时不可见。因为您在第一个示例中拥有的与多态性无关,因为读取的字段不是动态调度的
但是,您拥有的是名称隐藏,因此语句中的
i
引用了a
中声明的字段,B.i
此时不可见。字段不是多态的。我认为这称为静态绑定B.i
被a.i
隐藏,并且不会像您期望的那样被覆盖o be.Fields不是多态的。我认为这叫做静态绑定B.I
被A.I
隐藏,并且不会像您期望的那样被覆盖。似乎您在引用上设置超链接很困难:)…无论如何,很好的答案:)我在2-3次尝试中就找到了正确的答案..似乎您在引用上设置超链接很困难:)…anywa很好的回答:)我试了2-3次就搞定了。。