方法覆盖java中的Vs类变量重写

时间:2015-05-31 14:28:00

标签: java methods member override

我只是尝试了一些示例代码来检查Java中的类变量覆盖行为。以下是代码:

class A{
  int i=0;

  void sayHi(){
    System.out.println("Hi From A");
  }
}

 class B extends A{
  int i=2;

  void sayHi(){
    System.out.println("Hi From B");
  }
}


public class HelloWorld {
 public static void main(String[] args) {
    A a= new B();
    System.out.println("i->"+a.i); // this prints 0, which is from A
    System.out.println("i->"+((B)a).i); // this prints 2, which is from B
    a.sayHi(); //  method from B gets called since object is of type B
  }
}

我无法理解下面这两行发生的事情

System.out.println("i->"+a.i); // this prints 0, which is from A
System.out.println("i->"+((B)a).i); // this prints 2, which is from B

为什么a.i打印0即使对象属于B类型?为什么在将其投放到2之后打印B

2 个答案:

答案 0 :(得分:4)

i不是方法 - 它是数据成员。数据成员不会覆盖,他们隐藏。因此,即使您的实例是B,它也有两个数据成员 - 来自i的{​​{1}}和来自A的{​​{1}}。当您通过i引用引用它时,您将获得前者,当您使用B引用时(例如,通过明确地将其引用),您将获得后者。

另一方面,

实例方法的行为有所不同。无论引用的类型如何,因为实例是A实例,您将获得多态行为并打印字符串B

答案 1 :(得分:2)

即使A被初始化为新的B(),如果你说

,变量也是A.
B a = new B();

你不会有这个问题。