關於Java中的過載與重寫,每一個java人肯定都學習過,這裡就再梳理一遍,加深一下印象,忘記的時候拿出來看一看就好了
過載與重寫的區別
過載發生在同一個類裡面,同一個方法,擁有不同的引數列表,不同的返回值型別;可以有不同的訪問許可權
重寫發生在子類上,也是針對同一個方法,只不過引數列表和順序必須與父類完全一致,返回值型別小於等於父類,丟擲的異常也要小於父類,訪問修飾符要大於等於父類
方法的重寫要遵循兩同兩小一大,解釋一下
- 兩同,代表方法名和引數列表相同
- 兩小,代表返回值型別、拋異常的範圍要小於或者等於父類
- 一大,代表重寫方法的訪問許可權要大於或者等於父類
- 既然講到了訪問許可權,那麼久索性列出來對比一下吧,一下是訪問許可權由大到小
- public > protected > 預設 > private
- 既然講到了訪問許可權,那麼久索性列出來對比一下吧,一下是訪問許可權由大到小
過載的例子
建立一個Father類,權當就是賣瓜的
public class Father {
/**
* 賣瓜的人是誰
*/
private String name;
/**
* 狀態
*/
private Integer status;
/**
* 成本
*/
private Double cost;
public Father() {
}
public Father(Integer status, Double cost) {
this.status = status;
this.cost = cost;
}
}
以下是Father類裡面的過載方法,再總結一遍,必須滿足所有的條件
- 方法名一致
- 引數列表不一致,返回值不一致
public void doSomething() {
System.out.println("大家好,我是賣瓜的");
}
public void doSomething(String name) {
System.out.println("大家好,我是賣瓜的,我的名字叫:" + name);
}
public double doSomething(double money) {
System.out.println("賣瓜營業額:" + money);
final double profit = money - this.cost;
System.out.println("除去成本,還剩:" + money);
return profit;
}
⚠️以下是錯誤的例子
-
雖然返回值不一致,但是引數列表卻是一樣的,達咩
-
返回值不一致,引數列表也不同,但是方法名卻不一致,這不是過載,而是另外一個方法了,也不行
重寫的例子
我們現在Father類新增上一個方法
/**
* 來自父親的感慨
* @return
* @throws Exception
*/
protected Father selfEvaluation() throws Exception {
System.out.println("父親正在感慨中....");
throw new Exception("在感慨的時間裡,被偷了兩個瓜");
}
new一個Son類,繼承Father,Son不想賣瓜,想自己搗鼓點什麼幹
public class Son extends Father {
@Override
public void doSomething() {
System.out.println("我父親是賣瓜的,但我不想賣瓜,我想幹點其他的");
}
@Override
public Son selfEvaluation() throws IllegalAccessException {
System.out.println("兒子正在感慨中....");
throw new IllegalAccessException("在感概的時間裡,被老闆抓住了,扣了20塊錢工資");
}
}
我們注意到,Son重寫了父類的
- 無參doSomething方法
- selfEvaluation方法
那麼,聰明的你,有沒有發現什麼呢?(重寫的原則:兩同兩小一大)
- Son類重寫的兩個方法,方法名和引數列表均是一致的
- Son類的返回值是自己,而Son繼承自Father,自然符合返回值要小於等於父類,同理,丟擲的異常也是
- Son類的訪問修飾符是public,訪問許可權是最大的,而父類的訪問修飾符是protected,所以也滿足重寫方法的訪問許可權要大於或者等於父類
結果
Father father = new Father(1,10D);
father.doSomething();
father.doSomething("碼農Amg");
father.doSomething(30D);
father.selfEvaluation();
System.out.println("----------------------------------");
Father son = new Son();
son.doSomething();
son.selfEvaluation();
總結
過載和重寫可以說是很很很基礎的東西,可以說是隨處可見啊,例如Arrays.sort方法就有這麼多種過載形式了,而子類重寫父類的方法也是很常見的,所以這個知識點一定要掌握