首页 > 代码库 > 黑马程序员_构造函数间的调用

黑马程序员_构造函数间的调用

  这是我的第一篇博客,从这篇开始我将记录下学习java的心得体会,欢迎志同道合的朋友随时与我讨论,共同进步。

  我们都知道,函数间可以互相调用。构造函数是一种特殊的函数,它用来给对象进行初始化,如果想在构造构造函数中调用另一个构造函数,分为以下两种情况:

1.子类调用父类的构造函数

  先来看一段代码

 1 class Person 2 { 3     public Person() 4     { 5         // 构造语句 6     } 7 } 8  9 class Student extends Person10 {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语句将多个构造函数串连起来。

  如果有什么写的不好的地方欢迎大家批评指正!谢谢!