Java筆記 —— 方法重載和方法重寫

来源:https://www.cnblogs.com/huangzenglie/archive/2018/04/14/8836904.html
-Advertisement-
Play Games

閱讀目錄 方法重載 方法重寫 閱讀目錄 閱讀目錄 方法重載 方法重寫 方法重載 方法重寫 一、方法重載 1)在同一個類中,如果想創建多個名稱相同的方法,那麼就會用到方法重載。方法重載通過參數區分名稱相同的方法,參數可以類型不同,數目不同,或者順序不同 package com.example; pub ...


閱讀目錄

一、方法重載

1)在同一個類中,如果想創建多個名稱相同的方法,那麼就會用到方法重載。方法重載通過參數區分名稱相同的方法,參數可以類型不同,數目不同,或者順序不同


package com.example;

public class T{
	public void show(){ 
		System.out.println("show()");
	}
	
	/*error
	 public int show(){
	 	return 100;
	 }
	 */
	
	public void show(int i){
		System.out.println("show" + "(" + i + ")");
	}
	public void show(String str){
		System.out.println("show" + "(" + str + ")");
	}
	public void show(int i, String str){
		System.out.println("show" + "(" + i + ", " + str + ")");
	}
	public void show(String str, int i){
		System.out.println("show" + "(" + str + ", " + i + ")");
	}
}
	
	
package com.example;

public class Test{
	public static void main(String[] args){
		T t = new T();
		t.show();
		t.show(10);
		t.show("張三");
		t.show(10, "張三");
		t.show("張三", 10);
	}
}
	
	
運行結果:
	
show()
show(10)
show(張三)
show(10, 張三)
show(張三, 10)
	
  • 方法名稱相同時,不能通過改變返回值的類型來進行區分,只能通過改變參數的類型、參數的數目、或者參數的順序來對方法進行區分

2)類中可以創建多個構造器也是利用了方法重載

	
package com.example;

public class T{
	public T(){
	}
	
	public T(int i){
	}
	
	public T(String str){
	}
}
	

3)方法重載時,如果參數列表都是基本數據類型,編譯器會將傳入的參數自動匹配相應的類型。如果沒有相匹配的類型,編譯器會將參數進行類型提升或者窄化轉換

例1:

	
package com.example;

public class T{
	public void f1(char i) {System.out.print("f1(char) ");}
	public void f1(byte i) {System.out.print("f1(byte) ");}
	public void f1(short i) {System.out.print("f1(short) ");}
	public void f1(int i) {System.out.print("f1(int) ");}
	public void f1(long i) {System.out.print("f1(long) ");}
	public void f1(float i) {System.out.print("f1(float) ");}
	public void f1(double i) {System.out.print("f1(double) ");}
	
	public void f2(byte i) {System.out.print("f2(byte) ");}
	public void f2(short i) {System.out.print("f2(short) ");}
	public void f2(int i) {System.out.print("f2(int) ");}
	public void f2(long i) {System.out.print("f2(long) ");}
	public void f2(float i) {System.out.print("f2(float) ");}
	public void f2(double i) {System.out.print("f2(double) ");}
	
	public void f3(short i) {System.out.print("f3(short) ");}
	public void f3(int i) {System.out.print("f3(int) ");}
	public void f3(long i) {System.out.print("f3(long) ");}
	public void f3(float i) {System.out.print("f3(float) ");}
	public void f3(double i) {System.out.print("f3(double) ");}
	
	public void f4(int i) {System.out.print("f4(int) ");}
	public void f4(long i) {System.out.print("f4(long) ");}
	public void f4(float i) {System.out.print("f4(float) ");}
	public void f4(double i) {System.out.print("f4(double) ");}
	
	public void f5(long i) {System.out.print("f5(long) ");}
	public void f5(float i) {System.out.print("f5(float) ");}
	public void f5(double i) {System.out.print("f5(double) ");}
	
	public void f6(float i) {System.out.print("f6(float) ");}
	public void f6(double i) {System.out.print("f6(double) ");}
	
	public void f7(double i) {System.out.print("f7(double) ");}
	
	
	
	public void showChar(){
		char i = 0;
		System.out.println("char: ");
		f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i);
		System.out.println("\n");
	}
	public void showByte(){
		byte i = 0;
		System.out.println("byte: ");
		f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i);
		System.out.println("\n");
	}
	public void showShort(){
		short i = 0;
		System.out.println("short: ");
		f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i);
		System.out.println("\n");
	}
	public void showInt(){
		int i = 0;
		System.out.println("int: ");
		f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i);
		System.out.println("\n");
	}
	public void showLong(){
		long i = 0;
		System.out.println("long: ");
		f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i);
		System.out.println("\n");
	}
	public void showFloat(){
		float i = 0;
		System.out.println("float: ");
		f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i);
		System.out.println("\n");
	}
	public void showDouble(){
		double i = 0;
		System.out.println("double: ");
		f1(i); f2(i); f3(i); f4(i); f5(i); f6(i); f7(i);
		System.out.println("\n");
	}
}
	
	
package com.example;

public class Test{
	public static void main(String[] args){
		T t = new T();
		t.showChar();
		t.showByte();
		t.showShort();
		t.showInt();
		t.showLong();
		t.showFloat();
		t.showDouble();
	}
}
	
	
運行結果:

char:
f1(char) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double)

byte:
f1(byte) f2(byte) f3(short) f4(int) f5(long) f6(float) f7(double)

short:
f1(short) f2(short) f3(short) f4(int) f5(long) f6(float) f7(double)

int:
f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double)

long:
f1(long) f2(long) f3(long) f4(long) f5(long) f6(float) f7(double)

float:
f1(float) f2(float) f3(float) f4(float) f5(float) f6(float) f7(double)

double:
f1(double) f2(double) f3(double) f4(double) f5(double) f6(double) f7(double)
	
  • char 類型比較特別,當重載的方法中沒有 char 類型時,傳入的參數會提升為 int 類型,而不是 byte 類型,例如:f2 方法和 f3 方法,這兩個方法都沒有重載 char 類型的參數,所以傳入的參數直接提升為 int 類型,從運行結果的第一行可以看到這一特性

例2:

	
package com.example;

public class T{
	public void f1(char i) {System.out.print("f1(char) ");}
	public void f1(byte i) {System.out.print("f1(byte) ");}
	public void f1(short i) {System.out.print("f1(short) ");}
}
	
	
package com.example;

public class Test{
	public static void main(String[] args){
		int i = 0;
		
		T t = new T();
		
		//t.f1(i); // error
		
		t.f1((char)i);
		t.f1((byte)i);
		t.f1((short)i);
	}
}
	
	
運行結果:

f1(char) f1(byte) f1(short)
	
  • 如果傳入的參數需要窄化轉型,那麼必須要顯式地對傳入的參數進行強制類型轉換

[ 返回頂部 ]



二、方法重寫

1)方法重寫只存在於子類中(繼承或實現介面)

	
package com.example;

public class Person{ // 父類
	public void speak(){
		System.out.println("Person: speak()");
	}
}
	
	
package com.example;

public class Man extends Person{ // 子類
	public void speak(){ // 重寫父類的 speak 方法
		super.speak(); // 調用父類的 speak 方法
		System.out.println("Man: speak()");
	}
}
	
	
運行結果:

Person: speak()
Man: speak()
	
  • 方法重寫時,子類方法的方法名稱、返回值類型、參數列表都應該與父類中的方法相同

2)子類中重寫的方法的訪問控制許可權不能低於父類中方法的訪問控制許可權

	
package com.example;

public class Person{ // 父類
	public void p1(){
	}
	
	protected void p2(){
	}
	
	void p3(){
	}
	
	private void p4(){
	}
}
	
	
package com.example;

public class Man extends Person{ // 子類
	public void p1(){ // 父類的 p1 方法的訪問控制許可權是 public,那麼子類的 p1 方法的訪問控制許可權只能是 public
	}
	
	
	/* public void p2(){ // 可以是 public 或者 protected
	} */
	protected void p2(){
	}
	
	
	/* public void p3(){
	}
	protected void p3(){
	} */
	void p3(){
	}
	
	
	/* public void p4(){
	}
	protected void p4(){
	}
	void p4(){
	} */
	private void p4(){
	}
}
	

3)繼承關係中,子類也可以對父類的方法進行方法重載

	
package com.example;

public class Person{ // 父類
	public void speak(int i){
		System.out.println("Person: speak" + "(" + i + ")");
	}
}
	
	
package com.example;

public class Man extends Person{ // 子類
	public void speak(String str){ // 方法重載
		System.out.println("Man: speak" + "(" + str + ")");
	}
}
	
	
package com.example;

public class Test{
	public static void main(String[] args){
		Man m = new Man();
		m.speak("張三");
	}
}
	
	
運行結果:

Man: speak(張三)
	

4)Java 為了保證重寫方法時不會出錯,所以引入了 @Override

	
package com.example;

public class Person{ // 父類
	public void speak(int i){
		System.out.println("Person: speak" + "(" + i + ")");
	}
}
	
	
package com.example;

public class Man extends Person{ // 子類
	
	
	/* @Override
	public void speak(String str){
		System.out.println("Man: speak" + "(" + str + ")");
	} */ // error,用了 @Override ,那麼 @Override 下麵的方法必須是方法重寫,否則編譯時會出錯
	
	@Override
	public void speak(int i){
		System.out.println("Man: speak" + "(" + i + ")");
	}
}
	
	
package com.example;

public class Test{
	public static void main(String[] args){
		Man m = new Man();
		m.speak(10);
	}
}
	
	
運行結果:

Man: speak(10)
	

[ 返回頂部 ]



參考資料:

《Java 編程思想》第4版



End~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Description 小Q在電子工藝實習課上學習焊接電路板。一塊電路板由若幹個元件組成,我們不妨稱之為節點,並將其用數 字1,2,3….進行標號。電路板的各個節點由若幹不相交的導線相連接,且對於電路板的任何兩個節點,都存在且僅 存在一條通路(通路指連接兩個元件的導線序列)。在電路板上存在一個特殊的 ...
  • 導讀: 1.函數的定義 2.函數的文檔註釋 3.函數的參數與調用 4.函數參數的類型(重點) 5.函數的返回值 6.函數的嵌套調用 7.局部變數和全局變數 所謂函數,就是把 具有獨立功能的代碼塊 組織為一個小模塊,在需要的時候 調用。 函數的使用包含兩個步驟: 1.定義函數 —— 封裝 獨立的功能 ...
  • 傳統 JDBC 回顧 JDBC 我們一定不陌生,剛開始學習的時候,我們寫過很多很多重覆的模板代碼: 現在光是看著就頭大,並且我還把它完整的寫了出來..真噁心! 這還僅僅是一個 JDBC 的方法,並且最主要的代碼只有 這麼一句,而且有很多模板化的代碼,包括建立連接以及關閉連接..我們必須想辦法解決一下 ...
  • 題目描述 Z國的騎士團是一個很有勢力的組織,幫會中匯聚了來自各地的精英。他們劫富濟貧,懲惡揚善,受到社會各界的贊揚。 最近發生了一件可怕的事情,邪惡的Y國發動了一場針對Z國的侵略戰爭。戰火綿延五百裡,在和平環境中安逸了數百年的Z國又怎能抵擋的住Y國的軍隊。於是人們把所有的希望都寄托在了騎士團的身上, ...
  • IllegalArgumentException此異常表明向方法傳遞了一個不合法或不正確的參數 註意Control character in cookie value or attribute 這個才是重點 問題說明Cookie編碼格式錯誤 解決辦法cookie存儲值是指明utf8國際編碼格式 如 ...
  • 閱讀目錄 作用 super 關鍵字 訪問控制許可權 初始化順序 @Override 與方法重寫 繼承抽象類 final 關鍵字 閱讀目錄 閱讀目錄 作用 super 關鍵字 訪問控制許可權 初始化順序 @Override 與方法重寫 繼承抽象類 final 關鍵字 作用 super 關鍵字 訪問控制許可權 ...
  • 1、什麼是JMS? JMS即Java消息服務(Java Message Service)應用程式介面,是一個Java平臺中關於面向消息中間件(Message Oriented MiddleWare)的API,用於在兩個應用程式之間,或分散式系統中發送消息,進行非同步通信。Java消息服務是一個與具體平 ...
  • EL Express Language 表達式語言 就是把<% 這裡可以寫java語言 %> 這種jsp的寫法簡化變為${ }的方式 例如 action="${pageContext.request.contextPath }/login" JSTL 是JSP Standard Tag Librar ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...