在继承中迷茫,任何人都可以帮助我吗?

时间:2014-05-22 19:12:54

标签: java

Java中的代码

public class A {
    int x;

    public A() {
       x = 0;
    }

    public void print() {
        System.out.println("This is A");
    }
}

public class B extends A {
     int x;

     public B() {
        x = 1;
     }

     public void print() {
         System.out.println("This is B");
     }
}

B b = new B();
A a = b;

System.out.print(a.x);---------------->0 
a.print();---------------->This is B

我很困惑。我为B类创建了对象b,虽然我将b分配给a,但我认为b仍然应该指向B类。为什么“a.x”将返回0而不是1?为什么a.x指向A中的x,但a.print()指向B中的print()方法?

2 个答案:

答案 0 :(得分:3)

字段不是多态的,但方法是,

表示将在运行时引用引用的对象上调用方法

字段变量与引用相关联,因此如果从类x中删除字段A并尝试相同的代码,则无法编译

答案 1 :(得分:3)

您在Java中如何应用polymorphism时看到了一些不正常之处。在调用a.print()调用B' s print()时可以看到多态性,而字段不是这种情况。该字段与引用相关联,因此在这种情况下b.xa.x是不同的(尽管您可以在x的定义中省略B并且在超类中声明的单个字段。在这种情况下,可以看到hiding的形式。