this,this和static方法。
一、this
我感觉think in java中对于this的概念讲得不是很好啊,干脆从查看别人的总结。
(1)this使用范围
- 在类的方法定义中使用的this关键字代表调用该方法对象的引用。
- 当必须指出当前使用方法的对象是谁时,要使用关键字this。
- 有时使用this可以处理方法中成员变量和参数重名的情况。
- this可以看做是一个变量,它的值是当前对象的引用。
注:this一般出现在方法中,当方法没有被调用时。并不知道this指向那个具体的对象。
当某个对象调用有this的方法时,this就指向调用这个方法的对象。
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
package test; public class testThis { private int i; public testThis(int i){ this.i = i; } private testThis increment(){ i += 1; return this; } public static void main (String[] args){ testThis testThis = new testThis(100); System.out.println(testThis); System.out.println(testThis.increment()); System.out.println(testThis.increment().increment()); System.out.println(testThis.increment().increment().i); } } |
结果为:
1 2 3 4 |
test.testThis@139a55 test.testThis@139a55 test.testThis@139a55 105 |
可以见到,这里的this指的是testThis这个对象
this主要要三种用法:
- 表示对当前对象的引用!
- 表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。
- 用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
- 注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!虽然夸张,但是却充分说明this不能在static方法中使用!
二、this和static方法
记得think in java 第二章 一切都是对象 第二部分中稍微提及了一下static,现在我们感受一下为什么static方法不可以用this。
写一个错误的方法:
1 2 3 4 |
private static testThis increment(){ i += 1; return this; // 这里报错了,Cannot use this in a static context } |
就像这段代码一样,瞬间就报错了,Cannot use this in a static context,static方法中不可以使用this。
为什么呢?
因为涉及对象在jvm中创建的过程问题。
因为Static方法是类方法,先于任何的实例(对象)存在。即Static方法在类加载时就已经存在了,但是对象是在创建时才在内存中生成的。
而this指代的是当前的对象,在这个时候类还在加载呢,还没有到在内存中生成对象的步骤(即当前类对象还不存在),this怎么能代表一个不存在的对象呢?所以这时候就报错了。
三、总结
this稍微有用到,我觉得java中使用this其实和使用对象是一个道理,没有必要刻意去使用。
适当使用this可以让代码显得简洁易懂,可以适当使用。