1, 当局部变量和成员变量重名的时候, 在方法中使用 this 表示成员变量以示区分.
- class Demo{
- String str = "这是成员变量";
- void fun(String str){
- System.out.println(str);
- System.out.println(this.str);
- this.str = str;
- System.out.println(this.str);
- }
- }
- public class This{
- public static void main(String args[]){
- Demo demo = new Demo();
- demo.fun("这是局部变量");
- }
- }
分析: 上面的类 Demo 中有一个成员变量 str 和一个局部变量 str(类方法中的形式参数), 很显然局部变量和成员变量重名, 这个时候一般在方法中直接使用 str 实际上是使用局部变量 str, 对成员变量 str 没有任何影响, 此时如果需要对成员变量做点什么, 就必须使用 this 关键字.
有个问题, 如果方法中没有 str, 那么在方法中使用成员变量 str 会是什么情况呢? 实际上是方法内的所有操作都是针对成员变量 str 的. java 编程思想的 84 页中部有这样一句话: 如果在方法内部调用同一个类的另一个方法, 就不必使用 this. 同样, 在一个方法中如果没有局部变量和成员变量同名, 那么在这个方法中使用成员变量也不必使用 this, 可以运行下面的代码看看.
- class Demo{
- String str = "这是成员变量";
- void fun(String str1){
- System.out.println(str1);
- System.out.println(str);
- }
- }
- public class This{
- public static void main(String args[]){
- Demo demo = new Demo();
- demo.fun("这是局部变量");
- }
- }
2,this 关键字把当前对象传递给其他方法
这里有个很经典的例子, 就是 java 编程思想的 85 页的例子. 我们拿出来仔细研究.
- class Person{
- public void eat(Apple apple){
- Apple peeled = apple.getPeeled();
- System.out.println("Yummy");
- }
- }
- class Peeler{
- static Apple peel(Apple apple){
- //....remove peel
- return apple;
- }
- }
- class Apple{
- Apple getPeeled(){
- return Peeler.peel(this);
- }
- }
- public class This{
- public static void main(String args[]){
- new Person().eat(new Apple());
- }
- }
这是我自己的认识, 也许不正确, 看看书中是怎样说的: Apple 需要调用 Peeler.peel() 方法, 他是一个外部的工具方法, 将执行由于某种原因而必须放在 Apple 外部的操作 (也许是因为该外部方法要应用于许多不同的类, 而你却不想重复这些代码). 为了将其自身传递给外部方法, 必须使用 this 关键字.
分析: 设想一个场景, 假如各种水果去皮的工作都是一样的, 只要给我水果, 我都按同样的方法去皮. 那么结合上面的例子, 传进来一个水果, 我们吃之前 getPeeled(), 必须将此水果作为参数传递给外部的 peel(), 用 this 来代表自身传递给外部方法.
3, 当需要返回当前对象的引用时, 就常常在方法写 return this;
这种做法的好处是: 当你使用一个对象调用该方法, 该方法返回的是经过修改后的对象, 且又能使用该对象做其他的操作. 因此很容易对一个对象进行多次操作.
- public class This{
- int i = 0;
- This increment(){
- i += 2;
- return this;
- }
- void print(){
- System.out.println("i =" + i);
- }
- public static void main(String args[]){
- This x = new This();
- x.increment().increment().print();
- }
- }
结果为: 4
4, 传递多个参数
在网上看到 this 的如下功能:
其实我觉得这和本文的第二条一样, 就是使用 this 把自身对象作为参数传递给一个工具方法, 不同的是这里的工具方法是在本类中而已. 其实大家可以分析这两种的区别.
5, 在构造器中调用构造器需要使用 this.
一个类有许多构造函数, 有时候想在一个构造函数中调用其他构造函数, 以避免代码重复, 可以使用 this 关键字. 在 java 编程思想中有这样一段话: 通常写 this 的时候, 都是指 "这个对象" 或者 "当前对象", 而且它本身表示对当前对象的引用. 在构造器中, 如果为 this 添加了参数列表, 那么就有不同的含义. 这将产生对符合此参数列表的某个构造器的明确调用; 这样调用其他构造函数就有了直接的途径.
仔细分析: 从主函数开始, new Flower() 会在内存分配空间, 初始化对象, 初始化对象是调用构造函数, 这里没有写任何参数, 当然是调用默认构造函数, 就是那个无参的构函数. 这个无参的构造函数的第一行代码就是 this("hi",122); 这里的意思是该无参构造函数又去调用带两个参数的构造函数, 来到带两个参数的构造函数, 第一行代码是 this(s); 这行代码自动匹配带一个参数的构造函数, 发现 Flower(String ss) 这个比较匹配, 都是 String 类型的参数. 然后调用了带有一个 String 类型参数的构造函数, 打印: 只有 String 类型的参数的构造函数 s = hi; 然后回到上一级调用函数, 就是带有两个参数的构造函数, 打印输出: 有 String 和 int 类型的参数的构造函数; 再回到上一级, 就是无参构造函数, 打印: 默认构造函数. 此时构造函数已经初始化完成新建的对象, 最后在主函数的最后一行代码中打印: petalCount=122 s=hi.
画个图看得更明白.
有几点要注意:
1,this 只可以调用一个构造器, 在一个构造器中不能同时调用两个构造器;
2, 必须将你所调用的构造器放在最开始的位置, 这也解释了为什么不能在一个构造函数中调用两个构造器, 那第二个势必不在最开始位置.
3, 本例中在带有两个参数的构造函数中可以用 this 调用其他任意一个只有一个参数的构造函数, 这取决你自己, 随便调哪一个都可以.
4, 在构造函数之外的方法内不能使用 this 调用构造函数. 代码里面注释的都不能正确编译.
6,this 总结
1, 表示对当前对象的引用!
2, 表示用类的成员变量, 而非函数参数.
3, 用于在构造方法中引用满足指定参数类型的构造器 (其实也就是构造方法). 但是这里必须非常注意: 只能引用一个构造方法且必须位于开始!
4, 很明显 this 不能用在 static 方法中, 因为 this 指代当前对象, 而 static 则无对象之说.
来源: http://www.bubuko.com/infodetail-3654814.html