用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
以便忽略B
的i
值。
你是绝对正确的。 如果参数列表和函数名称相同,并且返回类型是协变的 ,则在Java中重写方法。
基类中的i
只是被遮蔽 : ai
指的是基类中的i
成员,因为引用的类型 a
是A
,即使它引用了B
实例。
在Java实例中,不能覆盖变量,只能覆盖方法。 当我们声明一个与超类中声明的名称相同的字段时,这个新字段会隐藏现有字段。 请参阅此Java doc Hiding Fields 。