this的用法
this关键字用在类的方法声明内部,表示“当前调用此方法的那个对象”的引用。
为什么这么用呢?首先看下面的例子:
public class TestThis {
public static void main(String[] args) {
Dog dog=new Dog();
dog.bark(2);
}
}
class Dog{
String name="";
public Dog() {
}
public void bark(int n){
System.out.println("叫"+n+"声");
}
}
在面向对象的编程中,经常要做的事情,就是“发送消息给对象”,要就是指的是“方法的调用”过程。
在上面的代码中指的就是:dog.bark(2);这句代码。而为了“发送消息”给对象这个过程,编译器“暗地里”,在这个方法的调用过程中干了一件事,就是“私底下”将dog这个引用作为参数,传递到了bark方法的内部。(当然,这个过程是编译器“偷偷”完成的,而不需要我们去明码表示出来,如果我们想自己明码完成这个过程,那一定会出错的,呵呵……)。
知道了上面的过程,那么,当你在定义一个类的方法时,如果想在这个方法内部获取“被偷偷”传进来的这个当前对象的引用呢?因为根本没有明码的标志符可用,所以,在Java中就有这个专门的关键字:this,用在方法定义的内部,表示当前正在调用此方法的那个对象的引用。
所以,这个时候,如果写出下面的代码:就能从本质上理解类的各个方法之间是如何相互调用的了。
public class TestThis {
public static void main(String[] args) {
Dog dog=new Dog();
dog.bark(2);
}
}
class Dog{
String name="";
public Dog() {
}
public void bark(int n){
this.bark(); //这里直接使用bark();即可,不应该画蛇添足使用this
System.out.println("叫"+n+"声");
}
public void bark(){
System.out.println("狗要叫啦!");
}
}
但是应该注意到,在上面的bark(int n)这个方法的定义中,使用了this.bark();,这里使用this是没有必要的,因为,编译器能够自动帮助我们添加这个this。但是,有的人却习惯这么使用,我现在刚刚学习Java,也是一直在这么使用,前段时间用swing写了点东西,里面也是这么用的。后来,朋友看我写的那些代码,呵呵,很乱很乱,因为我把this用在了没有必要使用的地方,所以,看我的代码的人就会觉得很乱。所以要养成良好的coding习惯啊。
当然,关于这种说法也有例外,比如说,为一个类的属性,定义getter和setter时,往往setter的参数的标志符和相应的属性相同,这个时候就需要在setter的内部使用this加以区分了。这也算是this关键字用在方法定义内部中的一种用法吧,当然,只是可能有的人在写代码时,没有这种习惯,比如说我就是。而,一些主流的java IDE却有这种习惯,呵呵。
class Dog{
String name="";
public Dog() {
}
public void setName(String name){
this.name=name;
}
}
在类的方法定义中使用this的时候,就是当必需明确指出当前对象的引用时,才使用。例如,我们在定义的方法中需要返回当前对象的引用时。
public class TestThis {
public static void main(String[] args) {
Dog dog=new Dog();
dog.bark(2);
}
}
class Dog{
String name="";
public Dog() {
}
public Dog bark(int n){
bark();
System.out.println("叫"+n+"声");
return this;
}
public void bark(){
System.out.println("狗要叫啦!");
}
}
或者,在方法定义中调用了其他的方法,而调用这个其它的方法时,需要将当前对象的引用传递给这个其它的方法作为参数,这个时候应该使用this。
总结:通过理解上面的内容,就不难理解,为什么在静态方法(static)内部,不能使用this关键字的原因了。
因为,在调用静态方法的时,不会将当前对象的引用传递进来(大多数情况,使用静态方法时,根本不会存在当前对象吧,呵呵)。
这样就不难得出使用静态方法时,几个需要注意的地方:
1:静态方法中只能调用其他的静态方法。
2:静态方法中只能访问静态属性。
3:静态方法中不能使用this关键字。(实际上也是上面的1和2)。
当然,上面的1、2两点是相对的,只是帮助我们理解,如果你在静态方法中,创建了一个类的对象,这个时候当然可以通过这个对象的引用访问这个对象的静态数据了。
最后得出一点:就是在调用静态方法时,一定要用类名去调用,而不建议使用对象的引用去调用(虽然,在语法上这样是允许的),避免引起混淆。