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);
}
顯示: