Overload和Override的區別

Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

Overload是重載的意思,Override是覆蓋的意思,也就是重寫。

重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。

重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因爲子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。

至於Overloaded的方法是否可以改變返回值的類型這個問題,要看你倒底想問什麼呢?這個題目很模糊。如果幾個Overloaded的方法的參數列表不一樣,它們的返回者類型當然也可以不一樣。但我估計你想問的問題是:如果兩個方法的參數列表完全一樣,是否可以讓它們的返回值不同來實現重載Overload。這是不行的,我們可以用反證法來說明這個問題,因爲我們有時候調用一個方法時也可以不定義返回結果變量,即不要關心其返回結果,例如,我們調用map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變量,這時候假設該類中有兩個名稱和參數列表完全相同的方法,僅僅是返回類型不同,java就無法確定編程者倒底是想調用哪個方法了,因爲它無法通過返回結果類型來判斷。

 

override可以翻譯爲覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:

1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;

2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;

4、被覆蓋的方法不能爲private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

overload對我們來說可能比較熟悉,可以翻譯爲重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點:

1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int,float),但是不能爲fun(int,int));

2、不能通過訪問權限、返回類型、拋出的異常進行重載;

3、方法的異常類型和數目不會對重載造成影響;

4、對於繼承來說,如果某一方法在父類中是訪問權限是priavte,那麼就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。


PS:

一、子父類中函數的特點:

  當子類出現和父類一模一樣的函數時,當子類對象調用該函數,會運行子類函數的內容。如同父類的函數被覆蓋一樣。這種情況是函數的另一個特性:重寫(覆蓋

重寫的意義:

    當子類繼承父類,沿襲了父類的功能,到子類中,但是子類雖具備該功能,但是功能的內容卻和父類不一致,這時,沒有必要定義新功能,而是使用覆蓋特殊,保留父類的功能定義,並重寫功能內容。 

覆蓋注意點:

1,子類覆蓋父類,必須保證子類權限大於等於父類權限,纔可以覆蓋,否則編譯失敗。

2,靜態只能覆蓋靜態。

3,子類函數權限要大於父類權限

覆蓋和重寫的區別:

重載:只看同名函數的參數列表。

重寫:子父類方法要一模一樣。(完全一樣,包括返回值類型和參數列表)


二、子父類中構造函數的特點:

在對子類對象進行初始化時,父類的構造函數也會運行,那是因爲子類的構造函數默認第一行有一條隱式的語句 super();

super():會訪問父類中空參數的構造函數。而且子類中所有的構造函數默認第一行都是super();

爲什麼子類一定要訪問父類中的構造函數?

    因爲父類中的數據子類可以直接獲取。所以子類對象在建立時,需要先查看父類是如何對這些數據進行初始化的。所以子類在對象初始化時,要先訪問一下父類中的構造函數。如果要訪問父類中指定的構造函數,可以通過手動在子類中定義super語句的方式來指定。

    父類中定義完的內容,子類中沒有必要重複定義,只需要用super(對應參數);的形式即可。也必須定義在子類構造函數的第一行。

    注意:super語句一定定義在子類構造函數的第一行。如果子類中沒有定義指定的super語句,會默認訪問父類空參數的構造函數。子類中至少有一個構造函數會訪問父類中的構造函數。

另外,注意一下程序:

Zi(int x)
	{
		this();
		//super();
		//super(3);
		System.out.println("zi..."+x);
	}

分析:當this();出現在第一行時,子類構造函數中沒有了隱式的super();因爲他們都只能出現在第一行。這時候該子類調用的是子類中空參數的構造函數,而空參數的構造函數中的第一行有隱式的super();所以這樣做並沒有問題。

 

final關鍵字的特點

final : 最終。作爲一個修飾符

1、可以修飾類,函數,變量。

2、被final修飾的類不可以被繼承。爲了避免被繼承,被子類複寫功能。

3、被final修飾的方法不可以被複寫。

4、被final修飾的變量是一個常量只能賦值一次,既可以修飾成員變量,又可以修飾局部變量。

       當在描述事物時,一些數據的出現值是固定的,那麼這時爲了增強閱讀性,都給這些值起個名字。方便於閱讀。而這個值不需要改變,所以加上final修飾。

      作爲常量:常量的書寫規範所有字母都大寫,如果由多個單詞組成。單詞間通過_連接。

5、內部類定義在類中的局部位置上時,只能訪問該局部被final修飾的局部變量。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章