Java學習筆記11(物件導向四:多態),java學習筆記

來源:互聯網
上載者:User

Java學習筆記11(物件導向四:多態),java學習筆記

多態:

舉例:描述一個事物的多種形態,如Student類繼承了Person類,一個Student對象既是Student,又是Person

多態體現為:父類引用變數可以指向子類對象

多態的前提:必須有子父類別關係或者類實現介面關係,否則無法完成多態

在使用多態後的父類引用變數調用方法時,會調用子類重寫後的方法

 

舉例:

public class Fu {    public void show(){        System.out.println("父類的show方法");    }}
public class Zi extends Fu{    public void show(){        System.out.println("子類重寫父類的show方法");    }}
public class Test {    public static void main(String[] args) {        //利用多態性        //公式:父類類型(介面類型)變數 = new 子類的對象        Fu f = new Zi();        f.show();    }}//輸出:子類重寫父類的show方法

抽象類別多態:

public abstract class Person {    public abstract void work();}
public class Teacher extends Person {    public void work() {        System.out.println("Teacher在工作");    }}
public class Test {    public static void main(String[] args) {        //抽象類別多態        Person p = new Teacher();        p.work();    }}//輸出:Teacher在工作

介面多態:

public interface Work {    public abstract void work();}
public class Student implements Work{    public void work(){        System.out.println("Student在工作");    }}
public class Test {    public static void main(String[] args) {        //介面多態        Work w = new Student();        w.work();    }}//輸出:Student在工作

 

 

多態中成員方法的特點:

public class Fu {    int a = 1; }
public class Zi extends Fu{    int a = 2;}
public class Test {    public static void main(String[] args) {        Fu f = new Zi();        System.out.println(f.a);    }}//輸出:1

成員變數:

編譯的時候,參考父類中有沒有這個變數,如果有,編譯成功,如果沒有,編譯失敗

啟動並執行時候,啟動並執行是父類中的變數值

總結:編譯運行全看父類

成員方法:

父類中沒有聲明或者定義的方法無法調用,

子類如果重寫,調用的是子類方法,子類沒有重寫,調用父類方法

總結:編譯看父類,運行看子類

 

 

instanceof關鍵字:

用於比較引用資料類型:

public class Test {    public static void main(String[] args) {        //Person p = new Student();        Person p = new Teacher();        boolean b = p instanceof Student;        System.out.println(b);    }}//輸出:false

 

多態轉型:

向上轉型:

 java是一種強制資料類型的語言,參與運算的資料,需要保證類型的統一

Person p = new Student();

兩個資料類型是不同的,但是成功運行

因為這裡出現了自動型別提升,將取值範圍小的自動提升為取值範圍大的

範圍小的,看成是子類,範圍大的,看成是父類

這裡子類提升到了父類的類型

 

優點:可以調用子類和父類的共有內容

缺點:無法調用子類的特有內容

 

如果想調用子類的特有內容:

向下轉型(類似以前提到的強制轉型):

Student s = (Student)p;

由父類類型強制轉回子類的類型

 

好處:可以調用子類特有的功能

 

轉型的案例:

public abstract class Animal {    public abstract void eat();}
public class Cat extends Animal {    public void eat(){        System.out.println("貓在吃");    }    public void catchMouse(){        System.out.println("貓在抓老鼠");    }    }
public class Dog extends Animal {    public void eat(){        System.out.println("狗在吃");    }    public void lookHome(){        System.out.println("狗在看家");    }}
public class Test {    public static void main(String[] args) {        Animal a1 = new Cat();        Animal a2 = new Dog();        a1.eat();        a2.eat();        //向下轉型,調用子類的特有方法        //使用if .instanceof. 為了確保安全性        if(a1 instanceof Cat){            Cat c = (Cat)a1;            c.catchMouse();        }        if(a2 instanceof Dog){            Dog d = (Dog)a2;            d.lookHome();        }    }}/*輸出: * 貓在吃 * 狗在吃 * 貓在抓老鼠 * 狗在看家 */

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.