super、this 用法
阿新 • • 發佈:2019-03-03
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呼叫有參的建構函式