Part5:面向對象入門 @[toc] Example01:成員變數的初始化值 運行結果: 代碼實現: public class Example01 { //聲明變數 private byte b; private int i; private short s; private long l; pr ...
目錄
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();
}