前言
this
关键字属于Java中比较复杂的关键字之一,若是学习过C++或者其他的一些面向对象语言也会遇到this这个关键字并且都会看到this的含义就是表示当前对象。下面将介绍this所表示的当前对象的含义,以及this在Java中的一些用法。
this调用属性
当我们写带参构造函数时,会倾向于将形参名取与将要赋值的属性名相同,这样就更容易看见形参就知道它是给哪个属性赋值。
class Student{
private String name;
private int age;
public Student(String name, int age){
}
}
在构造函数中赋值的时候,会很容易写成下面这样:
class Student{
private String name;
private int age;
public Student(String name, int age){
name = name;
age = age;
}
}
若写成这样,当构造Student这个对象并输出该对象的姓名和年龄时会发现,name为null, age为0。
造成这样的原因是因为有局部可见性。通常使用{}括起来的一个数据块叫做一个作用域范围。在同一个作用域范围定义了两个同名的变量则会报错;若是在该作用域定义了一个与该作用域范围之外同名的变量则是可以的,在这个作用域同时使用这两个变量,则在这个作用域中定义的变量会屏蔽作用域范围之外的那个变量,即在该作用域中定义的变量才会有效。
简单来说,在同一作用域内,作用范围小的变量会屏蔽同名的作用范围大的变量。
若是想要Student类中的属性可以被正确初始化,那么则需要使用this关键字。
class Student{
private String name;
private int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
}
this调用方法
this不仅可以调用类中的属性还可以调用类中的方法。
类中的方法有普通方法和构造方法。
-
在本类的普通函数中调用其他普通函数,可以在函数前面加上this也可以不加。(一般不用加上)
-
普通方法中不可以调用构造函数,构造函数的调用只能出现在第一次创建对象为对象进行初始化时调用。
-
在构造函数中调用普通方法,一般不推荐调用在方法内部使用了属性的普通方法。因为构造函数还没有执行完,属性没有被完全初始化,这时使用属性可能会出现异常。
-
构造函数之间可以相互调用。构造函数之间相互调用一定要使用this关键字。这也是this的重要应用之一。使用
this()
表示调用无参构造函数,this(arg1,...)
表示调用带参构造函数。
public class Student{
private String name = null;
private int age = 0;
public Student() {
System.out.println("Student():name="+name+",age="+age);
}
public Student(String name, int age) {
this(); //若使用Student()则会报错:没有定义这个方法。被当做普通方法来解释
this.name = name;
this.age = age;
System.out.println("Student(String name, int age):name="+name+",age="+age);
}
public static void main(String[] args) {
Student stu = new Student("Sakura",20);
}
}
/*
output:
Student():name=null,age=0
Student(String name, int age):name=Sakura,age=20
*/
构造函数之间为什么要相互调用呢?
因为要减少构造函数中代码的重复问题,提高代码的重用性。所以,构造函数之间相互可以调用也就理所当然了。
构造函数之间相互调用有一些限制需要注意:
this()
或者this(arg1, ...)
需要被放在构造函数内部的首行。- 进行构造方法相互调用的时候,一定要保留调用的出口。
至少保留相互调用之间的一个构造函数没有使用this调用其他构造函数,此构造函数作为出口。避免递归调用。
this表示当前对象
同一个类的不同对象,它们的属性是属于不同空间的,但却共享类中的方法。所以它们需要一种方式表明是它们自己在调用该方法而不是其他的对象。
所以,当对象调用方法时,该对象会作为一个隐含实参传入到非静态方法中,在非静态方法中使用this来指向它,表明是它在调用该方法。
查看下面例子,可以发现this就是指向的是当前正在调用类中方法的对象。
所以前面使用this.属性也就很容易理解了,就是当前对象的属性。
小结
简单介绍了Java中的this关键字应用的几个方面,其中最主要的应用在于构造器之间的相互调用。
参考:
[1] Eckel B. Java编程思想(第四版)[M]. 北京: 机械工业出版社, 2007