目錄java
多態性是面向對象的第三大特徵。ide
說實話,做爲小白的我,並不太可以理解上面三個優勢。隨着深刻學習,理解應該會愈來愈深吧,共勉。學習
Java容許把子類對象賦值給父類的引用變量,不用作任何強制轉換,系統自動完成。向上轉型來自於自下而上的繼承關係,子類繼承父類,子類是一種特殊的父類,因此向上轉型的操做實際上是情理之中的。測試
下面依照簡單的代碼,來試着理解向上轉型的概念與好處。code
package com.my.pac14; /** * @auther Summerday */ public class DynamicBinding { //Object是全部類的超類,根據向上轉型,該方法能夠接受任何類型的對象 public static void test(Object x) { System.out.println(x.toString()); } public static void main(String[] args) { test(new PrimaryStudent());//Student test(new Student());//Student test(new Person());//Person test(new Object());//java.lang.Object@1b6d3586 } } class Person extends Object { @Override public String toString() { return "Person"; } } class Student extends Person { @Override public String toString() { return "Student"; } } class PrimaryStudent extends Student { }
Object
類型的對象,並調用該對象的toString()
方法。public static void test(Object x) { System.out.println(x.toString()); }
public static void main(String[] args) { test(new PrimaryStudent());//Student test(new Student());//Student test(new Person());//Person test(new Object());//java.lang.Object@1b6d3586 }
Object x = new Student();
舉個簡單的例子,假設人類能夠分爲不少不少種,咱們能夠說學生是人類的一種,卻不能說人類是學生的一種。向上轉型必定程度上容許子類擴展超類的部分丟失,經過父類引用變量只能調用父類中的方法來實現,咱們去操做人類的時候,只能在人類具備的行爲屬性中作選擇,而不能直接以學生類的標準去操做它,由於咱們並不知道他是哪一類,萬一不是學生呢,對吧,用人類總沒錯,由於我人類有的東西,你學生類必定有。這就是我所理解的向上轉型。對象
若是沒有向上轉型機制,咱們想要達到原來的效果,就須要增長許多重載的test
方法,這樣就顯得過於繁瑣。若是要增長相似test()
的方法或者添加從Object
導出的新類,還會作更多複雜的操做,不利於擴展,不可取不可取。繼承
// 原來的狀況:須要建立不少不少的測試方法。 public static void test(Object x) { System.out.println(x.toString()); } public static void test(Person x) { System.out.println(x.toString()); } public static void test(Student x) { System.out.println(x.toString()); } public static void test(PrimaryStudent x) { System.out.println(x.toString()); }
多態的存在正好解決了這個棘手的問題,爲了利於擴展,只須要寫一個僅接收基類做爲參數的簡單方法,無論導出類如何,在運行時自動選擇調用對應導出類的方法,真的就很舒服。接口
那麼,編譯器又是如何肯定應該調用哪一個方法呢?這就涉及到所謂的「綁定」啦,這個呢,咱們在下片總結。編譯器
參考書籍:《Thinking in Java》it