这是我的第一篇博客,从这篇开始我将记录下学习java的心得体会,欢迎志同道合的朋友随时与我讨论,共同进步。
我们都知道,函数间可以互相调用。构造函数是一种特殊的函数,它用来给对象进行初始化,如果想在构造构造函数中调用另一个构造函数,分为以下两种情况:
1.子类调用父类的构造函数
先来看一段代码
1 class Person 2 { 3 public Person() 4 { 5 // 构造语句 6 } 7 } 8 9 class Student extends Person 10 { 11 public Student() 12 { 13 super(); 14 // 其他构造语句 15 } 16 }
这个例子很简单,类Student是类Person的子类,在类Student的构造函数中调用父类的构造函数直接写super()即可,要注意的是这一句必须放在构造函数的第一句。这是显式调用,如果不写的话,实例化子类时java虚拟机也会先调用父类的无参构造方法。稍复杂一点的情况是,若父类只定义了带参数的构造方法(此时父类中不会有默认的无参构造方法),则在子类构造方法中需手动调用父类的带参数的构造方法,否则编译出错,因为虚拟机默认先调用父类的无参构造方法。当然,也可在父类中添加一个无参构造方法来解决。
2.调用本类重载的构造函数
一个类可能有多个构造函数,它们之间如何互相调用呢?下面还是看一段代码再说
1 class Person 2 { 3 String name; 4 int age; 5 6 public Person() 7 { 8 // 无参构造方法 9 } 10 11 public Person(String name) 12 { 13 this.name = name; 14 } 15 16 public Person(String name, int age) 17 { 18 this(name);// 调用自身的构造方法,this代表对象 19 this.age = age; 20 } 21 }
这里给类Person添加了两个成员变量,有三个构造方法,当我们写含有两个参数的构造方法时,可能会写成这样:
1 public Person(String name, int age) 2 { 3 this.name = name; 4 this.age = age; 5 }
这样写当然是正确的,但我们发现第一个语句已经在上一个构造方法中写过了,为了避免重复,我们打算在这个构造方法中调用定义好的含一个参数的构造方法。第一反应可能会写成这样:Person(name);这时编译会出现错误,一般函数调用可以直接用函数名(参数)的形式来调用,但构造函数不行,调用类中的构造函数只能用this语句来实现,这时this表示的是要进行初始化的对象,且此句也必须写在构造方法中的第一句。因为初始化要先执行。
使用this语句进行类中构造函数的优点是可以提高代码的复用性,当不想对外提供过多的构造函数时,可以通过this语句将多个构造函数串连起来。
如果有什么写的不好的地方欢迎大家批评指正!谢谢!