A a = new B()在Java中到底是什么意思

时间:2019-07-12 20:40:32

标签: java object

我明白了a.get()返回20的原因,这是因为动态绑定,因为B对象是在运行时创建的,所以它在类B中调用get()

但是a.x为什么打印10张?

class A {
  int x = 10;

  int get() {
     return x;
  }
}

class B extends A {
  int x = 20;

  int get() {
    return x;
  }
}

class Main {
  public static void main(String[] args) {
    A a = new B();
    System.out.println(a.get()); //20
    System.out.println(a.x); //10
  }
}

如果您还可以在此处解释用于存储对象的内存。

3 个答案:

答案 0 :(得分:5)

仅仅因为在Java中,只有方法才是多态的,而不是字段。引用字段时,编译器将使用声明的类型。引用方法时,运行时动态调度将选择正确的多态操作。

答案 1 :(得分:0)

最好的考虑方法是对象a是A类型。但是由于声明的方式,它可以“窃取” B类中的函数,并且如果它们重叠,则可以这样做。

由于a为A类型,因此调用a.x将返回存储在A类中的公共变量“ x”。由于在此过程中它永远不必引用B中的方法,因此它将引用A类中的x,而不是B类中的x。

但是,当您调用a.get()时,它将调用B类的a.get(),该类将获取B类中定义的x = 20。

让我知道是否有帮助!

答案 2 :(得分:0)

关于Java中的对象,声明类型与实际类型之间存在区别。在这种情况下,对象a是声明的类型,而对象b是实际的类型。一种考虑的方法是,在子类中的Override方法上调用时,将执行声明类型的方法。 x是因此在此方面不受多态行为影响的a类字段。 更多关于实际和声明类型的信息: http://ice-web.cc.gatech.edu/ce21/1/static/JavaReview-RU/OOBasics/ooPoly.html

关于堆栈中的内存,变量a的存储桶指向字段x的值为20的B类对象。不确定是否能回答您的内存问题。