super,this的區別和使用
阿新 • • 發佈:2019-01-09
this的使用和說明
java的this關鍵字只能用於方法體內,java虛擬機器(JVM)會給這個物件分配一個引用自身的指標,這個指標的名字就是this.
注意:函式引數或者函式中的區域性變數和成員變數同名的話,成員變數被遮蔽,此時要訪問成員變數則需要使用“this.成員變數”的方式引用成員變數,如果沒有同名的情況下,可以直接使用。
執行結果
張三 25
Tom
5432112345
super的使用和說明
super關鍵字的作用是用於子類引用父類的成員,如屬性、方法或者構造器。
- 呼叫父類構造器
基本格式是:super([arg_list]);
直接用super()加上父類構造器所需要的引數,就可以呼叫父類的構造器了。如果父類中有多個構造器,系統自動根據super()中引數個數和引數型別類匹配父類中的構造器。
需要注意的是如果子類中沒有顯式地呼叫父類中無引數的構造器,也沒有在構造器中呼叫過載的其它構造器,則系統將會預設呼叫父類中無引數的構造器。此時如果父類中沒有無參的構造器,則編譯將會出錯。
子類中的成員方法在使用super的時候,一般儘可能的使用private私有化。
子類構造方法呼叫父類的構造方法一般用super(引數列表)的方式呼叫,引數不是必須的。同時還要注意,super(引數列表)這條語句只能用在子類構造方法體中的第一行。
- 呼叫父類方法、屬性
當super用於引用父類的屬性或方法時,使用下面的格式:
super.屬性
super.方法([arg_list])
注意,在這個時候,父類的屬性或方法必須是那些protected或者public等可以讓子類訪問的屬性或者方法。
案例分析
public class Father {
public String v = "父類Father";
public String x = "父類的成員變數";
public Father()
{
System.out.println("Father無參構造方法被呼叫");
}
public Father(String v)
{
this.v = "Father有參構造方法被呼叫";
}
public void showMessage()
{
System.out.println("Father的showMessage()方法被呼叫" );
}
public static void main(String args[])
{
//自動生成存根方法
}
}
public class Son extends Father {
public String v = "子類Son";
public Son()
{
//呼叫父類的構造方法,且只能放在第一行
super();
System.out.println("Son的無參構造方法被呼叫");
}
public Son(String str)
{
super(str);
System.out.println("Son的有參構造方法被呼叫");
}
//覆蓋了父類的成員方法showMessage()
public void showMessage()
{
System.out.println("Son的showMessage()方法被呼叫");
}
public void test()
{
String v = "區域性變數v覆蓋了成員變數v和超類變數v";
System.out.println("---------------------------");
System.out.println("子類區域性變數v="+v);
System.out.println("子類成員變數v="+this.v);
System.out.println("父類成員變數v="+super.v);
System.out.println("子類繼承而來的超類成員變數x="+x);
System.out.println("超類成員變數x="+super.x);
System.out.println("---------------------------");
showMessage();//呼叫子類的showMessage()方法
this.showMessage();//呼叫子類的showMessage()方法
super.showMessage();//呼叫父類的showMessage()方法
}
public static void main(String args[])
{
Son son =new Son();
son.test();
}
}