今天看到一个这段代码
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()就是调用父类的构造方法了