1. 程式人生 > >java過載與重寫的區別+重寫父類equals方法的完美實現

java過載與重寫的區別+重寫父類equals方法的完美實現

【0】README

【1】java過載

1.1) 方法過載是讓類以統一的方式處理不同型別資料的一種手段。多個同名函式同時存在,具有不同的引數個數/型別。過載Overloading是一個類中多型性的一種表現。
1.2) Java的方法過載,就是在類中可以建立多個方法,它們具有相同的名字,但具有不同的引數和不同的定義。呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法, 這就是多型性。
1.3) 過載的時候,方法名要一樣,但是引數型別和個數不一樣,返回值型別可以相同也可以不相同。無法以返回型別作為過載函式的區分標準。

【2】java重寫

2.1) 父類與子類之間的多型性,對父類的函式進行重新定義。

如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。
2.2)若子類中的方法與父類中的某一方法具有相同的方法名、返回型別和引數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
2.3)子類函式的訪問修飾許可權不能少於父類的;

【3】下面給出編寫一個完美的 equals 方法的建議:

3.1)顯式引數命名為 otherObject, 稍後需要將它轉換為另一個叫做 other的變數;
3.2)檢測this 與 otherObject 是否引用同一個物件:


if(this == otherObject) return true; 實際上, 這是一種經常採用的形式, 因為計算這個等式要比一個一個地比較類中的域所付出的代價小得多;
3.3)檢測otherObject 是否為 null, 如果為 null ,則返回 false, 這項檢測很有必要:
if(otherObject == null) return false;
3.4)比較this 與 otherObject 是否屬於同一個類: 如果equals 的語義在每個子類中有所改變,就是用 getClass 進行檢測:if(getClass() != otherObject.getClass()) return false;
3.5) 將 otherObject 轉換為 相應的類型別變數:

ClassName other = (ClassName)otherObject;
3.6)現在開始對所有需要比較的域進行比較了:
使用 == 比較基本型別域, 使用 equals比較物件域, 如果所有的域都匹配返回 true, 否則返回 false;
return field1 == other.field1 && Objects.equals(field2, other.field2) && ……;
如果在子類中重新定義 equals, 就要在其中包含 呼叫 super.equals(other);
Hint)對於陣列型別的域, 可以使用靜態的Arrays.equals 方法檢測相應的 陣列元素是否相等;
Alert)看個荔枝(下面是實現 equals 方法的一種常見的錯誤,請結合上述內容對方法重寫的定義來分析):

3.7)依據以上規則,重寫equals方法(為什麼最後對 salary 和 name的比較方法不同,這是朋友些應該要注意的)
這裡寫圖片描述

package com.corejava.test;

import java.util.Objects;

public class Student
{
    private String name;
    private double salary;

    @Override
    public boolean equals(Object otherObject)
    {
        Student other;

        if(this == otherObject)//檢測this 與 otherObject 是否引用同一個物件
            return true;
        else if(otherObject == null)//檢測otherObject 是否為 null(很有必要 )
            return false;
        else if(getClass() != otherObject.getClass())//比較this 與 otherObject 是否屬於同一個類
            return false;

        other = (Student)otherObject;//將 otherObject 轉換為 相應的類型別變數

        return Objects.equals(name, other.name) //現在開始對所有需要比較的域進行比較
                && salary == other.salary; 
    }
}