java 可以重載等于號碼_Java面試之Java基礎4——重載與重寫的區別

目錄

重載與重寫的概念

重載與重寫的區別

重載與重寫的總結

構造器是否能被重寫override

為什么函數不能根據返回類型來區分重載

重載與重寫的概念

重載:同樣一個方法可以根據輸入參數列表的不同,做出不同的處理。普通方法和構造器方法都能夠重載。

方法重載:

/**

* 重載方法

*/

public class Print {

public void print(String str) {

System.out.println(str);

}

public void print(Integer i) {

System.out.println(i);

}

public void print(Float f) {

System.out.println(f);

}

public void print(Boolean b) {

System.out.println(b);

}

}

構造器重載

/**

* 重載構造器

*/

public class Print {

Print(String str){

System.out.println(str);

}

Print(Integer i){

System.out.println(i);

}

Print(Float f){

System.out.println(f);

}

public void print(Boolean b) {

System.out.println(b);

}

}

重寫:重寫是要在子類繼承父類的同名方法時,當輸入參數列表一樣時,要做出不同于父類的邏輯功能,就是覆蓋重寫父類方法。注意:重寫的方法上有一個@Override,表示該方法被重寫了。

/**

* 方法重寫

*/

class Father {

public void print(){

System.out.println("Father");

}

public void print(String str){

System.out.println("Father -> "+str);

}

}

class Son extends Father {

// 重寫print()方法

@Override

public void print() {

System.out.println("Son");

}

// 重寫print(String str)方法

@Override

public void print(String str) {

System.out.println("Son -> "+str);

}

}

重載與重寫的區別

重載的注意事項:發生在同一個類中,方法名必須相同。

方法重載與下列因素相關:

1. 參數個數不同

2. 參數類型不同

3. 參數的多類型順序不同

方法重載與下列因素無關:

1. 與參數的名稱無關

2. 與方法的返回值類型無關

下面是錯誤示例:

9dcd13af4b75d67933f2ba63472cf445.png

上面這句話嚴格來說是錯誤的,因為參數個數相同,但可以是類型不同

517d13f8f2e8b504351d528b0516b5c2.png

下面是參數個數相同,參數類型相同,但是順序不同。

02c82d08d279c78f58954f1a8059d4d7.png

參數名稱即使不同,但參數類型、參數列表、參數個數相同,也會報錯

bba04bba6a61a57f6a85bfa77973af70.png

即使返回類型不同,但方法名相同,參數類型、參數列表、參數個數相同,也會報錯

1ba94b15039601fabe22926cf1d7c5bf.png

重寫注意事項:發生在運行期,是兩個及以上的類,是子類對父類允許訪問的方法進行重新編寫。方法名、參數列表、參數順序必須相同,子類方法返回值類型比父類方法返回值類型更小或相等。

拋出異常范圍小于等于父類,訪問修飾符范圍大于等于父類。

如果父類方法訪問修飾符為private/final/static,則子類不能重寫該方法,但是被static修飾的方法能夠被再次聲明。

構造方法無法被重寫

重寫的方法上有一個@Override表示該方法被重寫了。

下面是關于重寫特點的代碼解釋。

1、拋出異常范圍小于等于父類

子類拋出異常范圍等于父類拋出異常范圍,不會報錯。

43a826910d6f67664a8b8be50b267f41.png

子類拋出異常范圍小于父類拋出異常范圍,不會報錯。

e324343b40572698694887000060d011.png

子類拋出異常范圍大于父類拋出異常范圍,會報錯。

f38179688ee0d4e1806ae0d80fb67ee5.png

2、訪問修飾符范圍大于等于父類

訪問修飾符的范圍:public > protected > private

子類訪問修飾符的范圍大于父類訪問修飾符的范圍,不會報錯

a0d1ea033be3d93f59ad9d2df5d168bb.png

子類訪問修飾符的范圍等于父類訪問修飾符的范圍,不會報錯

bb24009d98b46c456d7ce33f5726344f.png

子類訪問修飾符的范圍小于父類訪問修飾符的范圍,會報錯

567ee204e48d1f1d6e954c66e783f463.png

3、如果父類方法訪問修飾符為private/final/static,則子類不能重寫該方法,但是被static修飾的方法能夠被再次聲明。

使用private修飾的無法重寫

d3b49fbf353c5b7fbaffa286736cf142.png

使用final修飾的無法重寫

a93d756a8080ae8447ac966e037e2a59.png

使用static修飾的不能重寫,但能被再次聲明

ad70d0bb4051171b636dd9b7ef0f8bb4.png

下面的代碼也不能稱之為重寫:當向上轉型時,調用的還是父類的方法。

class Father {

static void print() {

System.out.println("Father");

}

}

class Son extends Father {

static void print() {

System.out.println("Son");

}

}

public class Demo {

public static void main(String[] args) {

Son.print();

Father son=new Son();

son.print();

}

}

/*

* 打印結果:

* Son

* Father

*/

在Java中,如果父類含有一個靜態方法,且在子類中也含有一個返回類型,方法名、參數列表等都與之相同的的靜態方法,在子類中只是對父類的該同名方法進行隱藏,并不是重寫。父類與子類含有的其實是兩個沒有關系的方法,兩者的行為不具有多態性。

在上面的例子中,print方法與類發生了關聯,但它不在乎什么類型的類正在創建它,而僅在乎引用的類型。在Father son = new Son()中,son是類Son在內存中的一個Father類型的引用,如果一個static修飾的方法被調用了,JVM不會檢查什么類型正在指向它,只會調用與Father類相關聯的方法的實例。

4、?類?法返回值類型應??類?法返回值類型更?或相等

如果?法的返回類型是void和基本數據類型,則返回值重寫時不可修改。但是如果?法的返回值是引?類型,重寫時是可以返回該引?類型的?類的。

class Father {

public String print() {

return "Father";

}

}

class Son extends Father {

@Override

public String print() {

return "Son";

}

public Father father(){

return new Father();

}

}

class SonSon extends Son {

@Override

public String print() {

return "SonSon";

}

@Override

public Father father() {

return new Son();

}

}

重載與重寫的總結

重載重寫概念發生在一個類中。一個方法根據輸入參數列表的不同,做出不同的邏輯處理。普通方法和構造器都能夠重載發生在子類和父類中。子類方法繼承父類的同名方法,重新寫方法的處理邏輯。普通方法能夠重寫,構造器不能夠重寫。

特征普通方法重載方法名相同;構造器重載與類名相同。重寫的方法上有一個@Override注解,表示該方法被重寫了。

相關因素方法重載與參數個數、參數類型、多類型參數的順序的不同相關。(即方法的參數列表要不一樣)方法重寫與參數個數、參數類型、多類型參數的順序的相同相關。(即方法的參數列表要一樣)

不相關因素方法重載與參數的名稱、方法的返回值類型無關。(即重載方法的參數名稱、返回值類型是否一樣不重要)方法重寫的參數名稱可以改變,但返回值類型要小于等于父類方法的返回值類型。

其他可以拋出不同的異常,可以有不同修飾符。子類拋出的異常范圍要小于等于父類,訪問修飾符的范圍要大與等于父類。如果父類方法被private/final/static修飾,那么子類不能重寫該方法。

構造器是否能被重寫override

構造器Constructor 不能被 override(重寫),但是可以 overload(重載),所以你可以看到?個類中有多個構造函數的情況。

88367d6717a2d8dd62fc07ffb1f24641.png

構造器可以重載

96935c54368835ad8543bbfaf2b67213.png

為什么函數不能根據返回類型來區分重載

為什么不能根據返回類型來區分重載?因為調用時不能指定類型信息,編譯器不知道你要調用哪個函數。

2597cfd53886646ef5543461afa907df.png

當執行add(1, 2)這個方法時,不需要保存返回值,那么該調用哪個方法呢?這很好不區分吧。

如果需要返回值,比如說float sum = add(1, 2);還好區分些,至少可以根據前面的float推斷出要調用哪個方法。但如果不需要返回值,那么幾乎難以區分。

如果方法的返回值不加以利用,那么返回值將毫無用處,自然無法作為區別的標準。

更多的適合方法的返回值是函數運行后的一個結果,是方法的調用者和被調用者通信的關鍵,并不能作為某個方法的唯一標識。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372205.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372205.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二維數組、多維數組

二維數組: 定義二維數組 int[,] myArray new int[幾個一維數組,數組中的個數]; 數組可以具有多個維度。例如,下列聲明創建一個四行兩列的二維數組(可以理解為4個1維數組,數組中包含2個元素): int[,] myArray new int[4,2]; int[…

一張大圖片有多個小圖片

這個頁面也是我看到別人的寫的,感覺不錯,就自己留下了為了以后自己可以容易找到,也希望可以方便到別人。 寫這個頁面 需要注意的是: 1.寫每一個小圖片的位置時候,要用id,這樣等級就高了,不然不起作用。 2.因…

java中如何調用dal接口案例_關于Java:接口的目的

好吧,我認為接口是一種強制對象實現一定數量功能的方法,而不必使用繼承。有點像合同。我半明白他們的意思。但是,如果界面中的所有內容都是:public interface animal{void eat(object food);}它沒有這樣的實現,那么無論…

Android Studio混淆

這一篇說一下Android Studio的代碼混淆: 第一步:要想使混淆生效,要修改項目(App)下的build.gradle一處內容:minifyEnabled 的值 設置為true,當前項目就可以使用混淆了。 apply plugin: com.and…

內存訪問模式很重要

在高性能計算中,通常會說高速緩存未命中的代價是算法的最大性能損失。 多年來,處理器速度的提高大大超過了延遲到主內存的速度。 通過更寬的多通道總線,到主內存的帶寬已大大增加,但是延遲并未顯著減少。 為了掩蓋這種延遲&#x…

上傳頭像將光標去掉

οnfοcus"this.blur();" unselectable"on" οnfοcus"this.blur();"支持火狐,谷歌等主流瀏覽器 unselectable支持ie瀏覽器轉載于:https://www.cnblogs.com/jar-gon/p/6841239.html

java底層 文件操作_JAVA的文件操作【轉】

11.3 I/O類使用由于在IO操作中,需要使用的數據源有很多,作為一個IO技術的初學者,從讀寫文件開始學習IO技術是一個比較好的選擇。因為文件是一種常見的數據源,而且讀寫文件也是程序員進行IO編程的一個基本能力。本章IO類的使用就從…

JAVA多線程,真的能提高效率嗎

舉個栗子 比如挖一個隧道,有2種開工方法1、只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單線程 2、在山的兩頭挖,同時開工,最后在山的中間接通,從而打通隧道,這感覺…

Java 8:測試Lambda水

Java 8大約有一年的時間了,它具有我非常期待的語言功能: Lambda Expression 。 令人遺憾的是,另一個重要功能Java平臺模塊已延遲到Java9。但是,將lambda表達式(或閉包)添加到該語言中將使Java編程變得更好。…

java定義js函數_JS中可以先使用函數,然后再定義.

首先要說明的,下面這種方式是對的,雖然不知道為什么,很奇怪為什么可以先使用,再定義,希望有了解的人可以給個說法.hello(www.openj.cn);function hello(name){alert("hello " name)};本文首發于 http://blog.openj.cn下面的這種定義函數方式,對于寫一些比較復雜的代碼…

基于閥值的工作流引擎設計

最近在做工作流處理流程部分的工作,順便研究了一下工作流引擎的一些設計理念和原理。由于以前接觸過人工智能神經網絡的一些東西,發現工作流引擎和神經網絡還是頗有一些相似之處,都是滿足一定的條件下向下一個節點傳遞。在神經網絡的神經元中…

Git之安裝管理

1.Git安裝部署 Git是分布式的版本控制系統,我們只要有了一個原始Git版本倉庫,就可以讓其他主機克隆走這個原始版本倉庫,從而使得一個Git版本倉庫可以被同時分布到不同的主機之上,并且每臺主機的版本庫都是一樣的,沒有主…

Java執行程序服務類型

ExecutorService功能是Java 5附帶的。它擴展了Executor接口,并提供了線程池功能來執行異步簡短任務。 使用Java 6提供的ExecutorService接口有五種異步執行任務的方法。 ExecutorService execService Executors.newCachedThreadPool(); 這…

MySQL的主動優化和被動優化_MySQL“被動”性能優化匯總!

年少不知優化苦,遇坑方知優化難。 ——村口王大爺本文內容導圖如下:我之前有很多文章都在講性能優化的問題,比如下面這些:當然,本篇也是關于性能優化的,那性能優化就應該一把梭子嗎?還是要符合一…

python2

一、管理庫的安裝 安裝pip 提示報錯:安裝pip提示No module named setuptools Windows環境下Python默認是沒有安裝setuptools這個模塊的,這也是一個第三方模塊。下載地址為http://pypi.python.org/pypi/setuptools。下載后直接運行ez_setup.py 參考地址&…

Java Mybatis

Mybatis轉載于:https://www.cnblogs.com/leading-index/p/6853031.html

Java例外:java lang NoSuchMethodError

如果查看錯誤消息java.lang.NoSuchMethodError,您可能會理解Java虛擬機正在嘗試向我們表明您調用的方法在類或接口中不可用。 您還可能在執行沒有公共static void main()方法的類時拋出此錯誤。要了解其背后的原因,請閱讀本文。 …

【圖】最短路徑——Floyed算法和Dijkstra算法

最短路徑問題(floyed.cpp dijkstra.cpp) 題目描述平面上有n個點(n<100)&#xff0c;每個點的坐標均在-10000&#xff5e;10000之間。其中的一些點之間有連線。若有連線&#xff0c;則表示可從一個點到達另一個點&#xff0c;即兩點間有通路&#xff0c;通路的距離為兩點間的…

java的empty_Java Stack empty()方法與示例

堆棧類empty()方法empty()方法在java.util包中可用。empty()方法用于檢查此堆棧是否為空。empty()方法是一個非靜態方法&#xff0c;只能通過類對象訪問&#xff0c;如果嘗試使用類名稱訪問該方法&#xff0c;則會收到錯誤消息。在檢查空狀態時&#xff0c;empty()方法不會引發…

Java并發– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并發實用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier與CountDownLatch類似&#xff0c;我們在上…