Who am I? —— Java 多态特性一例

测试代码如下:

SuperClass.java

public class SuperClass {
    public String a = "from super class";

    public void hello() {
        System.out.println(a);
    }
}

SubClass.java

public class SubClass extends SuperClass {
    public int a = 3;

    @Override
    public void hello() {
        System.out.println(a);
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        SuperClass s = new SubClass(); //!!! s 的编译时类型为 SuperClass, 运行时类型为 SubClass
        s.hello();
        System.out.println(s.a);
    }
}

上面的代码中,SubClass 覆盖了SuperClass 的 field a and its method hello(). Client 的输出结果会是什么呢?

运行代码,得如下结果:

3
from super class

由此可见,

  • s.hello() 执行了 SubClass.hello() 方法
  • s.a 访问了 SuperClass.a.

初看让人不解,这个 s访问的内容,SubClass 中都有定义,但为何 SubClass 还是 SuperClass 都被它调用了呢?即SubClass 里也有定义 as.a 仍然用 SuperClassa. 在 SubClass.hello() 使用的 a 是哪个类中定义的?

这是因为多态有如下一些限定:

  1. 对象的实例变量不具有多态性。具备多态性的,只有实例的方法。所以访问实例变量,依据其编译时类型访问。
  2. SubClass.hello() 使用的 a 是哪个类 SubClass 中定义的。虽然依据第1条的说明,实例变量不具有多态性,但如果通过子类的方法去访问(如通过 SubClass.hello()),它依然可以被访问到,只不过不那么直接罢了。

转载于:https://my.oschina.net/iridium/blog/2960729

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值