Java多態成員訪問的特點是什麼?

Java多態成員訪問的特點

多態概要

多態是面向對象編程的三個特性之一,這裡不展開做過多介紹,有機會專門寫一個關於繼承,封裝,多態三大特性的文章.
我之前在力扣學習模塊中整理過一部分關於這方面的內容,可以先簡單瞭解一下.
力扣知補-面向對象-繼承

Java多態使用最多的場景在於父類引用指向子類對象.

多態的前提:

  • 存在繼承關系(Son繼承Father)
  • 存在方法重寫(Son重寫Fahter中的Walk方法)
  • 父類引用指向子類對象(Father father = new Son(true);)

Java多態情景下成員訪問特點

多態情景下主要涉及三部分的訪問規則,分別是對成員變量,成員方法和靜態方法的訪問.
這裡隻拷貝多態測試類的代碼,同時簡單介紹一下Father類和Son類的情況.
Father類中有一個boolean canRun變量固定為False,子類中的canRun成員變量由構造方法傳入.

walk(boolean canRun):如果canRun是True則輸出Father/Son可以跑,否則輸出Father/Son隻能走.
public class Test {
    public static void main(String[] args) {
        Father father = new Son(true);
        System.out.println(father.isCanRun());
        father.walk(father.isCanRun());
        father.run();
    }
}

成員變量訪問規則

Father father = new Son(true);
成員變量訪問口訣是編父運父或者編左運左,進一步簡化成為看父類.
解釋:就是在編譯階段隻要父類能夠通過編譯,無論右側的類怎麼定義都不會報錯,在執行過程中的執行結果也是按照父類中變量來決定運行的結果.
雖然我們給Son中傳入的參數是true,但是對於成員father中的變量的訪問還是由父類決定.
所以當我們使用father.isCanRun()訪問canRun變量的時候返回的結果是false

成員方法訪問規則

成員方法訪問口訣是編父運子或著編左運右.
展開解釋就是在編譯階段隻要父類能夠通過編譯,無論右側的類怎麼定義都不會報錯,在執行過程中的執行結果需要按照子類中重寫的方法(兒子中重寫方法返回的是兒子是否能跑)來決定運行的結果.
所以當我們調用father.walk()方法的時候返回的結果是兒子隻能跑!.

靜態方法訪問規則

靜態方法訪問的口訣是編父運父或編左運左和成員變量一樣都是看父類.

/*
	在父類和子類中都添加上靜態方法
	*/
	// 父類
    public static void run(){
        System.out.println("父親遇到搶劫犯瞭!不得不跑!");
    }
    // 子類
    public static void run(){
        System.out.println("兒子遇到搶劫犯瞭!不得不跑!");
    }

調用father.run()返回的結果是父親遇到搶劫犯瞭!不得不跑!
證明瞭在多態情況下調用靜態方法時還是調用的左側-父類中定義的靜態方法.

這部分我的理解也不是特別深刻,以後有時間還想補充集中情況
子類中是否能夠在靜態代碼塊中調用父類的靜態方法等等場景
先繼續向後學習,後面會整理Java虛擬機相關知識,結合類的加載等內容可能回頭會對這部分理解更深刻.

參考/擴展閱讀

Java基礎系列第一彈之方法重載和方法重寫的區別

Java基礎系列第三彈之操作字符串的類都有哪些?區別是什麼?

到此這篇關於Java多態成員訪問的特點是什麼?的文章就介紹到這瞭,更多相關Java多態成員訪問內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: