在java的多型呼叫中,new的是哪一個類不一定就是呼叫這個類的方法。
阿新 • • 發佈:2019-01-05
舉例說明:
知識點:
- 方法過載:同一個類中引數型別或者數量不同但方法名相同的方法。
- 方法重寫(覆寫/覆蓋):出現在具有繼承關係的類中,方法引數型別和個數、方法名以及返回值都相同,子類方法的訪問控制權限不能小於父類方法,子類方法會覆蓋掉父類方法,如果想呼叫父類的同名方法,可以使用super()。
多型的執行:
- 例項方法:動態繫結,即引用的變數實際引用的型別是哪一個,則執行哪一個例項方法。在執行時由java虛擬機器動態決定。
- 靜態方法:靜態繫結,即引用的變數所宣告的型別是哪一個,則執行哪一個靜態方法。在編譯階段就已經做出了決定。
- 成員變數(包括靜態變數和例項變數):靜態繫結,即引用變數所宣告的型別是哪一個,則執行哪個成員變數。在編譯階段就已經做出了決定。
Base: 引用變數所宣告的型別,Sub:引用變數實際引用的型別。
public class Base { String var = "baseVar"; static String staticvar = "staticBasevar"; void method() { System.out.println("Base method!"); } static void staticMethod() { System.out.println("static Base method!"); } public static void main(String[] args) { Base who = new Sub(); System.out.println("who.var=" + who.var); // who.var=baseVar System.out.println("who.static =" + who.staticvar); // who.static =staticBasevar who.method(); // Sub method! who.staticMethod(); //static Base method! } } class Sub extends Base { String var = "SubVar"; static String staticvar = "staticSubvar"; void method() { System.out.println("Sub method!"); } static void staticMethod() { System.out.println("static Sub method!"); } String subvar = "sssssssssss"; void submethod() { System.out.println("Sub method!wwwwwwwwwww"); } }