1. 程式人生 > 實用技巧 >JavaSE學習筆記 - Object類、日期類

JavaSE學習筆記 - Object類、日期類

Object

  • Object 類是 Java 中所有類的超類,Java 中每個類都是由 Object 這個類拓展而來的。可以使用 Object 型別的變數引用任何型別的物件。
  • Object是類層次結構的根類,每個類都是使用 Object 類作為超類。Object 可以對 toString() 和 equals() 方法。我們在列印物件的時候列印是物件呼叫 toString() 的結果。

toString() 的重寫:toString() 原始碼 :toString() 方法預設返回結果是地址值,但是在開發中,我們常常需要檢視物件屬性的字串形式,所以我們可以重寫 toString() 以字串的形式來輸出物件的屬性。

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
//hashCode,這個方法針對不同的物件返回不同的物件,每一個物件都有一個唯一的雜湊值
//Integer.toHexString,獲取雜湊值的16進位制
//getClass().getName,獲取類名
//getClass(),獲得一個類的類物件
}

package cn.edu.zut;

public class Person {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package cn.edu.zut;

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(18);
        person.setName("aaa");
        System.out.println(person.toString());//未重寫toString:cn.edu.zut.Person@1b6d3586
        System.out.println(person.toString());//重寫toString:Person{name='aaa', age=18}
    }
}

finalize(): 用於垃圾回收,不需要手動呼叫,要有 JVM 來呼叫,垃圾回收器確定不存在這個物件的引用的時候,物件的垃圾回收期呼叫這個方法。Java 中的垃圾回收器不是輕易啟動的,垃圾太少或者時間沒有到,有可能啟動,有可能不啟動。垃圾回收器在回收某一個物件的時候就會呼叫這個物件的 finalize 方法。\(System.gc\) 可以告知 JVM 儘量回收資源,但是也不一定啟動。
equals(): 在Object 中是用於檢測一個物件是否等於另外一個物件。Object 類中實現的 equals 方法是比較兩個物件的引用是否相同,如果我們重寫 equals 方法,就可以對物件的屬性進行比較。
==: 基本資料型別比較的是值,引用型別比較的是地址。基本資料型別是在棧中,直接比較值,基本資料型別有自己的預設值;引用型別變數空間儲存的是一個地址,在進行比較的時候比較的就是地址,引用資料型別預設值是 null。

public boolean equals(Object obj) {
    return (this == obj);
}
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    //判斷傳過來的是否是Person型別,相當於o instanceof Person
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;//如果是,則轉換成真身
    return age == person.age && Objects.equals(name, person.name);
}

Objects 類

  • 在 JDK 7 中,新添加了一個工具類 Objects 類,通過 equals 方法可以解決 Object 類中的空指標異常。
public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

Date

package untitled;

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date);//Thu Jul 23 18:22:54 CST 2020
        long time = System.currentTimeMillis();
        Date date1 = new Date(time);
        System.out.println(date1.getTime());//1595499774478
        System.out.println(time);//1595499774478
        System.out.println(date1);//Thu Jul 23 18:22:54 CST 2020
        Date date2 = new Date(time - 24 * 60 * 60 * 1000);
        System.out.println(date2);//Thu Jul 23 18:22:54 CST 2020
    }
}

SimpleDateFormat

package untitled;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
    public static void main(String[] args) throws ParseException {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = sdf.format(date);
        System.out.println(str);//2020-07-23 18:25:07
        Date date1 = sdf.parse(str);
        System.out.println(date1);//Thu Jul 23 18:25:07 CST 2020
    }
}

Calendar

package untitled;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) throws ParseException {
        //Calendar calendar = new GregorianCalendar(2020, 7, 23);
        //Calendar calendar = new GregorianCalendar();
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(year + " " + month + " " + day);//2020 6 23
        calendar.set(Calendar.MONTH, 7);
        System.out.println(calendar);
        calendar.add(Calendar.DAY_OF_MONTH, 1);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//1
        Date date = calendar.getTime();
        System.out.println(date);//Mon Aug 24 18:35:51 CST 2020
        calendar.setTime(new Date());
        System.out.println(calendar);//2020.6.23
    }
}

LocalDate

import java.time.DayOfWeek;
import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        System.out.println(date);//2020-07-30
        date = LocalDate.of(2020, 1, 1);
        int year = date.getYear();
        int month = date.getMonthValue();
        int day = date.getDayOfMonth();
        DayOfWeek week = date.getDayOfWeek();
        System.out.println(year + "-" + month + "-" + day + " 星期" + week.getValue());//2020-1-1 星期3
        //在date基礎上增加30天
        LocalDate date1 = date.plusDays(31);
        LocalDate date2 = date1.minusDays(31);//
        System.out.println(date1);//2020-02-01 之後的31天
        System.out.println(date2);//2020-01-01 之前的31天
    }
}