Java 類和對象中經典問題

這塊也不知道該怎麼總結,感受不少,但又不知道總結什麼。可能高手到必定境界無招勝有招吧,哈哈,自吹了。java

總結本身以爲比較出問題或者以前面試中影響比較深入的內容吧。面試

訪問修飾符public,private,protected,以及不寫(默認)時的區別?

修飾符 當前類 同包內 子類 其餘類
private - - -
default - -
protected -
public

關於靜態代碼塊、代碼塊、構造函數的執行順序問題

public class Father {
    static {
        System.out.println("Father static");
    }
    {
        System.out.println("Father {}");
    }
    public Father() {
        System.out.println("Father()");
    }
}

public class Son extends Father {
    static {
        System.out.println("Son static");
    }
    {
        System.out.println("Son {}");
    }
    public Son() {
        System.out.println("Son()");
    }
    public static void main(String[] args) {
        Son son = new Son();
    }
}

打印結果:ide

輸入圖片說明

重寫和重載

重載是同一個類中,而重寫存在於子父類中。函數

知足條件:this

重寫code

首先子類修飾符可見範圍不能小於父類,返回值類型須要相同,方法名相同,方法的參數類型、個數、順序須要相同,固然參數名容許不一樣。對象

重載繼承

方法名必須相同,方法參數的類型、個數或者順序不能相同。注意:返回值類型不一樣(特別注意:返回值類型能夠是父類返回值類型的子類),其餘相同不能構成重載。圖片

public void sayHello(String name, Date time) {
        System.out.println("hello " + name + ",如今是" + time);
    }

    // 特別注意:
    // 返回值類型不一樣是沒法工程重載
    public Date sayHello(String name, Date time) {
        System.out.println("hello " + name + ",如今是" + time);
        return time;
    }

    // 參數順序不一樣
    public void sayHello(Date time, String name) {
        System.out.println("hello " + name + ",如今是" + time);
    }
    
    // 參數個數不一樣
    public void sayHello(String name) {
        System.out.println("hello " + name);
    }

    // 參數類型不一樣
    public void sayHello(String name, String context) {
        System.out.println("hello " + name + "," + context);
    }

final修飾的類、函數、變量的特色

  • final修飾的類不能被繼承
  • final修飾的函數不能被重寫
  • final修飾的變量的引用不能被修改,但能修改該引用的內容
private final List<String> list = new ArrayList<String>();
    
    // 特別注意:
    // 錯誤的修改final修飾變量的引用
    list = new ArrayList<String>();
    
    // 能夠修改引用的內容
    public void test() {
        list.add("A");
    }

如何實現equals方法

public class Student {

    // 爲了代碼簡約和正確性,不考慮對狀態的封裝
    public String name;
    public int age;

    @Override
    public boolean equals(Object o) {
        // 1. 判斷引用的對象是否相同,相同則爲相等
        if (this == o) return true;

        // 2. 判斷傳入對象是否爲空,由於調用equals的對象確定不爲空,若是object爲空,則確定不等
        //    判斷傳入對象和this對象是否爲同一個類構建的對象,若是不是,則確定不等
        if (o == null || getClass() != o.getClass()) return false;

        // 3. 若是是同一個類構建的對象,則能夠轉型爲相同類的對象,方便觀察其狀態是否相同
        Student student = (Student) o;

        // 4. 觀察狀態是否相同。若是是基本數據類型,簡單粗暴的使用== 。若是是對象,則還須要使用equals方法判斷
        if (age != student.age) return false;
        return name.equals(student.name);

    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + age;
        return result;
    }
}

equals方法和hascode方法的關係

  • 若是兩個對象調用equals返回true,則他們的hascode必須相同
  • 若是兩個對象的hascode相同,並不能說明這兩個對象equals
相關文章
相關標籤/搜索