this调用所操作对象的引用
问题1:假如统一类型的两个对象,分别是a和b,其中还有一个方法peel(),那么我们怎么才能分辨这个方法到底是被a调用还是被b调用呢?
其实,在这期间编译器做了一些事后工作,它暗自把“所操作对象的引用”作为地一个参数传递给了peel()。假设你希望在方法的内部获得对当前对象的引用,就可以使用this关键字。
代码如下:
class Banana {
void peel(int i){
out.println(i);
}
}
public class BananaPeel {
public static void main(String[] args){
Banana a = new Banana();
Banana b = new Banana();
a.peel(1);
b.peel(2);
}
}
Banana.peel(a, 1);
Banana.peel(b, 2);
所以当我们在一个类的构造器中对当前类的数据成员进行初始化的时候,那个(this.var)代表的就是当前类的数据成员,而后面的var就是给构造器中传递过来的参数。
this关键字只能在类的内部进行使用,代表的是对“调用方法的那个对象”的引用。this关键字也可以将当前对象传递给其他方法,也可以作为方法的返回值,因为this在方法中代表的就是当前对象的引用。
this调用本类中的其他方法
对于网上的一些其他博客,会在一个方法中使用this调用本类中的其他方法,但这往往是没有必要的,我们不用写this,直接调用即可,编译器可以帮我们自动添加,也就是说,只有当需要明确指出对当前对象的引用时,才需要使用this关键字。
使用this调用构造器
当一个类中有多个构造方法时,可以利用this关键字相互调用。但是值得注意的是除够构造器外,编译器禁止在其他任何方法中调用构造器。
import static java.lang.System.out;
/**
* Created by paranoid on 17-3-31.
*/
class Flower{
int a;
String b;
Flower() {
this.a = 0;
this.b = "hello";
}
Flower(int a, String b) {
this();
out.println("successful");
}
}
public class ThisDemo {
public static void main(String[] args) {
Flower flower = new Flower(1, "hi");
out.println(flower.a + "," + flower.b);
}
}
执行结果:
如图,可以看到我们在有参数构造器中成功调用了无参数构造器。
注意:this可以在一个构造器中调用另一个构造器,但不能同时调用另外两个构造器,此外,必须将构造器调用置于最开始处,否则编译器会报错。
在了解了this关键字之后,我们再了解一下static的含义:使用static方法时不存在this,所以有些人就认为静态方法本质上不是类的成员,在Java虚拟机装载类的时候,这些静态的东西已经有了对象,它不过是在这个类中“寄居”,不需要通过类的构造器实例化。