【JAVA】筆記(6)--- toString方法;equals方法;finalize方法;package與import;內部類;

猿頭猿腦的王狗蛋發表於2021-11-14

toString:

1.每建立一個類時,都要重寫 toString 方法,這是敲程式碼的基本素養;

2.重寫規則:簡單明瞭;

3.String 類中也有toString方法(SUN公司寫的);

equals:

1.每建立一個類時,都要重寫 equals 方法(因為 equals 方法比較的是地址,而我們需要比較物件的內容),這也是敲程式碼的基本素養;

2.作用:用來比較兩個物件是否一致 / 相等;

3.重寫規則:看自己的需求(你認為什麼東西相等的時,物件相同);

注意:java 中比較基本資料型別大小一律用 “ == ” ,比較引用資料型別用 “ equals方法 ” ; 

輔助理解程式碼;

import java.util.Objects;
class People{
    private int old;
    private String name;
    public People() {
    }
    public People(int old, String name) {
        this.old = old;
        this.name = name;
    }
    public int getOld() {
        return old;
    }
    public void setOld(int old) {
        this.old = old;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return "People{" +
                "old=" + old +
                ", name='" + name + '\'' +
                '}';
    }
    //兩個人什麼時候指的是同一個人?(在此類中只有年齡與名字兩種屬性的情況下)?那就年齡且名字相同唄
    public boolean equals(Object o) {
        //若匯入的物件就是此物件,那肯定相同
        if (this == o) return true;
        //若匯入的物件地址為空指標或者物件不是此類的例項,那肯定不同
        if (o == null ||!(o instanceof People)) return false;
        //執行到這裡物件 o 一定是 people 的例項,所以可以直接進行向下轉型
        People p = (People) o;
        return this.old == p.old && this.name.equals(p.name);
    }
}
class Room{
    //房間號
    private int no;
    //房間型別
    private String type;
    //房間是否空閒
    private boolean status;
    public Room() {
    }
    public Room(int no, String type, boolean status) {
        this.no = no;
        this.type = type;
        this.status = status;
    }
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public boolean isStatus() {
        return status;
    }
    public void setStatus(boolean status) {
        this.status = status;
    }
    public String toString() {
        return "Room{" +
                "no=" + no +
                ", type='" + type + '\'' +
                ", status=" + status +
                '}';
    }
    //倆個房間什麼時候指的是同一房間?只要房間號相同,那必然就是一個房間呀
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null ||!(o instanceof Room)) return false;
        Room r= (Room) o;
        return this.no==r.no;
    }
}
public class 重寫equals {
    public static void main(String[] args) {
        People p1=new People(10,"張三");
        People p2=new People(20,"張三");
        People p3=new People(10,"李四");
        People p4=new People(10,"張三");
        System.out.println(p1.equals(p2)?"是同一人":"不是同一人");
        System.out.println(p1.equals(p3)?"是同一人":"不是同一人");
        System.out.println(p1.equals(p4)?"是同一人":"不是同一人");
        Room r1=new Room(101,"單人間",true);
        Room r2=new Room(101,"單人間",false);
        Room r3=new Room(201,"單人間",true);
        System.out.println(r1.equals(r2)?"是同一房間":"不是同一房間");
        System.out.println(r1.equals(r3)?"是同一房間":"不是同一房間");
        //簡潔明瞭
        System.out.println(p1);
        //簡潔明瞭
        System.out.println(r1);
    }
}

執行結果:
--------------------------
不是同一人
不是同一人
是同一人
是同一房間
不是同一房間
People{old=10, name='張三'}
Room{no=101, type='單人間', status=true}

Process finished with exit code 0

Object 類中的 finalize ( ) 方法:

1.格式: protected void finalize ( ) throws Throwable   {   方法體    }

2.作用:可以類比靜態程式碼塊,因在類載入時,會執行靜態程式碼塊中的的程式碼,所以又稱為類載入時機;而在物件記憶體被垃圾回收器回收時,在其類體中的 finalize ( ) 方法就會執行,所以又叫做垃圾回收時機;

舉個例子:(當qq物件被垃圾回收器回收時,會輸出:” qq即將被銷燬 “)

class qq{
    protected void finalize() throws Throwable {
        System.out.println("qq即將被銷燬!");
    }
}

package與import:
1.package:出現在 java原始檔的第一行;格式: package + 包名;

2.import:出現在所有類之上;格式:import + 完整類名 / 包名 . * ;  ,例如:import  java . util . Scanner ;//完整包名,或寫成  import  java . util . *  ;//都可以訪問” Scanner “類;

3.注意:導包中的 “ * ” 只限於類名,例如:import java.* ; //這樣就是錯誤的;

  訪問許可權修飾符(按許可權大小排序):

【JAVA】筆記(6)--- toString方法;equals方法;finalize方法;package與import;內部類;

修飾物件:屬性(4個都行)/方法(4個都行)/類(public / 預設 )/介面(public / 預設)

內部類:

1.分類:靜態內部類(類似於靜態變數);例項內部類(類似於例項變數);區域性內部類(類似於區域性變數);

2.由於內部類的缺點(程式碼可讀性差;類沒有名字,無法重複使用),所以內部類幾乎不用;

3.就匿名內部類稍微記一下:

public class pra{
    public static void main(String[] args) {
        //對Math物件中的sum方法進行重寫,正常應該找一個子類繼承Math,再對其方法進行重寫,但也可以通過匿名內部類的方法覆蓋對其進行重寫:
        int z=new Math(){
            public int sum(int x, int y) {
                return x+y;
            }
        }.sum(1,2);
        System.out.println(z);
    }
}
class Math {
    public int sum(int x,int y){
        return 0;
    }
}

執行結果:
------------------
3

Process finished with exit code 0

隨筆:

1..Object 類中的 hashCode 方法:

1)格式: public native int hashCode ( ) ;   (native 表示底層呼叫C++程式)

2)作用:通過 雜湊演算法 運算物件記憶體地址得到的一個值;

舉個例子:

public class pra{
    public static void main(String[] args) {
        Math math1=new Math();
        System.out.println(math1.hashCode()+"------將math1儲存的物件記憶體地址通過雜湊演算法得到的值");
        Math math2=new Math();
        System.out.println(math2.hashCode()+"------將math2儲存的物件記憶體地址通過雜湊演算法得到的值");
    }
}
class Math {
}

執行結果:
-------------------
1163157884------將math1儲存的物件記憶體地址通過雜湊演算法得到的值
1956725890------將math2儲存的物件記憶體地址通過雜湊演算法得到的值

Process finished with exit code 0

由於博主目前只是一隻猿寶寶,所以有些地方可能說的有些片面,若前輩們能夠指點一二就更好了      (~ ̄(OO) ̄)ブ

 

相關文章