子類中【變量】的特點 (super關鍵字)
如果子類中出現 {非私有的} 同名成員變量a時,直接打印變量a後值爲子類的值
子類要訪問本類中的變量,用this
子類要訪問父類中的同名變量,用super.
super的使用和this的使用幾乎一致。
this代表的是本類對象的引用。
super代表的是父類對象的引用.
class fu{
int num = 4;
}
class zi extends fu{
int num = 5;
void show1(){
System.out.println(super.num);
}
void show2(){
System.out.println(this.num);
}
}
public class 繼承 {
public static void main(String[] args) {
zi z = new zi();
z.show1();
z.show2();
}
}
運行結果
子父類中的【函數】特點
當子類出現和父類一模一 樣 的函數時,
當子類對象調用該函數,會運行子類函數的內容。
如同父類的函數被覆蓋一樣。
這種情況是函數的另一個特性:【重寫(覆蓋)】
當子類繼承父類,沿襲了父類的功能,到子類中,
但是子類雖具備該功能,但是功能的內容卻和父類不致,
這時,沒有必要定義新功能,而是使用覆蓋特殊,保留父類的功能定義,並重寫功能內容。
【覆蓋】:
1,子類覆蓋父類,必須保證子類權限大於等於父類權限,纔可以覆蓋,否則編譯失敗。
2,靜態只能覆蓋靜態.
記住大家:
重載:只看同名函數的參數列表。
重寫:子父類方法要一模一樣.
一般情況下要修改類裏面的某些功能,儘量不要去直接修改類,否則要修改多處地方,簡直是災難。需要修改就去重新定義個類重寫一個需要修改的函數其他的繼承父類即可。
class fu{
void speak(){
System.out.println("父類speak");
}
private void show() {
System.out.println("父類show");
}
}
class zi extends fu{
void speak(){
System.out.println("子類speak");
}
void show() {
System.out.println("父類show");
}
}
public class 繼承 {
public static void main(String[] args) {
zi z = new zi();
z.speak();
z.show();
}
}
運行結果
子父類中的【構造函數】的特點
在對子類對象進行初始化時,父類的構造函數也會運行,
那是因爲子類的構造函數默認第一行有一條 隱式的語句super();
super() :會訪問父類中空參數的構造函數。而且子類中所有的構造函數默認第一行都是super () ;
爲什麼子類一定要訪問父類中的構造函數。
因爲父類中的數據子類可以直接獲取。所以子類對象在建立時,需要先查看父類是如何對這些數據進行初始化的。
所以子類在對象初始化時,要先訪問一下父類中的構造函數。
如果要訪問父類中指定的構造函數,可以通過手動定義super語句的方式來指定。
注意:super語句一定定義在子類構造函數的第一行.
子類的實例化過程。
【結論】:
子類的所有的構造函數,默認都會訪問父類中空參數的構造函數。
因爲子類每一個構造函數內的第一行都有一句隱式super();
當父類中沒有空參數的構造函數時,子類必須手動通過super語句形式來指定要訪間父類中的構造函數。
當然:子類的構造函數第一行也可以手動指定this語句來訪問本類中的構造函數。
子類中至少會有一一個構造函數會訪問父類中的構造函數.
class fu{
int num=1;
fu(){
num = 2;
System.out.println("fu num:"+num);
}
fu(int a){
System.out.println("fu a:"+a);
}
}
class zi extends fu{
zi() {
//super 這裏默認有一個super關鍵字
System.out.println("zi num:"+num);
System.out.println();
}
zi(int a){
super(9);
System.out.println("zi a:"+a);
System.out.println();
}
zi(int a,int b){
// super; 不指定那個構造函數,默認爲沒有參數的構造函數
System.out.println("zi a+b:"+a+"+"+b);
System.out.println();
}
}
public class 繼承 {
public static void main(String[] args) {
zi z = new zi();
zi x = new zi(6);
zi y = new zi(2,3);
}
}
運行結果