关于 Java 的多态性 —— 我的理解

  • 我也是今天自己才有一点想通了这个多态性。
  • 在学 C++ 的时候我总认为 重载上溯造型 (即 Base b = new Inh(),其中 Inh 类继承 Base 类) 都是多态性。因为你看重载的时候有好多个同名函数,只是参数列表的不同就能展现出不同的功能形态来,而上溯造型的时候,不同子类中的覆盖函数功能形态也不一样,最后调用的结果也不同。这不就是多态的含义吗?
  • 非也。我们都知道 C++ 里面重载函数实际上在编译的时候先变成 参数类型1_参数类型2_…_函数名 也就是说在编译的时候就能明白这应该调用哪一个函数,虽然说重载函数是同名的,但在编译器看来它们其实都是不同名,也即是不同的函数。那么不同的函数表现出不同的功能形态来也就不足为奇了。
  • 直到我第二次看《Java 核心编程》的时候我才想明白为什么 上溯造型 就可以 ”名正言顺” 的说是多态性。看一下代码:
class Base {
    bilibili() {
        System.out.println("干杯!");
    }
}

class Inh1 extends Base {
    bilibili() {
        System.out.println("我干了");
    }
}

class Inh2 extends Base {
    bilibili() {
        System.out.println("你随意");
    }
}

public class BiliBili {
    public static void main(String[] args) {
        Base b = new Base();
        Base b1 = new Inh1();
        Base b2 = new Inh2();
        b.bilibili();   // 干杯!
        b1.bilibili();  // 我干了
        b2.bilibili();  // 你随意
    }
}
  • 都是 Base 类的对象调用自己的方法 bilibili(),但是结果却都不一样。编译器在编译过后只是知道要调用 Base 类的方法 bilibili() ,仅此而已。如果只给你看编译后的结果,你也许就会认为要 “干杯!” 三次,事实上编译器也是这么认为的。但是 JVM 会在运行时期确定真正调用 bilibili() 的对象类型,所以 bilibili() 输出的结果就会不同。
  • 或许有的人认为 重载上溯造型 都可以算是多态性,我觉得就算如此,但不可否认的是,如果存在真正的多态性的实现方式的话,那 上溯造型 一定比 重载 更像多态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值