今天看到一個這段代碼
public DataSourcePool(String driver, String url, String user, String pwd) throws Exception { this(driver, url, user, pwd, 5); } public DataSourcePool(String driver, String url, String user, String pwd, int poolSize) throws SQLException, ClassNotFoundException { this.url = url; this.user = user; this.pwd = pwd; this.poolSize = poolSize; Class.forName(driver); init(3); }
然后突然發現自己忘了構造函數中的this()是干什么用的,雖然憑借原理能夠大致推敲出是調用了另外的構造函數,但具體是怎么樣的還是手動試了下。
public class Person { private String name; private Integer age; private String sex; public Person(String name) { this.name = name; } public Person(String name, Integer age, String sex) { this(name, age); } public Person(String name, Integer age) { this.name = name; this.age = age; System.out.println("aa"); } public static void main(String[] args) { Person person = new Person("小明", 17, "男"); System.out.println(person); System.out.println(person.name); System.out.println(person.age); System.out.println(person.sex); }
main方法中的new Person("小明", 17, "男")按理來說是創建了一個信息為(姓名:“小明”,年齡:17歲,性別“男”)的對象,但輸出性別的時候卻是null,最后的輸出結果是
aa test.Person@1b6d3586 小明 17 null
而且如下寫法是會報錯的——Recursive constructor invocation——“遞歸構造函數調用”的意思,這樣進入了死循環
public Person(String name, Integer age, String sex) { this(name, age, sex); }
由此可知,在一個構造方法中寫this(參數...)方法其實是在調用原本的構造方法時進入this(參數...)這個方法,使用了相對應this(參數...)的構造函數創建了對象。
super()就是調用父類的構造方法了