1. 程式人生 > >java—— this 和 super引用

java—— this 和 super引用

  • 在Java中,this 和 super 是常用來指代類自身物件和該類的父類物件的關鍵字。

  • Java系統預設每個類都具有null、this 和 super 三個物件引用量,所以在任意類中不加說明直接使用這三個物件。

  • null 代表空物件,一般用null代表為建立的物件。

  • this 指當前物件的引用。

  • super 指對父類物件的引用。

-super關鍵字

super表示當前物件的直接父類物件(資料成員或成員方法),是當前物件的直接父類的引用。如果子類定義的物件(資料成員或成員方法)和父類物件(資料成員或成員方法)相同,此時如果想呼叫父類物件的方法,可以通過super來實現對父類物件的訪問。

使用super有下面三種情況

1.用來訪問父類被隱藏的資料成員;
2.呼叫父類中被子類覆蓋的方法;
3.呼叫父類的建構函式。

使用方法
super.父類中方法名(成員名)

1.super用於方法

用於構造方法(****)表示呼叫父類構造方法:super(引數列表)

當子類呼叫父類無參構造時,super( ) 可寫可不寫,表示呼叫父類無參構造。

當子類呼叫父類有參構造時,super(引數列表) 必須要寫,要告訴編譯器當前呼叫的是哪個有參構造。

注意:
a.子類構造方法中呼叫父類構造必須是第一行語句。
b.this與super不能同時呼叫。

用於普通方法:   super.方法名(引數)

> 用於在子類中明確呼叫父類被覆寫的方法。

2.super用於屬性(瞭解)

super.屬性名  
   
> 表示呼叫父類中被覆寫的屬性(許可權不是private)
class Person{
    public int c;
    private String name;
    private int age;
    protected void setName(String name){
        this.name = name;
    }
    protected void setAge(int age){
        this.age = age;
    }
    protected void print(){
        System.out.println("Name="+name+",age="+age);
    }
}
public class SuperExample extends Person{
    public void print(){
        System.out.println("test: ");
        super.print();  //直接呼叫父類的成員方法
    }
    public static void main(String[] args){

        SuperExample ds = new SuperExample();
        ds.setName("steven");
        ds.setAge(22);
        ds.print();   //呼叫覆蓋後的方法
    }
}
//test:
Name=steven,age=22

– this關鍵字

一般在方法中如果某個形參名與當前物件的某個資料成員的名字相同,為了不混淆兩者,通常情況下需要明確使用this關鍵字來指明類的資料成員,使用方法是“this.成員名”,而不帶this 那個便是形參。另外,還可以使用“this.方法名”來引用當前物件的某個方法,但這時this就不是必須的了,也可以直接用方法名來訪問那個方法,編譯器會知道要呼叫的是哪個方法。

public class ThisExample{
    private String name;
    private int age;
    ThisExample(String name,int age){
        this.setName(name);//用this引用當前物件 
        this.setAge(age);
        this.print();
    }
    public void setName(String name){
        this.name = name;//this指明賦值號左邊為引用當前物件的成員變數,以免混淆
    }
    public void setAge(int age){
        this.age = age;
    }
    public void print(){
        System.out.println("Name="+name+",age="+age);//在此行中並不需要this,因為不會導致混淆
    }
    public static void main(String[] args){
        ThisExample dt = new ThisExample("steven",20);
    }
}
//Name=steven,age=20

1. this 表示呼叫本類屬性
只要在類中訪問類的屬性,一定要加上 this 關鍵字

2. this 表示呼叫本類方法

	a.呼叫普通方法  :   this . 類中方法名(成員名)

當有類的繼承關係時,表示本類方法一定要加上 this 關鍵字

	b(重點).呼叫構造方法:    this(引數)
 class Person{
           private String name;
           private int age = 10;
           //無參構造
           public Person(){
               System.out.println("**************");
           }
           //一個引數的有參構造
           public Person(String name){
               this();//呼叫本類的無參構造
               this.name = name;
           }
           //兩個引數的有參構造
           public Person(String name,int age){
               this(name);//呼叫本類一個引數的有參構造
              this.age = age;
           }
           public void setName(String n){
               name = n;
           }
       }

3. this 表示當前物件
(1). this 呼叫構造方法必須放在構造方法首行
(2) . this 呼叫構造方法不允許成環
只要物件呼叫了本類中的方法,這個this就表示當前執行的物件

 class Person{
       public void print(){
           System.out.println("[person 類的print的方法]"+this);  // //this 表示當前執行的物件
       }
    }
      public class Hello{
        public static void main(String[] args){
            Person per1 = new Person();
            System.out.println("[main方法]"+per1);
            per1.print();
            System.out.println("===============");
             Person per2 = new Person();
            System.out.println("[main方法]"+per2);
            per2.print();
        }
    }
    [main方法][email protected]
    [person 類的print的方法][email protected]
    ===============
    [main方法][email protected]
    [person 類的print的方法][email protected]