Java 继承问题:创建同一类对象的结果不同

Java 继承问题:创建同一类对象的结果不同,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

案例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();
        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次就搞定了。。