Java例項 Part5:面向物件入門
目錄
-
- Example01:成員變數的初始化值
- Example02:單例模式的應用
- Example03:漢諾塔問題的求解
- Example04:兩隻完全相同的寵物並得出物件的雜湊碼
Part5:面向物件入門
@
***
Example01:成員變數的初始化值
執行結果:

程式碼實現:
public class Example01 { //宣告變數 private byte b; private int i; private short s; private long l; private char ch; private float f; private double d; private boolean bool; private String str; public static void main(String[] args) { Example01 example = new Example01(); System.out.println("byte型別的初始值:"+example.b); System.out.println("int型別的初始值:"+example.i); System.out.println("short型別的初始值:"+example.s); System.out.println("long型別的初始值:"+example.l); System.out.println("char型別的初始值:"+example.ch); System.out.println("float型別的初始值:"+example.f); System.out.println("double型別的初始值:"+example.d); System.out.println("boolean型別的初始值:"+example.bool); System.out.println("String型別的初始值:"+example.str); } }
-
要點:對於引用型別的變數,在使用之前需要進行初始化,否則會丟擲NullPointerException。
***
Example02:單例模式的應用
-----懶漢式
執行結果:

實現程式碼:
class Single { private static Single s = null; private Single(){} public static Single getInstance(){ if (s == null){ s = new Single(); System.out.println("---我是懶漢!"); } return s; } }
- 懶漢式在方法中建立這個類的物件,呼叫效率不高,但能延時載入。
-----餓漢式
執行結果:

程式碼實現:
class Single { private static Single s = new Single(); private Single(){} public static Single getInstance(){ System.out.println("---我是餓漢!"); return s; } }
- 餓漢式在全域性變數範圍內建立這個類的物件,呼叫效率高,但不能延時載入。
== 測試程式碼:==
public class Example02 { public static void main(String[] args) { System.out.println("---你又是誰?"); Single.getInstance(); } }
要點:單例模式的特點在於僅能獲得一個物件。為了防止其他使用者建立物件,需要將建構函式設定成private的,然後提供一個靜態方法,該方法返回這個類的物件。
***
Example03:漢諾塔問題的求解
- 漢諾塔問題描述:有A、B、C 3根柱子,在A上從下往上按照從小到大的順序放著3個圓盤,以B為中介,把盤子全部移動到C上。移動過程中,要求任意盤子的下面要麼沒有盤子,要麼只能有比它大的盤子。
執行結果:

程式碼實現:
public class Example3 { public static void main(String[] args) { int nDisks = 3; //設定漢諾塔為3階 moveDish(nDisks,'A','B','C'); } public static void moveDish(int level,char from,char inner,char to){ if (level == 1){//如果只有一個盤子 System.out.println("從"+from+"移動盤子1號到"+to); }else {//如果有大於一個盤子就迭代 moveDish(level-1,from,to,inner); System.out.println("從"+from+"移動盤子"+level+"號到"+to); moveDish(level-1,inner,from,to); } } }
- 要點:為了將N個盤子從A移動到C,需要先將N個盤子上面的N-1個盤子移動的B上,這樣才能將第N個盤子移動到C上,同理,為了將第N-1個盤子從B移動到C上,通過遞迴可以實現漢諾塔問題。(上面的程式是3階漢諾塔問題,有需要可以改寫成自己需要計算的輸入程式的n階漢諾塔問題)
Example04:兩隻完全相同的寵物並得出物件的雜湊碼
- 要求:重寫equals()和toString()以及hashCode()方法來比較兩個物件是否相同。
執行結果:

程式碼實現:
import java.awt.*; import java.util.Objects; public class Cat { private String name; private int age; private double weight; private Color color; public Cat(String name, int age, double weight, Color color) { this.name = name; this.age = age; this.weight = weight; this.color = color; } @Override public boolean equals(Object o) {//利用屬性來判斷貓咪是否相同 if (this == o) {//如果兩個貓咪是同一個物件則相同 return true; } if (o == null ) {//如果兩個貓咪有一個為null則不同 return false; } if (getClass() != o.getClass()) {//如果兩個貓咪的型別不同則不同 return false; } Cat cat = (Cat) o; //比較貓咪的屬性 return age == cat.age && Double.compare(cat.weight, weight) == 0 && Objects.equals(name, cat.name) && Objects.equals(color, cat.color); } @Override public String toString() {//重寫toString()方法 return "Cat{" + "名字='" + name + '\'' + ", 年齡=" + age + ", 重量=" + weight + ", 顏色=" + color + '}'; } @Override public int hashCode() { return Objects.hash(name, age, weight, color); } public static void main(String[] args) { Cat c1 = new Cat("hyn",3,10,Color.PINK); Cat c2 = new Cat("azw",4,15,Color.YELLOW); Cat c3 = new Cat("hyn",3,10,Color.PINK); System.out.println("貓咪1號:"+c1); System.out.println("貓咪2號:"+c2); System.out.println("貓咪3號:"+c3); System.out.println("貓咪1號的雜湊碼:"+c1.hashCode()); System.out.println("貓咪2號的雜湊碼:"+c2.hashCode()); System.out.println("貓咪3號的雜湊碼:"+c3.hashCode()); System.out.println("貓咪1號是否與2號相同:"+c1.equals(c2)); System.out.println("貓咪1號是否與3號相同:"+c1.equals(c3)); } }
-
要點:Java中建立的物件是儲存在堆中的,為了提高查詢的速度而使用了雜湊查詢。雜湊查詢的基本思想是定義一個鍵來對映物件所在的記憶體地址。當需要查詢物件時,直接查詢鍵即可,這樣就不用遍歷整個堆來查詢物件了。
***
提高:對toString()方法裡面的內容進行改進,通過使用字串輸出物件。
執行結果:

程式碼實現:
@Override public String toString() {//重寫toString()方法 StringBuilder sb = new StringBuilder(); sb.append("名字:"+name+"\n"); sb.append("年齡:"+age+"\n"); sb.append("重量:"+weight+"\n"); sb.append("顏色:"+color+"\n"); return sb.toString(); }