java.lang.Object類
1.Object類是所有Java類的根父類
2.如果在類的聲明中未使用extends關鍵字指明其父類,則默認父類為java.lang.Object類
3.Object類中的功能(屬性、方法)就具有通用性。
屬性:無
方法:equals() / toString()
getClass()
hashCode()
clone() / finalize()
wait() 、 notify()、notifyAll()
4.Object類只聲明瞭一個空參的構造器
Order order = new Order();
System.out.println(order.getClass().getSuperclass());
面試題:final、finally、finalize的區別?
面試題: == 和 equals() 區別
\== :運算符(可以使用在基本數據類型變量和引用數據類型變量中)
如果比較的是基本數據類型變量:比較兩個變量保存的數據是否相等。(不一定類型要相同)(自動類型提升)
如果比較的是引用數據類型變量:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體
補充: == 符號使用時,必須保證符號左右兩邊的變量類型一致。
我們對以上內容實際測試如下:
引用類型:
Customer cust1 = new Customer("Tom",21);
Customer cust2 = new Customer("Tom",21);
System.out.println(cust1 == cust2);//false
String str1 = new String("atguigu");
String str2 = new String("atguigu");
System.out.println(str1 == str2);//false
equals()方法的使用
1. 是一個方法,而非運算符,只能適用於引用數據類型。
2. Object類中equals()的定義:
public boolean equals(Object obj) {
return (this == obj);
}
説明:Object類中定義的equals()和==的作用是相同的:比較兩個對象的地址值是否相同.即兩個引用是否指向同一個對象實體
3.像String、Date、File、包裝類等都重寫了Object類中的equals()方法。
重寫以後,比較的不是兩個引用的地址是否相同,而是比較兩個對象的"實體內容"是否相同。
4.通常情況下,我們自定義的類如果使用equals()的話,也通常是比較兩個對象的"實體內容"是否相同。那麼,我們就需要對Object類中
的equals()進行重寫.
重寫的原則:比較兩個對象的實體內容是否相同.
\================================================================
equals()方法:
System.out.println(cust1.equals(cust2));//false--->true 多態無處不在(形參object,這裏是其子類)
System.out.println(str1.equals(str2));//true 重寫了Object類中的equals()方法
1、自動生成的equals() 目前已經掌握了------>生成構造方法、生成get()和set()方法、生成equals()和hash()
2、手動實現equals()的重寫
@Override //自動生成的equals()
public boolean equals(Object obj) { //Object obj 多態無處不在
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
//正式比較
Customer other = (Customer) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
重寫的原則:比較兩個對象的實體內容(即:name和age)是否相同
手動實現equals()的重寫
@Override
public boolean equals(Object obj) {
// System.out.println("Customer equals()....重寫的方法執行了");
if (this == obj) {
return true;
}
if(obj instanceof Customer){
Customer cust = (Customer)obj;
//比較兩個對象的每個屬性是否都相同
// if(this.age == cust.age && this.name.equals(cust.name)){
// return true;
// }else{
// return false;
// }
//或
return this.age == cust.age && this.name.equals(cust.name);
//基本數據類型age只能用== 引用數據類型name只能用equals()方法
}else{
return false;
}
}
Object類中toString()的使用
1、當我們輸出一個對象的引用時,實際上就是調用當前對象的toString()
Customer cust1 = new Customer("Tom",21); //com.atguigu.java1.Customer@15db9742
System.out.println(cust1.toString()); //com.atguigu.java1.Customer@15db9742
System.out.println(cust1);
2、Object類中toString()的定義:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
3、像String、Date、File、包裝類等都重寫了Object類中的toString()方法。
使得在調用對象的toString()時,返回"實體內容"信息
4、自定義類也可以重寫toString()方法,當調用此方法時,返回對象的"實體內容"
手動實現
@Override
public String toString() {
return "Customer[name = " + name + ",age = " + age + "]";
}
自動實現
@Override
public String toString() {
return "Customer [name=" + name + ", age=" + age + "]";
}
Java中的JUnit單元測試
hamcrest-core-1.3.jar
下載43KB的jar包就可以
此單元測試方法上需要聲明註解:@Test,並在單元測試類中導入:import org.junit.Test;
聲明好單元測試方法以後,就可以在方法體內測試相關的代碼。
1.如果執行結果沒有任何異常:綠條
2.如果執行結果出現異常:紅條
包裝類(Wrapper)的使用
1、java提供了8種基本數據類型對應的包裝類,使得基本數據類型的變量具有類的特徵
總結:基本類型、包裝類與String類間的轉換
2、基本數據類型、包裝類、String三者之間的相互轉換
總結:(只看這個就可以了)
1、JDK 5.0 新特性:自動裝箱 與自動拆箱
int num2 = 10;
Integer in1 = num2;//自動裝箱
int num3 = in1;//自動拆箱
2、基本數據類型、包裝類--->String類型:調用String重載的valueOf(Xxx xxx)
float f1 = 12.3f;
String str2 = String.valueOf(f1);//"12.3"
3、String類型 --->基本數據類型、包裝類:調用包裝類的parseXxx(String s)
String str1 = "123";
int num2 = Integer.parseInt(str1);
System.out.println(num2 + 1); //124
======================================================================================================
基本數據類型、包裝類--->String類型:調用String重載的valueOf(Xxx xxx)
@Test
public void test4(){
int num1 = 10;
//方式1:連接運算
String str1 = num1 + "";
//方式2:調用String的valueOf(Xxx xxx)
float f1 = 12.3f;
String str2 = String.valueOf(f1);//"12.3"
Double d1 = new Double(12.4);
String str3 = String.valueOf(d1);
System.out.println(str2);
System.out.println(str3);//"12.4"
}
String類型 --->基本數據類型、包裝類:調用包裝類的parseXxx(String s)
@Test
public void test5(){
String str1 = "123";
//錯誤的情況:
// int num1 = (int)str1;
// Integer in1 = (Integer)str1;
//可能會報NumberFormatException
int num2 = Integer.parseInt(str1);
System.out.println(num2 + 1);
String str2 = "true1";
boolean b1 = Boolean.parseBoolean(str2);
System.out.println(b1);
}
JDK 5.0 新特性:自動裝箱 與自動拆箱
@Test
public void test3(){
// int num1 = 10;
// //基本數據類型-->包裝類的對象
// method(num1);
//自動裝箱:基本數據類型 --->包裝類
int num2 = 10;
Integer in1 = num2;//自動裝箱
boolean b1 = true;
Boolean b2 = b1;//自動裝箱
//自動拆箱:包裝類--->基本數據類型
System.out.println(in1.toString());
int num3 = in1;//自動拆箱
}
public void method(Object obj){
System.out.println(obj);
}
基本數據類型 --->包裝類:調用包裝類的構造器
int num1 = 10;
// System.out.println(num1.toString()); error
Integer in1 = new Integer(num1);
System.out.println(in1.toString()); //10
Integer in2 = new Integer("123");
System.out.println(in2.toString()); //123
//報異常 NumberFormatException: For input string: "123abc"
// Integer in3 = new Integer("123abc");
// System.out.println(in3.toString());
//=======================================================
Float f1 = new Float(12.3f);
Float f2 = new Float("12.3");
System.out.println(f1); //12.3
System.out.println(f2); //12.3
//=======================================================
Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("TrUe");
System.out.println(b2); //true
Boolean b3 = new Boolean("true123");
System.out.println(b3);//false 布爾類型特別一點:優化過
包裝類--->基本數據類型:調用包裝類Xxx的xxxValue()
@Test
public void test2(){
Integer in1 = new Integer(12);
int i1 = in1.intValue();
System.out.println(i1 + 1);
Float f1 = new Float(12.3);
float f2 = f1.floatValue();
System.out.println(f2 + 1);
}
面試題
@Test
public void test1() {
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);// 1.0
}
@Test //為什麼??
public void test2() {
Object o2;
if (true)
o2 = new Integer(1);
else
o2 = new Double(2.0);
System.out.println(o2);// 1
}
@Test
public void test3() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false
Integer內部定義了IntegerCache結構(內部類),IntegerCache中定義了Integer[],
保存了從-128~127範圍的整數。如果我們使用自動裝箱的方式,給Integer賦值的範圍在-128~127範圍內時,
可以直接使用數組中的元素,不用再去new了。
目的:提高效率
@Test
Integer m = 1;
Integer n = 1;
System.out.println(m == n);//true
Integer x = 128;//相當於new了一個Integer對象
Integer y = 128;//相當於new了一個Integer對象
System.out.println(x == y);//false
}