1. 程式人生 > >Java SE面向物件--12.Object、常用API、包裝類

Java SE面向物件--12.Object、常用API、包裝類

學習目標

Object類

Date、DataFormat、Calendar

System類

StringBuilder

包裝類

一、Object類

1、概述:Object類是所有類的父類、有些類直接繼承Object、而另一些類間接繼承Object類

2、構造方法:public  Object();

3、常用方法:

3.1、getClass();獲取型別、判斷物件的真實型別

// instanceof 判斷一個物件是否是一個具體類的例項
        if (p instanceof Student) {
            System.out.println("p是studnet例項");
        }

        // getClass(); 獲取型別, 判斷物件的真實型別, 不包含父類繼承的型別.
        /*
            獲取型別有兩種方式 :
            1. 物件獲取     物件名.getClass(); 方法
            2. 型別獲取     型別.class 屬性
         */
        if (p.getClass() == Student.class) {
            System.out.println("型別一樣");
        }

3.2、toString();返回該物件的字串表示。該字串內容就是物件的型別[email protected]+記憶體地址值。覆蓋重寫。

@Override
    public String toString() {
        // `非靜態方法中 / 物件方法` 屬性使用, 或方法呼叫,
        // 預設之前都有 this 關鍵字.  this.name, this.age, this.introduce();
        return "Student {name = " + name + ", age = " + age + "}";
    }

3.3、equals(Object  obj);指示其他某個物件是否與此物件“相等”。預設是指物件“地址值”、重寫好可比較物件屬性、"=="表示對比二個基本型別、equals對比二個引用型別

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return age == student.age &&
            Objects.equals(name, student.name);
}

3.3、public int hashCode​();返回物件的雜湊碼值。

3.4、protected Object clone​(); 建立並返回此物件的副本

3.5、public final void notify​() ;喚醒正在等待物件監視器的單個執行緒

3.6、public final void notifyAll​();喚醒正在等待物件監視器的所有執行緒。

3.7、public final void wait​();導致當前執行緒等待,直到另一個執行緒呼叫該物件的 notify()方法或 notifyAll()方法。

注:上面沒有例項的在後面會學到。現在作為了解。

4、Objects工具類

4.1、概述:工具類、方法基本都為static、直接使用該工具類的類名實現呼叫

4.2、static boolean equals​(Object a, Object b) ;判斷二個引數資料是否相等

區別:==比較的是2個物件的地址值,而equals比較的是2個物件的內容,顯然,當equals為true時,==不一定為true。

二、Date、DateFormat、Calendar 日期類

1.1、Date 日期類

1.2、概述:獲取當前的日期、精確到毫秒

1.3、構造方法:new Date();建立一個表示當前時間日期物件

1.4、常用方法:

1.4.1、new Date(long time);建立一個從“標準時間”開始的時間日期物件(1970-1-1 00:00:00)中國東八區

1.4.1、long getTime(); 獲取從標準時間到現在總共經過的毫秒數、1s = 1000ms

public class DateTest1 {
    public static void main(String[] args) {

        // 1. 建立一個當前時間日期物件
        Date date = new Date();
        // date = Thu Aug 16 16:21:46 CST 2018
        System.out.println("date = " + date);

        // 2. 建立一個從標準時間開始的時間日期物件
        Date date2 = new Date(0L);
        // date2 = Thu Jan 01 08:00:00 CST 1970
        System.out.println("date2 = " + date2);

        // 3. getTime(); 獲取時間毫秒數
        long time = date.getTime();
        System.out.println("time = " + time);

        // 4. 演示 :
        Date date3 = new Date(time);
        System.out.println("date3 = " + date3);
    }
}

2、DateFormat 日期格式化

2.1、概述:日期格式化類、DateFormat為抽象類、所以要java.text.SimpleDateFormat子類實現

2.2、構造方法:new  SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

2.3、常用方法:

2.3.1、String  format(Date date)將一個日期物件轉換為一個字串物件.

2.3.2、Date  parse(String source) 將一個字串物件轉換為一個日期物件

public class TestDateFormat {
    public static void main(String[] args) throws ParseException {

        // 1. 建立一個日期格式類物件
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 2. 格式化 (日期 -> 字串)
        String str = df.format(new Date());
        // str = 2018-08-16 16:50:17
        System.out.println("str = " + str);

        // 3. 解析 (字串 -> 日期)
        String dateStr = "2008年08月08日 08:08:08";

        SimpleDateFormat df2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date date = df2.parse(dateStr);
        // date = Fri Aug 08 08:08:08 CST 2008
        System.out.println("date = " + date);
    }
}

3、Calendar 日曆類

3.1、概述:public abstract class Calendar  extends Object 是一個抽象類

3.2、獲取物件:Calendar.getInstance();獲取當前時間/日期表示的日物件

3.3、常用方法:

3.3.1、int get​(int field) ;獲取 `年月日` 元件.

3.3.2、void set​(int field, int value) ;給指定的元件設定對應的數值.

3.3.3、void add(int field, int value); 根據日曆的規則,將指定的時間量新增或減去給定的日曆欄位。

public class TestCalendar {
    public static void main(String[] args) {

        // l. 建立一個表示當前 `時間/日期` 的日曆物件
        Calendar now = Calendar.getInstance();
        System.out.println("now = " + now);

        // 2. get 方法
        /*
        int i = now.get(1);     程式碼的閱讀性太差
        System.out.println("i = " + i);   2018
        */
        printCalendar(now);

        // 3. set 方法
        // 需求1 : 回到 2008 年.
        now.set(Calendar.YEAR, 2008);

        // 需求2 : 將 day 設定為 8 號.
        now.set(Calendar.DAY_OF_MONTH, 8);

        printCalendar(now);

        // 4. add 新增
        // 需求3 : 去到 100 年之後.
        now.add(Calendar.YEAR, 100);

        // 需求4 : 回到半年之前.
        now.add(Calendar.MONTH, -6);

        printCalendar(now);
    }

    // 定義一個方法, 輸出年月日
    public static void printCalendar(Calendar now) {
        int year = now.get(Calendar.YEAR);
        int month = now.get(Calendar.MONTH) + 1;    // 0 ~ 11
        int day = now.get(Calendar.DAY_OF_MONTH);
        System.out.println("今天是 : " + year + "年" + month + "月" + day + "日.");
    }
}

三、System 系統類

1、概述:public final class System extends Object;System類提供的設施包括標準輸入,標準輸出和錯誤輸出流;

2、欄位:

2.1、 in 標準輸入流 new Scanner(System.in);

2.2、 out 標準輸出流 System.out.println(""); 

2.3、err 標準錯誤流.  (紅色字型, 多執行緒)System.err.println()

3、常用方法:

3.1、static void exit​(int status) 正常退出Java虛擬機器.System.exit(0)

3.2、static long currentTimeMillis​() ; 獲取當前時間毫秒.

3.3、static void arraycopy​(Object src, int srcPos, Object dest, int destPos, int length) 複製一個數組中的元素到另一個數組中儲存.

引數1 : src -> source 源資料 (陣列A)

引數2 : srcPos -> source position 源資料位置 (從陣列A的哪個位置開始)

引數3 : dest -> destination 目的地 (陣列B)

引數4 : destPos -> destination position 目的地位置. (陣列B的哪個位置開始)

引數5 : length 長度, 從陣列A中拷貝多長的元素個數.

演示一:

public class Test01 {
    public static void main(String[] args) {

        System.out.println("hello Java.");
        
        System.out.println("Hello World 1.");
        System.err.println("Hello World 2.");   // 多執行緒 (錯誤流, 紅色字型)
        System.exit(0); // 退出虛擬機器 (程式就提前結束了)
    }

}

演示二:

public class CurrentTimeMillisTest2 {
    public static void main(String[] args) {

        long start = System.currentTimeMillis();

        // 呼叫方法 / 執行程式碼
        long sum = 0;
        for (int i = 0; i < 1000000000; i++) {
            sum += i;
        }

        long end = System.currentTimeMillis();

        // 共耗時 : 280 毫秒.
        System.out.println("共耗時 : " + (end - start) + " 毫秒.");
    }
}

演示三:arrayCopy 陣列元素複製方法

public class Test01 {
    public static void main(String[] args) {
        
            int[] src = new int[]{ 10, 20, 30, 40, 50 };
            int[] dest = new int[10];

            System.arraycopy(src, 0, dest, 0, 5);

            System.out.println("src = " + Arrays.toString(src));
            System.out.println("dest = " + Arrays.toString(dest));

            int[] dest2 = new int[10];
            System.arraycopy(src, 0, dest2, 5, 5);
            System.out.println("dest2 = " + Arrays.toString(dest2));
        }
}

四、StringBuilder 字串構造者類

1、概述:public final class StringBuilder extends Object implements Serializable, CharSequence字串構造者類

2、構造方法:

2.1、StringBuilder​();構造一個沒有字元的字串構建器,初始容量為16個字元

2.2、StringBuilder​(String str);構造一個初始化為指定字串內容的字串構建器。 

3、常用方法:

3.1、StringBuilder append​(b) ;鏈式程式設計、將 b引數的字串表示附加到序列中

3.2、String toString​() ;將字串構建者中的資料轉換為字串常量.

問題引入:

public class StringBuilderTest1 {
    public static void main(String[] args) {

        // String 類的優點 : 常量, 可以共享.
        String s1 = "hello";   // 字面值
        String s2 = "hello";

        // 請問 : s1 的地址和 s2 的地址一致呢 ???
        System.out.println(s1 == s2);  // true

        // String 類的缺點 : 常量, 不可再次更改.
        String s3 = "hello";
        String s4 = s3 + " world.";   // 說明 : 字串如果進行大量的拼接, 就會造成記憶體的浪費.

        System.out.println(s3 == s4);  // false

    }
}

// 請問 : 如何解決字串拼接中, 關於記憶體浪費的問題 ???   StringBuilder 字串構建者類. 演示一:

    public static void main(String[] args) {
        
        // 1. 建立一個 StringBuilder 物件
        StringBuilder sb = new StringBuilder();    // 堆區中開闢了一塊空間 (拼接字串)

        // 2. 呼叫 append 方法拼接
        StringBuilder sb2 = sb.append("hello");
        StringBuilder sb3 = sb2.append(" world.");

        System.out.println(sb == sb2);
        System.out.println(sb2 == sb3);

        System.out.println("sb = " + sb);
        System.out.println("sb2 = " + sb2);
        System.out.println("sb3 = " + sb3);

    }

演示二:

public static void main(String[] args) {

        // 1. 建立一個字串構建者物件
        StringBuilder sb = new StringBuilder();

        // 2. 鏈式程式設計
        sb.append("hello").append(" world.").append(true).append(998);  // append 方法在拼接過程中, 不會產生新空間.

        System.out.println("sb = " + sb);

        // 呼叫方法
        printString(sb.toString());
    }

    // 方法 :
    public static void printString(String str) {
        System.out.println("str = " + str);
    }

五、包裝類

1、概述:parseInt(String s);將字串引數作為有符號的十進位制整數進行解析

2、裝箱與拆箱(編譯器)

裝箱 : 將基本資料型別自動包裝為包裝型別. 拆箱 : 將包裝型別自動拆解為基本資料型別.

用到的方法:

    • int

      返回 Integer的值作為 int

      • 返回表示指定的 int值的 Integer例項。

 public static void main(String[] args) {

        // 集合 : <泛型>  泛型不能是基本資料型別.
        new ArrayList<Integer>();   // 整型包裝類
        new ArrayList<Character>(); // 字元包裝類

        /*
                基本資料型別              包裝引用型別
                byte                      Byte
                short                     Short
                int                       Integer
                long                      Long
                float                     Float
                double                    Double
                char                      Character
                boolean                   Boolean
         */

        // 自動裝箱 :
        // int num = 100;

        // Integer integerNum1 = Integer.valueOf(100);
        Integer integerNum1 = 100;     // 引用型別 = 基本資料型別

        // 自動拆箱 :
        // Integer integerNum2 = integerNum1;

        // int num2 = integerNum1.intValue();
        int num2 = integerNum1;

        // 基本型別和包裝可以直接運算.
        // int sum = integerNum1.intValue() + num2;
        int sum = integerNum1 + num2;
        System.out.println("sum = " + sum);
    }

顯示:sum = 200;

基本資料型別,包裝型別與字串的轉換

public static void main(String[] args) {

        // 需求 : 基本資料型別轉換為字串型別
        int num1 = 100;

        // 方式一 : 推薦使用, 並記憶
        String str1 = num1 + "";
        // 方式二 : 瞭解
        String str2 = String.valueOf(100);

        // 將字串轉換為包裝型別:
        Integer integer_num1 = new Integer("998");
        Integer integer_num2 = Integer.valueOf("998");

        // 將字串轉換 `基本資料型別`
        int num = 998;
        System.out.println(num + 2);

        String str = "998";
        str = str + 2;
        System.out.println("str = " + str);

        // `控制檯 / 頁面` 獲取的資料就是 String 型別.
        // 運算 : 需要將字串轉換為 `基本資料型別`.
        // static int parseInt(String s) 將字串引數作為有符號的十進位制整數進行解析。
        String str3 = "998";  // 如果字串無法解析為整型, 程式就會丟擲 NumberFormatException 數字格式化異常.
        int n = Integer.parseInt(str3);
        n = n + 2;
        System.out.println("n = " + n);
    }

顯示: