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.* ; //這樣就是錯誤的;
訪問許可權修飾符(按許可權大小排序):
修飾物件:屬性(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) ̄)ブ