今天來到封裝的最後一篇囉
final 為 Java 語言的關鍵字,其特性有下列幾點:
public final class FinalClass {
// 不能被繼承
}
public class People {
public final void doSomething() {
// 不能被子類覆蓋
}
}
public final int MAX_VALUE = 100; // 常量,不可更改的值
//final 修飾符可以確保在方法內部不會更改參數的值,這有助於防止意外修改參數。
public void printMessage(final String message) {
System.out.println(message);
}
this 可以參考到目前使用中該物件的屬性、方法以及建構子,主要用於消除成員變數和區域變數之間的歧義,以及在建構函數中調用其他建構函數。不過this只能用在方法或建構子中以下是有關 this 的詳細解釋和用法:
調用其他建構函數
this()
建構子只能放在第一行!!!
public class MyClass {
private int number;
public MyClass() {
// 調用另一個建構函數並傳遞參數
this(0); // 調用帶有一個整數參數的建構函數
}
public MyClass(int number) {
this.number = number;
}
}
在方法中參照呼叫該方法的物件
public class Dog {
public void jump() {
System.out.println("正在執行jump方法");
}
public void run() {
Dog d = new Dog();
d.jump();
System.out.println("正在執行run方法");
}
}
public class DogDemo {
public static void main(String[] args) {
Dog dog = new Dog();
dog.run();
}
}
用這樣的方式確實可以在run()內呼叫jump 方法,但這樣的方式一共就產生了兩個Dog的物件;
這樣這邊會產生兩個問題:
第一個問題的答案是YES ! 因為沒有使用static修飾的成員變數和方法都必須使用物件來呼叫
第二的問題的答案是NO ! 因為當程式呼叫run()方法時,一定會提供一個Dog物件,
這樣就可以直接使用這個已經存在的Dog物件,不需要在增立
所以我們只需要把run方法改成以下
public void run() {
this.jump();
System.out.println("正在執行run方法");
}
this 可以代表任何物件,當this 出現在方法中時,他所代表的物件是不確定的,但他所代表的物件只能是當前類別,只有當這個方法被呼叫時,所代表的物件才被確定下來,誰呼叫這個方法,this 就代表誰
在Java中,允許物件的一個成員呼叫另一個成員所以在這邊也可以直接省略this,所以在大部分的時候,一個方法存取該類別中定義的其他方法、成員變數時加不加this的效果一樣
public void run() {
jump();
System.out.println("正在執行run方法");
}
對於staic 修飾的方法而言,可以使用類別來直接呼叫該方法,如果在static 修飾的方法中使用this ,這個關鍵字就無法指向合適的物件,所以static 成員不能直接存取非staic 成員!!!
必須使用this的情況
局部變數和成員變數同名時,要取用被覆蓋的成員變數
public class ThisInConstructor {
public int number;
public ThisInConstructor() {
int number = 0;
this.number = 6;
}
public static void main(String[] args) {
System.out.println("number:" + new ThisInConstructor().number);
}
}
/*
結果:
number:6
*/
由於建構子是直接使用new 關鍵字來呼叫,不是用物件來呼叫,所以this在建構子中代表該建構子正在初始化的物件,上面的程式碼this.number = 6 ; 表示將正在執行初始化的ThisInConstructor物件的number成員變數設為6,這等於該建構子返回的所有物件的number成員變數都等於6
返回當前物件
public class ReturnThis {
public int age;
public ReturnThis grow() {
age++;
return this;
}
public static void main(String[] args) {
ReturnThis returnThis = new ReturnThis();
returnThis.grow()
.grow()
.grow();
System.out.println("age:" + returnThis.age );
}
}
/*
結果:
age:3
*/
Java中的一項重要特性:要求是兩同一不同允許在同一個類中定義多個方法具有相同的名稱,但擁有不同的參數列表。這些方法可以有不同的參數數量、類型或順序,編譯器根據調用方法時提供的參數來確定要調用的具體方法,其他部分像是返回類型、修飾詞,與方法多載沒有關係
方法重載具有以下特點:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public String add(int a, String b) {
return a + b;
}
}
今天終於把封裝講完了~明天見拉