目錄
重載
重寫?
重載
? ? ? ? ?方法的重載是指在同一個類中定義多個方法, 他們具有相同的名稱, 但是具有不同的參數(shù)列表, 例如:
public void myMethod(int arg1) {
// 方法體
}
public void myMethod(int arg1, int arg2) {
// 方法體
}
public void myMethod(String arg1) {
// 方法體
}
? ? ? ? 此處我們看到三個不同參數(shù)的, 但是具有相同返回值和方法名的方法.
有如下測試案例:
public class Test {
public static void main(String[] args) {
Test_class test = new Test_class();
test.myMethod(1);
test.myMethod(1,2);
test.myMethod("i love you");
}
}
class Test_class {
public void myMethod(int arg1) {
System.out.println("參數(shù)為 int arg1");
}
public void myMethod(int arg1, int arg2) {
System.out.println("參數(shù)為 int arg1 和 int arg2");
}
public void myMethod(String arg1) {
System.out.println("參數(shù)為 String arg1");
}
}
運行結(jié)果為:
?我們將其中一個myMethod方法的返回值改為int類型:
對其結(jié)果并無影響, 重載的返回類型可以相同也可以不相同, 返回類型不做要求.
也就是說每個重載的方法, 都必須要有一個獨一無二的參數(shù)列表, 而返回類型不做要求.
例如有如下兩個重載的方法:
public String myMethod(int arg1) {
// 方法體
}
public int myMethod(int arg1) {
// 方法體
}
他們具有相同的方法名, 相同的參數(shù), 但是具不同的返回類型, 調(diào)用方法:
myMethod(1);
因為不同的返回值類型, JVM沒辦法分別到底要調(diào)用哪一個方法;
更深層次的原因: JVM調(diào)用方法是通過方法簽名來判斷到底要調(diào)用那個方法的, 什么是方法簽名?? 方法簽名 == 方法名稱 + 參數(shù)個數(shù) + 以及每個參數(shù)他們的參數(shù)類型 組成的一個唯一值, 這個唯一值就是方法簽名, 從方法簽名可以看出來, 返回類型不是簽名的組成部分, 因此不同的返回類型不能作為是否重載的標志, 所以JVM也就無法確定要調(diào)用哪個方法了.
訪問修飾限定符 是否對重載有影響???
?①方法重載對方法的訪問權(quán)限沒有特定的要求。在Java中,方法的訪問權(quán)限可以是public、protected、private或者默認(即不聲明任何訪問修飾符),而方法重載只是指在同一個類中定義了多個方法名相同但參數(shù)列表不同的方法。因此,方法重載并不會對方法的訪問權(quán)限有任何限制。
②無論是public、protected、private還是默認訪問權(quán)限的方法,都可以進行重載。重載的方法可以擁有不同的訪問權(quán)限,只要符合各自的訪問權(quán)限規(guī)則即可。例如,一個public的方法可以與一個private的方法重載,或者一個protected的方法可以與一個默認訪問權(quán)限的方法重載。
③需要注意的是,對于繼承關(guān)系中的子類來說,如果子類要重載父類中的方法,那么子類中重載的方法的訪問權(quán)限不能低于父類中被重載的方法的訪問權(quán)限。這是由于子類要繼承并覆蓋父類的方法,如果降低訪問權(quán)限可能會破壞封裝性。
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.action();
dog.action(5);
dog.action("小黑");
}
}
class Animal {
public void action() {
System.out.println("動物發(fā)出叫聲");
}
}
class Dog extends Animal{
@Override
public void action() {
System.out.println("小狗:汪汪汪");
}
protected void action(String name) {
System.out.println(name + " : 汪汪汪");
}
public int action(int age) {
System.out.println("the dog'age is " + age);
return 1;
}
}
?
此代碼中, public void action() {} 繼承了父類中的action, 然后子類中對繼承并重寫的action方法進行重載, 如上:?
重寫?
? ? ? ? ?子類在繼承父類后并不只是擁有了父類的屬性, 還可以對父類的屬性進行拓展, 即對父類的成員方法進行重寫.
? ? ? ? 了解一下重寫是怎么來的???
? ? ? ? 這里有一個animal類, 他是所有動物的父類, 這個animal類具有一個行為方法, 叫做action(), animal類可以派生很多子類, 例如說 dog類, cat 類等等, 我們抽象出來的代碼如下:
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.action();
Cat cat = new Cat();
cat.action();
}
}
class Animal {
public void action() {
System.out.println("動物發(fā)出叫聲");
}
}
class Dog extends Animal{
// null
}
class Cat extends Animal {
// null
}
? ? ? ? 可以看出來, Animal這個類里面的action方法, 可以泛指很多種動物的叫聲, 只要是繼承了這個Animal類的都可以, 但是僅僅只是泛指還不夠, 例如我們在小狗就是旺旺叫, 小貓就是喵喵叫, 這就顯得不夠靈活. 所以只是使用父類的action 方法, 不足以顯示出子類的特性, 所有我們就需要把這個父類繼承過來的方法進行重寫:
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.action();
Cat cat = new Cat();
cat.action();
}
}
class Animal {
public void action() {
System.out.println("動物發(fā)出叫聲");
}
}
class Dog extends Animal{
public void action() {
System.out.println("小狗 : 汪汪汪");
}
}
class Cat extends Animal {
public void action() {
System.out.println("小貓: 喵喵喵");
}
}
?對比如重載, 我們可以思考一下, 重寫對于返回值, 參數(shù)類型, 或者是權(quán)限修飾符??
規(guī)則:
- 參數(shù)列表必須完全與被重寫方法相同;
- 返回類型必須完全與被重寫方法的返回類型相同;
- 訪問權(quán)限不能比父類中被重寫的方法訪問權(quán)限更低;
- 父類的成員方法只能被它的子類重寫;
- 聲明為final的方法不能被重寫;
- 聲明為static的方法不能被重寫;
- 構(gòu)造方法不能被重寫;
?文章來源地址http://www.zghlxwxcb.cn/news/detail-656374.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-656374.html
?
?
到了這里,關(guān)于java面試基礎(chǔ) -- 方法重載 & 方法重寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!