01_构造函数间的调用

 

  这是我的第一篇博客,从这篇开始我将记录下学习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语句将多个构造函数串连起来。

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

 

posted @ 2014-06-27 23:13  票票子  阅读(177)  评论(0编辑  收藏  举报