< 示例1>
<練習>
這個地方就是多態的一個陷阱; 多態是對方法而言的,不是對變量; s1 a = new s2();這里生成的對象是s1類的實例,但是是由s2類構造的; java中對變量的選擇是靜態的,對方法的選擇是動態的,是在運行時決定的。(static除外) 運行時實際上調用的是實例的方法,即s1的方法;但對于繼承(多態的一種方式),方法的定位是在動態執行時選擇的,選擇實際構造者,因此就出現了本題的現象了。 另外:多態是對方法而言的,不是對變量;這樣說有些不嚴密,方法應該有個修飾,就是除了final修飾的方法外,java中對函數的調用都是后期綁定,所謂的后期綁定就是動態選擇 摘自 崔毅解答csdn疑問時給出的分析 注意以下的方法都被修飾了final < 示例2>以下哪里會出錯?
op2.f(); 處出錯! <示例3>
分析
多態:
Java 中的函數,除了聲明外 final 的外,都是后期綁定。
所謂綁定是建立“函數調用”和“函數本體”的關聯。、
所謂的后期綁定是指執行時根據對象類別而進行
多態僅僅對函數而言,不對變量而言;
變量的訪問依賴于編譯期引用指向的類型;
方法的訪問依賴于執行期對象的類型;
向上轉型后,調用某個函數,若 derived class overriding 了該函數,則會調用該 derived class 中的函數,否則會調用 base class 中的函數。
向上轉型后,只能調用 base class 中被 derived class overriding 的函數,不能調用 derived class 中 extend 函數。
即向上轉型后,只能調用 base class 中的方法,不能調用 derived class 中的擴展方法