用java中的变量inheritance

任何人都可以澄清我。 这里实例方法被覆盖但变量不被覆盖。 输出为: B 10

 class A{ int i=10; public void name(){ System.out.println("A"); } } class B extends A{ int i=20; public void name(){ System.out.println("B"); } } public class HelloWorld { public static void main(String[] args){ A a = new B(); a.name(); System.out.println(ai); } } 

你不能覆盖属性,你只能覆盖方法:

 public class A{ private int i=10; public void name(){ System.out.println("A"); } public int getI(){ return i; } } public class B extends A{ private int i=20; public void name(){ System.out.println("B"); } @Override public int getI(){ return i; } } public class HelloWorld { public static void main(String[] args){ A a = new B(); a.name(); System.out.println(a.getI()); } } 

在您的示例中,将变量a定义为类型A以便忽略Bi值。

你是绝对正确的。 如果参数列表和函数名称相同,并且返回类型是协变的 ,则在Java中重写方法。

基类中的i只是被遮蔽ai指的是基类中的i成员,因为引用的类型 aA ,即使它引用了B实例。

在Java实例中,不能覆盖变量,只能覆盖方法。 当我们声明一个与超类中声明的名称相同的字段时,这个新字段会隐藏现有字段。 请参阅此Java doc Hiding Fields 。