Java中的過載和重寫

碼農Amg發表於2021-11-13

關於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類裡面的過載方法,再總結一遍,必須滿足所有的條件

  1. 方法名一致
  2. 引數列表不一致,返回值不一致
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;
}

⚠️以下是錯誤的例子

  1. 雖然返回值不一致,但是引數列表卻是一樣的,達咩

    image

  2. 返回值不一致,引數列表也不同,但是方法名卻不一致,這不是過載,而是另外一個方法了,也不行

    image

重寫的例子

我們現在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重寫了父類的

  1. 無參doSomething方法
  2. selfEvaluation方法

那麼,聰明的你,有沒有發現什麼呢?(重寫的原則:兩同兩小一大

  1. Son類重寫的兩個方法,方法名和引數列表均是一致的
  2. Son類的返回值是自己,而Son繼承自Father,自然符合返回值要小於等於父類,同理,丟擲的異常也是
  3. 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();

image

image

總結

過載和重寫可以說是很很很基礎的東西,可以說是隨處可見啊,例如Arrays.sort方法就有這麼多種過載形式了,而子類重寫父類的方法也是很常見的,所以這個知識點一定要掌握

image

相關文章