理解Java三大特性之多态性

理解Java三大特性之多态性

多态,就是指程序中定义的引用变量所指向的具体类型和通过该引用变量调用的方法在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量调用的到底是哪个类中的实现方法,必须由程序运行期间才能决定。这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态。

比如有这么四个类:酒,剑南春,五粮液,百年糊涂。其中,白酒作为其余三者的父类。

酒 a = 剑南春
酒 b = 五粮液
酒 c = 百年糊涂

这里所表现的就是多态。通过酒这个父类定义的引用变量 a,b,c 就能够引用不同的子类,从而调用不能的方法。这就是多态,只有在运行时才会知道引用变量所指的具体实例对象。

然而,要理解多态还是理解向上转型。在上面例子中,酒(Wine)是父类,剑南春 JNC 、五粮液 WLY 、百年糊涂 BNHT 是子类。

JNC a = new JNC();

上面的代码就是实例化一个剑南春对象,那么要是这样来写呢:

Wine a = new JNC();

这里定义了一个 Wine 类型的引用变量 a ,它指向的 JNC 实例对象。由于 JNC 是继承于 Wine 的,所以,JNC 可以自动向上转型为 Wine,所以 a 是可以指向 JNC 实例对象的。这样做存在一个非常大的好处,在继承中我们知道子类是父类的扩展,它可以提供比父类更强大的功能,如果我们定义一个指向子类的父类引用类型变量,那么它除了能够引用父类的共性以外,还可以使用子类的强大功能。

但是,向上转型存在一些缺陷,那就是它必定会导致一些方法和属性的丢失,而导致我们不能获取它们。所以父类类型的引用可以调用父类中定义的所有属性和方法,对于只存在子类中的方法和属性它就无法调用了。

看个例子:

父类 Wine

public class Wine {
    public void fun1(){
        System.out.println("Wine 的fun1...");
        fun2();
    }

    public void fun2(){
        System.out.println("Wine 的fun2");
    }
}

子类 JNC

public class JNC extends Wine {

    //重载父类的方法
    public void fun1(String a) {
        System.out.println("JNC 的fun1...");
        fun2();
    }

    //重写父类方法
    @Override
    public void fun2(){
        System.out.println("JNC 的fun2...");
    }
}
public static void main(String[] args){
    Wine a = new JNC();
    a.fun1();
}

//output:
//Wine 的fun1...
//JNC 的fun2...

从程序运行结果发现,a.fun1() 首先是运行父类 Wine 中的 fun1() ,然后再运行子类 JNC 中的 fun2()

在这个程序中子类 JNC 重载了父类 Wine的方法fun1(),重写 fun2(),而且重载后的 fun1(String a)fun1() 不是同一个方法,由于父类没有该方法,向上转型后丢失该方法,所以执行 JNCWine 类型引用是不能调用 fun1(String a) ,而子类 JNC 重写了 fun2() ,那么指向 JNCWine 引用会调用 JNC 中的 fun2()

总结:指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

对于面向对象而已,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值