1. 程式人生 > >Java例項 Part5:面向物件入門

Java例項 Part5:面向物件入門

目錄

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();
}