如果子类中变量的名字和父类的变量的名字一样,不管他们的类型是否一致,那么在子类中,父类的同名变量无法直接通过变量名访问。
(个人认为这是一个很差的设计,对于代码的可读性可维护性非常不友好,编译器应该直接报错,禁止这种同名变量的重载)
定义父类:
package com.xxx.test.inherit;
public class TestParent {
public int var = 1;
protected void doTest() {
System.out.println("in TestParent::doTest(), var=" + var);
}
}
定义子类:
package com.xxx.test.inherit;
public class TestChild extends TestParent {
protected float var = 1.2f;
public void doTest() {
System.out.println("in TestChild::doTest(), var=" + var);
}
public static void main(String[] args) {
TestParent t = new TestChild();
t.doTest();
System.out.println("var=" + t.var);
}
}
运行结果
in TestChild::doTest(), var=1.2
var=1
说明
可见在子类的成员函数doTest中它能访问的是子类的var(float类型)。
对于System.out.println("var=" + t.var)打印出的结果是1,为什么呢?因为它引用的是父类的变量,究其原因因为t被声明称了父类TestParent,虽然它实际上是子类的实例,但是java变量的绑定是在编译时刻采用静态绑定的,编译器在编译的时候得知t是一个父类(TestParent)那么它就绑定了父类的var;而相反,函数的绑定java都是使用动态绑定的,因为t.doTest()并没有绑定称父类的doTest()。