1. 程式人生 > >super、this 用法

super、this 用法

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Java super

作用:顯示或隱士呼叫父類構造方法,預設預設super()

構造方法:方法名和類名相同,屬性public,無返回值

  • 構造方法可多個,以過載的形式出現,物件建立預設以無參的建構函式為入口建立,可以隱藏

子類繼承父類

注意:super父類介面一定會執行

  • 若父類只有無參建構函式,子類繼承父類在子類的建構函式可以隱式通過super呼叫父類建構函式(可省略)

原因:子類繼承父類例項化時是先從父類先開始例項化的,建構函式就是物件例項化的入口

  • 父類只存在1個有參建構函式,那麼子類建構函式中必須顯示呼叫父類的介面(super:引數必須一致)

  • 若父類存在多個建構函式,子類繼承只需要繼承父類的一個建構函式使用介面即可 (如果父類存在一個無參建構函式,可隱士呼叫)

注意:一般為了提高程式的健壯性,在建立有參的建構函式時一般一起顯示建立無參的建構函式,使得建立無參的建構函式時不會報錯,若物件必須使用引數才能初始化,只需建立一個有參建構函式即可,可以約束物件例項的建立流程

package com.zhiwei.basic;
class ParentCase{
	
	private String name="parent";
	public ParentCase(){
		System.out.println("父類無參建構函式"+name);
	}
	
	public ParentCase(String name){
		this.name=name;
		System.out.println("父類有參建構函式"+name);
	}
	
}

public class SonCase extends ParentCase{

	public SonCase(){
		super();
	}
	
	public SonCase(String name) {
		super(name);
		System.out.println("子類有參建構函式:son");
	}
	
	public static void main(String[] args) {
		new SonCase("son");
		new SonCase();
	}
	
}

-------------------------結果-----------------------------

父類有參建構函式son
子類有參建構函式:son
父類無參建構函式parent

Java this

作用: 標識當前呼叫方法的物件(普通方法/構造方法)

注意:this()函式呼叫只能放在構造無參建構函式的第1句,否則編譯報錯,靜態函式沒有this指標,類屬性和方法沒有放在同一個儲存區,一般用this區分

package com.zhiwei.basic;
public class BasicThis {
	
	public static void main(String[] args) {
		
		TestThis aa=new TestThis();
		aa.setName("hello");
		
		TestThis bb=new TestThis();
		bb.setName("Java");

		//測試this()無參建構函式的用法
		TestThis cc=new TestThis();
		System.out.println(cc);
	}
}

class TestThis{
	
	private String name;

	public String getName() {
		return name;
	}
    
	/**
	 * 列印引用該物件的自定義引數
	 * @param name
	 */
	public void setName(String name) {
		this.name = name; 
		System.out.println(this);
	}

	public TestThis(String name) {
		super();
		this.name = name;
	}
	
	/**
	 * 表示無參構造行數時預設呼叫TestThis(String str)的構造方法來初始化物件
	 * 這種形式在Tomcat、Spring等框架中設定預設配置中經常使用
	 * 
	 */
	public TestThis() {
		 this("張三");   
	}
    
	/**
	 *重寫toString方法列印自定義引數
	 *證明this表示對當前方法的引用物件 
	 */
	@Override
	public String toString() {
		return "TestThis [name=" + name + "]";
	}
}

--------------------------結果------------------------------

TestThis [name=hello]
TestThis [name=Java]
TestThis [name=張三]

結果分析: 第一段:

TestThis [name=hello]
TestThis [name=Java]

因為重寫toString方法列印物件的屬性name的值,因為name為public修飾只屬於類的例項,列印的內容分別為自定義引數hello和Java,表明this表示的是兩個不同的物件,也就是自定義的兩個物件例項

第二段:

TestThis [name=張三]
TestThis cc=new TestThis();

物件建立時並未指定初始化引數,但是卻打印出該物件的name屬性值,這表明該物件初始化時呼叫this(),而this呼叫有參的建構函式