一、在Java中,this通常指當前對象,super則指父類的。當你想要引用當前對象的某種東西,比如當前對象的某個方法,或當前對象的某個成員,你便可以利用this來實現這個目的,當然,this的另一個用途是調用當前對象的另一個構造函數,這些馬上就要討論。如果你想引用父類的某種東西,則非super莫屬。由於this與super有如此相似的一些特性和與生俱來的某種關係,所以我們在這一塊兒來討論,希望能幫助你區分和掌握它們兩個。
最普遍的情況就是,在你的方法中的某個形參名與當前對象的某個成員有相同的名字,這時爲了不至於混淆,你便需要明確使用this關鍵字來指明你要使用某個成員,使用方法是“this.成員名”,而不帶this的那個便是形參。另外,還可以用“this.方法名”來引用當前對象的某個方法,但這時this就不是必須的了,你可以直接用方法名來訪問那個方法,編譯器會知道你要調用的是那一個。
public class Demo { private String name; private int age; DemoThis(String name,int age) { //你可以加上this來調用方法,像這樣:this.setName(name);但這並不是必須的 setName(name); setAge(age); this.print(); } public void setName(String name) { //此處必須指明你要引用成員變量 this.name=name; } public void setAge(int age) { this.age=age; } public void print() { //在此行中並不需要用this,因爲沒有會導致混淆的東西 System.out.println("Name="+name+" Age="+age); } public static void main(String[] args) { DemoThis dt=new DemoThis("Kevin","22"); } }
this和super不再是像以前那樣用“.”連接一個方法或成員,而是直接在其後跟上適當的參數,因此它的意義也就有了變化。super後加參數的是用來調用父類中具有相同形式的構造函數,如1和2處。this後加參數則調用的是當前具有相同參數的構造函數,如3處。當然,在Chinese的各個重載構造函數中,this和super在一般方法中的各種用法也仍可使用,比如4處,你可以將它替換爲“this.prt”(因爲它繼承了父類中的那個方法)或者是“super.prt”(因爲它是父類中的方法且可被子類訪問),它照樣可以正確運行。但這樣似乎就有點畫蛇添足了。
public class Chinese extends Person{
Chinese(){
super(); //調用父類構造函數(1)
prt("A chinese."); ///(4)
}
Chinese(String name){
super(name); ///調用父類具有相同形參的構造函數(2)
prt("his name is:"+name);
}
Chinese(String name,int age){
this(name); ///調用當前具有相同形參的構造函數(3)
prt("his age is:"+age);
}
public static void main(String[] args){
Chinese cn=new Chinese();
cn=new Chinese("kevin");
cn=new Chinese("kevin",22);
}
}
二.Final 不僅可以定義常量,還可以讓你控制你的成員、方法或者是一個類是否可被覆寫或繼承等功能,用final聲明變量一旦被初始化便不可改變,這裏不可改變的意思對基本類型來說是其值不可變,而對於對象變量來說其引用不可再變。
public class Bat
{
final PI=3.14; ///在定義時便給址值
final int i; ///因爲要在構造函數中進行初始化,所以此處便不可再給值
final List list; ///此變量也與上面的一樣
Bat(){//構造函數
i=100;
list=new LinkedList();
}
Bat(int ii,List l){ //帶參數的構造函數
i=ii;
list=l;
}
public static void main(String[] args){
Bat b=new Bat();
b.list.add(new Bat());
//b.i=25; ///i的值不能改變
//b.list=new ArrayList();list的值不能重新實例化
System.out.println("I="+b.i+" List Type:"+b.list.getClass());
b=new Bat(23,new ArrayList());
b.list.add(new Bat());
System.out.println("I="+b.i+" List Type:"+b.list.getClass());
}
}