JAVA: 子类“覆盖”父类的成员变量

来源:互联网 发布:苏州岩倍美工是真是假 编辑:程序博客网 时间:2024/05/18 22:55
import org.junit.Test;class Father {    int i = 10;    public void setI(int i) {        this.i = i;    }}class Son extends Father {    int i = 10;    public void show() {        System.out.println("super.i : " + super.i + ";this.i : " + this.i);    }}public class Test3 {    @Test    public void test() throws Exception {        Son son = new Son();        System.out.println(son.i);        son.setI(100);        son.show();        System.out.println(son.i);        Father parent = son;        System.out.println(parent.i);    }}

对于以上代码,输出结果为:
10
super.i : 100;this.i : 10
10
100

首先需要说明的是,即使子类声明了与父类完全一样的成员变量,也不会覆盖掉父类的成员变量。而是在子类实例化时,会同时定义两个成员变量,子类也可以同时访问到这两个成员变量(this.i&super.i),但父类不能访问到子类的成员变量(父类不知道子类的存在)。

而具体在方法中使用成员变量时,究竟使用的是父类还是子类的成员变量,则由方法所在的类决定;即,方法在父类中定义和执行,则使用父类的成员变量,方法在子类中定义(包括覆盖父类方法)和执行,则使用子类的成员变量。

对于 setI 方法,它的原型应该是setI(Father this, int i)
而对于show方法,它的原型应该是show(Son this)

属性没有多态的概念,在Java中只有普通实例方法才可以实现多态。

原创粉丝点击