介紹
super關鍵字代表父類的參考,用于訪問父類的屬性、方法和構造器,
基本語法
父類代碼:
public class A {
private int n1 = 1;
protected int n2 = 2;
int n3 = 3;
public int n4 = 4;
private void test100(){
}
protected void test200(){
}
void test300()
{
}
public void test400(){
}
}
-
訪問父類的屬性,但不能訪問父類的private屬性:super.屬性

-
訪問父類的方法,但不能訪問父類的private方法:super.方法名(引數串列)

-
訪問父類的構造器:super(引數串列)
只能放在構造器的第一句,且只能出現一句,

super的細節和好處
1、分工明確
? 父類屬性由父類初始化,子類屬性由子類初始化,
? 父類:

? 子類:

? 可以看出在子類中初始化了子類屬性n2.
2、當子類中有和父類中的成員重名時,為了訪問父類的成員,必須通過super,
? 父類:

? 子類:
public class B extends A {
public void cal(){
System.out.println("B中的cal方法...");
}
public void sum(){
System.out.println("B類的sum方法....");
//希望呼叫父類的cal方法
cal();//找cal方法時,順序是,先找本類,如果有并且可以呼叫,則呼叫,如果沒有,則找父類
//父類沒有的話,繼續找父類的父類,直到object類,
//查找程序中,找到了但不能訪問,則報錯
//查找程序中,沒有找到,則提示方法不存在
this.cal(); //和直接訪問方法的順序一樣
super.cal(); //沒有查找本類的程序,直接到父類中查找
}
}
結果:
B類的sum方法....
B中的cal方法...
B中的cal方法...
A類的cal方法....
父類和子類中都有cal方法,從結果中可以看到通過super可以查找到父類的cal方法,但是其他兩種方法則是找到了本類中的cal方法,
3、如果沒有重名,使用super、this、直接訪問是一樣的效果,
? 子類:
public class B extends A {
public void sum(){
System.out.println("B類的sum方法....");
//希望呼叫父類的cal方法
cal();//找cal方法時,順序是,先找本類,如果有并且可以呼叫,則呼叫,如果沒有,則找父類
//父類沒有的話,繼續找父類的父類,直到object類,
//查找程序中,找到了但不能訪問,則報錯
//查找程序中,沒有找到,則提示方法不存在
this.cal(); //和直接訪問方法的順序一樣
super.cal(); //沒有查找本類的程序,直接到父類中查找
}
}
? 4、super的訪問不限于直接父類,如果爺爺類和本類中有同名的成員,可以使用super去訪問爺爺類的成員,
? 若多個基類中都有同名的成員,使用super遵循就近原則,來不停的往上找,
public class Base {
public int n2 = 999;
}
public class A extends Base {
public int n2 = 2;
}
public class B extends A {
public void test(){
System.out.println(super.n2);
}
}
結果如下:
2
也就是super的就近原則,
super和this的區別
| 區別點 | this | super |
|---|---|---|
| 訪問屬性 | 訪問本類的屬性,若本類中沒有此屬性,則到父類中查找 | 直接從父類中開始查找 |
| 呼叫方法 | 訪問本類的方法,若本類中沒有此屬性,則到父類中查找 | 直接從父類中開始訪問 |
| 呼叫構造器 | 呼叫本類構造器必須放在構造器首行 | 呼叫父類構造器必須放在子類構造器的首行 |
| 特殊性 | 表示當前物件 | 子類訪問父類物件 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298753.html
標籤:其他
上一篇:入門opencv
