Java方法覆蓋和變數覆蓋的區別詳解

狂想盼盼發表於2014-12-10

對於Java初學者來說,很容易將Java中的方法覆蓋、方法過載以及變數覆蓋互相混淆,本文主要來對Java中的方法覆蓋和方法過載進行詳細地卻分,並且用具體的程式碼來進行解釋。

首先,我們看看關於過載,和覆蓋(重寫)的簡明定義:

方法過載:如果有兩個方法的方法名相同,但引數不一致,哪麼可以說一個方法是另一個方法的過載。

方法覆蓋:如果在子類中定義一個方法,其名稱、返回型別及引數簽名正好與父類中某個方法的名稱、返回型別及引數簽名相匹配,那麼可以說,子類的方法覆蓋了父類的方法

我們重點說說覆蓋問題,以如下程式碼為例:

public class People {  
    public String getName() {  
        return "people";  
    }  

}  
public class Student extends People {  

    public String getName() {  
        return "student";  
    }  

}  
public static void main(String[] args) {  
  People p=new People();  
  System.out.println(p.getName());//執行結果為people  

  Student s=new Student();  
  System.out.println(s.getName());//執行結果為student  

  People pp=new Student();  
  System.out.println(pp.getName());//執行結果為student  

    }

上述結果說明:student類的getName方法成功覆蓋了父類的方法

我們再來看看變數的覆蓋:

public class People {  
    protected String name="people";  

}  
public class Student extends People {  

    protected String name="student";  

}  
public static void main(String[] args) {  

        People p=new People();  
        System.out.println(p.name);//執行結果為people  

        Student s=new Student();  
        System.out.println(s.name);//執行結果為student  

        People pp=new Student();  
        System.out.println(pp.name);//執行結果為people  

    }

通過執行結果我發現:變數的覆蓋實際上與方法的不盡相同。

用我自己的話說:變數的覆蓋最多隻能算是半吊子的覆蓋。

要不然,向上轉換與不會發生資料丟失現象

People pp=new Student();  
System.out.println(pp.name);//執行結果為people

就我個人的經驗來說:變數的覆蓋很容易讓人犯錯誤.讓人感覺又回到了C++的繼承[這裡不是指C++帶virtual的繼承]

最後我們再來看一段程式碼:

public class People {  
    protected String name="people";  
    public String getName() {  
        return name;  
    }  
}  
public class Student extends People {  

    protected String name="student";  
    public String getName() {  
        return name;  
    }  
}
main(String[] args) {  

        People p=new People();  
        System.out.println(p.getName());//執行結果為people  

        Student s=new Student();  
        System.out.println(s.getName());//執行結果為student  

        People pp=new Student();  
        System.out.println(pp.getName());//執行結果為student  

    }

顯然,如此的覆蓋,才是對我們更有用的覆蓋,因為這樣才能達到:把具體物件抽象為一般物件的目的,實同多型性

以上只是我個人的看法,有不對的地方歡迎指出來討論。

相關文章