?
Overload Override Overwrite三者區(qū)別:
?
Java中,有一個名叫方法簽名的東西,它的定義是這樣的
Definition: Two of the components of a method declaration comprise the method signature—the method’s name and the parameter types.
大概意思是,方法簽名有兩部分組成——方法名和參數(shù)列表
我上面的函數(shù)的方法簽名就是 hand(int a,int b) ?而簡單來說,JVM就是通過方法簽名來決定去調(diào)用哪一個方法的,而從方法簽名的組成部分來說,返回類型并不在方法簽名中,所以當(dāng)一個類中出現(xiàn)方法名參數(shù)列表相同,只有返回類型不同時,JVM無法根據(jù)方法簽名來確定該調(diào)用哪一個方法,所以會報錯。
參考:https://blog.csdn.net/qq_53574615/article/details/130379554
擴展:
可以通過修改字節(jié)碼,把函數(shù)修改成同名:?
構(gòu)造兩個不同名字 相同參數(shù)的成員函數(shù):
public class OverWrite {
public String getString(String str) {
return str;
}
public void getString1(String str) {
return;
}
}
通過javap -v 命令查看字節(jié)碼:
D:\Program Files\Java\jdk1.8.0_331\bin>javap.exe -v D:\project\test\out\production\test\OverWrite.class
Classfile /D:/project/test/out/production/test/OverWrite.class
Last modified 2023-8-17; size 504 bytes
MD5 checksum 40c07ae9b391609cd8fb00b3d2924ce2
Compiled from "OverWrite.java"
public class OverWrite
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #3.#19 // java/lang/Object."<init>":()V
#2 = Class #20 // OverWrite
#3 = Class #21 // java/lang/Object
#4 = Utf8 <init>
#5 = Utf8 ()V
#6 = Utf8 Code
#7 = Utf8 LineNumberTable
#8 = Utf8 LocalVariableTable
#9 = Utf8 this
#10 = Utf8 LOverWrite;
#11 = Utf8 getString
#12 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#13 = Utf8 str
#14 = Utf8 Ljava/lang/String;
#15 = Utf8 getString1
#16 = Utf8 (Ljava/lang/String;)V
#17 = Utf8 SourceFile
#18 = Utf8 OverWrite.java
#19 = NameAndType #4:#5 // "<init>":()V
#20 = Utf8 OverWrite
#21 = Utf8 java/lang/Object
{
public OverWrite();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LOverWrite;
public java.lang.String getString(java.lang.String);
descriptor: (Ljava/lang/String;)Ljava/lang/String;
flags: ACC_PUBLIC
Code:
stack=1, locals=2, args_size=2
0: aload_1
1: areturn
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 2 0 this LOverWrite;
0 2 1 str Ljava/lang/String;
public void getString1(java.lang.String);
descriptor: (Ljava/lang/String;)V
flags: ACC_PUBLIC
Code:
stack=0, locals=2, args_size=2
0: return
LineNumberTable:
line 7: 0
LocalVariableTable:
Start Length Slot Name Signature
0 1 0 this LOverWrite;
0 1 1 str Ljava/lang/String;
}
SourceFile: "OverWrite.java"
可以看到getString 和 getString1 的兩個函數(shù)定義
可以通過字節(jié)碼修改工具把getString1改成getString,實際class還是可以跑的。?
Main函數(shù)中記錄了調(diào)用的返回值信息:
?所以即使OverWrite.class中有兩個同名不同返回值的函數(shù),JVM可以進行正常跑,只不過java編譯器做了如此限定。
?知識來源:
【基礎(chǔ)】重載和重寫的區(qū)別_嗶哩嗶哩_bilibili
【2023年面試】Java中重寫和重載的區(qū)別_嗶哩嗶哩_bilibili文章來源:http://www.zghlxwxcb.cn/news/detail-653992.html
【23版面試突擊】Overload、Override、Overwrite的區(qū)別_嗶哩嗶哩_bilibili文章來源地址http://www.zghlxwxcb.cn/news/detail-653992.html
到了這里,關(guān)于java八股文面試[java基礎(chǔ)]—— 重載 和 重寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!