iT邦幫忙

0

Java學習筆記01

2019/11/11 PM 05:02
大家好,這邊算是複習上課時的筆記,會陸續更新,希望對學習JAVA的初學者有些幫助。
也希望有錯誤的地方,各位前輩能夠不吝嗇的指教。

在建立物件實體時有兩部分

1.在記憶體中規劃出一塊空間
2.利用建構式進行初始化的動作

在java裡面最源頭的父類別就是java.lang.Object。
在java裡面所有類別都會有父類別,所有類別都會有建構式,但要看建構式來自於哪裡,你定義了建構式,那就照定義的,沒定義就找父類別的無傳參數建構式。

找不到就出錯了,需要在建構式裡寫super(參數);
將extends類別進行初始化才能extends父類別,並使用父類別的方法。

建構式沒有在extends的,extends的只有屬性跟方法

建構式的第一道敘述句:一定是先執行父類別的無傳參數建構式,執行完畢後才是執行你所撰寫的部分。若你有指定super(參數)的情況下,才是執行父類別的有傳參數建構式,只要沒寫,就是執行無傳參數建構式。

在extends的情況下:已經寫了建構式所以不會使用父類別的建構式了,之所以還看到父類別無傳參數建構式的內容是因為在建構式會將父類別一併進行初始化的動作所以也會執行父類別的無傳參數建構式。

建構式觀念:
1.自訂類別下,沒有撰寫,則會使用父類別的無傳參數建構式。
2.若父類別沒有無傳參數建構式,則需要透過super指定父類別的哪一個有傳參數建構式
3.建構式的第一道敘述句,一定優先將父類別初始化,才會進行子類別初始化的動作。(EX:沒有父親哪來兒子,相同道理當初始化父類別,父親也會將爺爺拉進來,以此類推,所有的父類別都會一併在記憶體內被初始化)

4.以下舉個實例:

public class Constructor01 {
	// 無傳參數建構式
	public Constructor01() {
		System.out.println("Constructor01:無傳參數建構式");
	}
	// 有傳參數建構式
	public Constructor01(int a) {
		System.out.println("Constructor01:int a");
	}
	public Constructor01(int a, boolean b) {
		System.out.println("Constructor01:int a, boolean b");
	}
}

public class Constructor02 extends Constructor01{
	public Constructor02() {
		System.out.println("Constructor02:無傳參數建構式");
	}
	public Constructor02(int a) {
		super(1,false);
		System.out.println("Constructor02:int a");
	}
}

public class RunConstructor {
    public static void main(String[] args) {
        Constructor02 obj5 = new Constructor02(1);
    }
}

其結果為:
Constructor01:int a, boolean b
Constructor02:int a

2019/11/11 PM 08:06

什麼是多載(Overload)、覆寫(Override)?

多載(Overload):一個類別中,定義同名稱的方法,但參數不同的方法。
舉個例子
以下為建構式的Overload

public class Constructor01 {
	// 無傳參數建構式
	public Constructor01() {
		System.out.println("Constructor01:無傳參數建構式");
	}
	// 有傳參數建構式
	public Constructor01(int a) {
		System.out.println("Constructor01:int a");
	}
	public Constructor01(int a, boolean b) {
		System.out.println("Constructor01:int a, boolean b");
	}
}

以下為方法method的Overload

public class Hello {
	public void helloWorld() {
		System.out.println("helloWorld");
	}

	public void helloWorld(String taiwan) {
		taiwan="taiwan";
		System.out.println("helloWorld"+taiwan);
	}
	
	public void helloWorld(int a, boolean b) {
		System.out.println("helloWorld" + a + b);
	}
}

覆寫(Override):當子類別extend父類別時,子類別能將父類別擁有的方法進行改寫的動作。
舉個例子;

public class Car {
	// 屬性:speed(速度)
	protected double speed;

	// 時速表
	public double getSpeed() {
		return speed;
	}

	// 油門
	public void upSpeed() {
		speed = speed < 1 ? 1 : speed * 1.7;
	}

	// 煞車
	public void downSpeed() {
		speed = speed < 1 ? 0 : speed * 0.4;
	}
}

當Scooter extends Car 並Override的時候

public class Scooter extends Car{
    //因為Scooter(速克達),馬力沒有汽車那麼大
    //所以可以看到油門跟煞車的係數做了調整
    
	// 油門
	@Override
	public void upSpeed() {
		speed = speed < 1 ? 1 : speed * 1.3;
	}

	// 煞車
	@Override
	public void downSpeed() {
		speed = speed < 1 ? 0 : speed * 0.7;
	}
}

2019/11/11 PM 08:48
利用JAVA API string
來稍微玩一下建構式的部分
s1:String()
s2:String(byte[] bytes)
s3:String(byte[] bytes, int offset, int length)

public class RunString {

	public static void main(String[] args) {
		// String
		String s1 = new String();
		byte[] b1 = { 97, 98, 99, 100 };

		String s2 = new String(b1);
		String s3 = new String(b1, 1, 2);
		System.out.println(s1);
		System.out.println(s2);
		System.out.println(s3);
	}
}

其結果為下列顯示
s1:
s2:abcd
s3:bc

至於為甚麼s2、s3會出現英文,小弟學藝不精,只知道跟ASCII Code有關係,
目前已JAVA基礎與物件導向複習為主,待複習完畢再來探討這個部分。


尚未有邦友留言

立即登入留言