this與super關鍵字



/*
       就近原則: 在類當中,如果存在同名的變量名,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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章