构造方法中的super()和this()
首先我们先来了解一下java中的构造方法(和C++的构造函数作用上大致相同),构造方法是在对象被创建的时候,对对象成员进行初始化的方法。需要注意以下几点:
(1)构造方法的名称与类名相同;
(2)构造方法没有返回值类型,但是不能写void;
(3)构造方法可以重载。
下来我们再了解一下this()和super()的作用:
this():
(1)如果同一类的成员变量与局部成员变量的名称相同时,可以利用this调用同一类的成员变量。举个例子:
//java
class Student{
public int num;//学号
public int age;//年龄
public Student(int num,int age){
this.num=num;
this.age=age;
System.out.println("Student类的构造方法(使用this)已经被调用!");
}
(2)java语言允许在类内实现:某一构造方法调用另一构造方法,但是实现该操作必须使用this关键字来调用。(this关键字必须放在第一行。)
//java
class Student{
public int num;//学号
public int age;//年龄
public Student(int num1,int age1){
num=num1;
age=age1;
System.out.println("Student类的构造方法(使用this)已经被调用!");
}
public Student(){
this(num1,age1);//第一行
System.out.println("Student类的无参构造方法已经被调用!");
}
}
super(参数列表):
super(参数列表)语句的作用是在类的继承的中调用父类对应的构造方法,如果省略,则默认在第一行加上super()来调用父类中的无参构造方法,(super()语句必须放在子类构造方法的第一行。)
//java
class Person{
public String name;
public Person(name){
this.name=xingming;
System.out.println("Persont类的有参构造方法已经被调用!");
}
}
class Student extends Person{
public int num;//学号
public int age;//年龄
public Student(int num,int age,String name){
super(name);//第一行
this.num=num;
this.age=age;
System.out.println("Student类的构造方法(使用this)已经被调用!");
}
}
最后我们需要注意的是:为什么java的构造函数中的this()和super()要放在第一行且不能同时出现???
super(参数列表)执行的操作父类初始化,为了保证初始化的顺序,其需要放在构造方法的第一行 当第一行没有写super()语句时,编译器会自动在构造方法的第一行加上无参super()语句。
this关键字执行的操作也是初始化,为了保证初始化的顺序,其需要放在构造方法的第一行。
一个对象不能被反复初始化,表现为this()和super()都要写在构造方法的第一行来执行初始化操作,所以注定两者不能同时出现在同一个构造方法中。