所以,我们在实际编程的时候有时候需要在一个构造方法中对另一个构造方法进行调用。但是,在使用this关键字调用其他构造方法的时候,this()调用构造方法只能放在构造方法的首行,为的是能
够为类中的属性初始化;而且至少有一个构造方法是不用this调用,否则程序会出现错误。
class Student
{
private String name ; private int age ; public Student () { this("李明",20) ;//调用有两个参数的构造方法
System.out.println("新对象实例化") ; } public Student (String name) {
this() ;
}
public Student (String name,int age) { this(name) ;
this.age = age ; } public String getInfo(){
return "姓名:" + name + ",年龄:" + age ; }}
public class ThisExample05
{ public static void main(String args[]) { Student stu1 = new Student ("李小明",19) ;
System.out.println(stu1.getInfo()) ; }}
这时候构造方法就出现了递归调用,程序出错。
注意的是,使用this调用构造方法只适用于构造方法的调用,类中的其他方法不能使用这种方法。
三、使用this引用当前对象
this最重要的特定就是表示当前对象,那什么叫当前对象呢?在Java中当前对象就是指当前正在调用类中方法的对象。使用this引用当前对象是指如果在类的方法中需要返回一个对象,并且该对象是
方法所在的类的当前对象,可以使用this关键字作为方法的返回值。例如:
class Student
{ public String getInfo()//取得信息的方法
{ System.out.println("Student类 --> " + this) ; // 直接打印this
return null ; //为了保证语法正确,返回null }}
public class ThisExample06{ public static void main(String args[]) { Student stu1 = new Student();//调用构造实例化对象
Student stu2 = new Student();//调用构造实例化对象
System.out.println("MAIN方法 --> " +stu1) ; //直接打印对象
stu1.getInfo() ; // 当前调用getInfo()方法的对象是stu1
System.out.println("MAIN方法 --> " +stu2) ; //直接打印对象
{ private String name //姓名
private int age ; //年龄
public Student (){// 无参构造System.out.println("新对象实例化") ; } public Student (String name)
{ System.out.println("新对象实例化") ;
} public Student (String name,int age) // 通过构造方法赋值
{ System.out.println("新对象实例化") ; //为类中的name属性赋值
this.age = age ; //为类中的age属性赋值 } public String getInfo(){//取得信息的方法return "姓名:" + name + ",年龄:" + age ; }}
public class ThisExample03
{ public static void main(String args[]) { Student stu1 = new Student ("李明",20) ; //调用构造实例化对象
System.out.println(stu1.getInfo()) ; //取得信息
}}
这个例子中,一个无参的构造方法,一个提供一个参数用于设置姓名的构造方法,还有一个提供两个参数用于设置姓名和年龄的构造方法,这三个方法都是用来打印新对象实例化的信息,很明显,此
时如果在各个构造方法中编写输出语句肯定是不合适的,其中有一些代码重复了,现在只是一行,所以感觉不出来,如果现在的代码有很多行的话,以上代码的缺陷就立刻显现出来了。那么,最好让
构造方法间进行相互的调用,这时就可以用“this(参数列表)”的形式完成,用this修改以上的代码如下:
class Student
{ private String name ; private int age ; public Student(){ System.out.println("新对象实例化") ; }
public Student (String name) { this() ; //调用本类中的无参构造方法
= name ; } public Student (String name,int age) {
this(name); //调用有一个参数的构造方法 this.age = age ; }
public String getInfo(){ //取得信息的方
法 return "姓名:" + name + ",年龄:" + age ;
}}
public class ThisExample04
{ public static void main(String args[]) {
Student stu1 = new Student ("李明",20) ; System.out.println(stu1.getInfo()) ; }
}
一个类中有多个构造方法,因为其名字都相同,跟类名一致,那么这个this到底是调用哪个构造方法呢?
stu2.getInfo() ; // 当前调用getInfo()方法
}}
我们再用一个例子来解释this引用当前对象。public class Car
{ public Car getCarObject(){ return this; //返回当前对象}
public static void main(String[] args) { Car sc = new Car ();//创建一个Car对象 System.out.println( sc.getCarObject() instanceof Car);
}}