1. 程式人生 > >在java的多型呼叫中,new的是哪一個類不一定就是呼叫這個類的方法。

在java的多型呼叫中,new的是哪一個類不一定就是呼叫這個類的方法。

 舉例說明:

知識點: 

  1. 方法過載:同一個類中引數型別或者數量不同但方法名相同的方法
  2. 方法重寫(覆寫/覆蓋):出現在具有繼承關係的類中,方法引數型別和個數、方法名以及返回值都相同,子類方法的訪問控制權限不能小於父類方法,子類方法會覆蓋掉父類方法,如果想呼叫父類的同名方法,可以使用super()

多型的執行: 

  1. 例項方法:動態繫結,即引用的變數實際引用的型別是哪一個,則執行哪一個例項方法。在執行時由java虛擬機器動態決定。 
  2. 靜態方法:靜態繫結,即引用的變數所宣告的型別是哪一個,則執行哪一個靜態方法。在編譯階段就已經做出了決定。 
  3. 成員變數(包括靜態變數和例項變數):靜態繫結,即引用變數所宣告的型別是哪一個,則執行哪個成員變數。在編譯階段就已經做出了決定。 

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");  
    }  
  
}

參考部落格: https://wj196.iteye.com/blog/1323244