對象的多態性-向上向下轉型
向上轉型:子類對象變爲父類對象,格式:父類 父類對象 = 子類實例,自動轉換;設計模式
向下轉型:父類對象變爲子類對象,格式:子類 子類對象 = (子類) 父類實例,強制轉換;this
注意:對象的多態性和方法複寫是聯繫在一塊兒的spa
向上轉型:設計
class A{ public void print(){ System.out.println("a") } } class B extends A{ public void print(){ System.out.println("b") } } public class Demo{ public static void main(String args[]){ B b =new B(); b.print(); } }
注意:本程序實例化的是子類對象,而且print()方法又被複寫了,最終調用的必定是被複寫過的方法code
向下轉型對象
public static void main(String args[]){ A a = new B(); B b = (B) a; b.print(); }
注意:必須發生向上轉型以後,才能發生向下轉型,而向下轉型有風險,儘可能少使用.blog
好處:在實際開發中,對象向上轉型的主要意義在於參數的統一,也是最爲主要的用法,而對象的向下轉型指的是調用子類的個性化操做.
舉個例子,假若有多個類繼承自一個類,而且複寫其中的一個方法,那麼咱們能夠:繼承
public class Demo{ public static void main(String args[]){ fun(new B()); fun(new c()); } public static void fun(A a){ //這裏只用到了A a 一個參數 a.print(); } }
而向下轉型.若是子類有沒有複寫父類的方法,並且要調用,那麼就要用到了.開發
抽象類
抽象類:抽象類就是指在普通方法裏增長了抽象方法,並且抽象方法沒有方法體,用abstract修飾.同時有抽象方法的類,也必需要被abstract修飾
而抽象類與向上向下轉型的關係是,抽象類沒法實例化,要調用,必須使用向上向下轉型.
同時抽象類必須被繼承,並且子類必須重寫父類的全部抽象方法.模板
抽象類的限制
抽象類不能用final修飾
抽象類的應用---模板設計模式
普通方法定義在抽象類時,能夠直接調用類中的方法,可是具體的抽象方法內容就必須由子類提供
abstract class A{ public void fun(){ //普通方法調用子類方法 this.print(); } public abstract void print(); //抽象方法 } class X extends A{ public void print(){ System.out.println("重寫父類的抽象方法") } } public class Demo{ public static void main(String args[]){ A a =new X(); a.fun(); } }
理解:若是將父類的方法print比喻爲叫這一行爲的話,子類的重寫則是代表具體是什麼在叫.