/*
就近原則: 在類當中,如果存在同名的變量名,Java編譯器會認爲最近的變量名是該語句操作的變量;所以就出現了this
*
* this 關鍵字的作用:
* 1..如果在同一個函數中,出現了和成員變量同名的變量名,可以利用this來區分不同的變量;this.成員變量 表示的是成員變量
*
* 2..this關鍵字不僅可以調用普通函數,還能調用類的構造函數
* 注意事項:1.如果一個構造函數A通過this調用構造函數B,那麼this必須放在構造函數的第一行
* 2.兩個構造函數不能this關鍵字相互調用,語法不通過,會陷入死循環
3.只能在類中的非靜態方法中使用,靜態方法和靜態的代碼塊中絕對不能出現this
4.爲什麼在靜態方法中不能使用this關鍵字
因爲this關鍵字是指的類對象;而靜態方法是屬於類的,static隨着類的加載而加載,先於對象的創建而創建
5.在構造方法中,意思是調用本類中另一種形式的構造函數(this必須放在第一行)
*/
class Bus {
private int wheel;
private String name;
public Bus() {
this(6);//this關鍵字還能調用類的構造函數,但必須放在第一行
this.run();//注意:這個是調用的普通的函數;
System.out.println("無參構造函數");
}
public Bus(int wheel) {
//this();//陷入死循環
this.wheel = wheel;
}
public Bus(int wheel, String name) {
//wheel=wheel;//,如果存在同名的變量名,Java編譯器會認爲最近的變量名是該語句操作的變量
this.wheel = wheel;
this.name = name;
}
public void run(){
System.out.println("車跑了");
}
public void show() {
System.out.println("Name:"+name+"wheel:"+wheel);
}
}
public class TestThis {
public static void main(String[] args) {
Bus bus = new Bus();
bus.show();
}
}
* 子類在創建的時候,會自動調用父類對應的構造函數
* 但是父類的構造函數又不能被子類繼承
* 【問題】
創建子類的時候,希望通過子類來初始化從父類繼承過來的屬性,但是又不能直接調用父類的構造函數
用this關鍵字不合適,因爲這是父類的屬性,用父類的構造函數更加合適
* 【原因】
* 在父類的構造函數中,可能存在對於初始化操作的一個限制和約束,這個限制和約束是爲了保證代碼的業務邏輯符合生活要求,
* 但是如果在子類中直接使用this來賦值繼承而來的父類的屬性,沒有通過判斷和約束,可能會導致代碼的業務邏輯出現問題
*
* super關鍵字 調用父類方法 super只能指代直接父類
* 1.super關鍵字可以調用父類的構造函數和成員方法,也可調用變量名和對象名
super.xxx; //xxx爲變量名或對象名
super.xxx(); //xxx爲方法名
super(); 調用父類的初始化方法
* 如果調用構造函數,必須放在當前代碼塊的第一行
* 2.如果在代碼中,沒有顯示調用父類的構造函數,那麼Java編譯器會在代碼的編譯階段,自動幫你補
* 上一個符合條件的父類構造函數(隱式調用)
*
* 3.如果在子類中需要對父類的屬性,進行初始化操作,那麼只能通過super
* 關鍵字來調用父類的構造函數,不能在子類的構造函數中直接使用this賦值
* 4.super和this不能在同一個構造函數中去調用其他構造函數,因爲super和this關鍵字在構造函數中都必須在第一行
5.類方法中不能有super