java中的 this、super 和 final

        一、在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());
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章