Java中this的功能与作用
粗粒度上来说,Java中关键字this主要有2个功能:
1、表示“当前对象”的引用
(1)作为参数传入
【程序实例1】
1 public class MyObject { 2 3 public Integer val; 4 5 public MyObject() { 6 this.val = 0; 7 } 8 9 public void methodA(Integer x) { 10 this.val += x; 11 System.out.println("MethodA: val = " + this.val); 12 } 13 14 }
1 public static void main(String[] args) { 2 MyObject objA = new MyObject(); 3 MyObject objB = new MyObject(); 4 System.out.println("Main A: val = "+objA.val); 5 System.out.println("Main B: val = "+objB.val); 6 7 objA.methodA(3); 8 objB.methodA(10); 9 }
【运行结果】
1 Main A: val = 0 2 Main B: val = 0 3 MethodA: val = 3 4 MethodA: val = 10
【结果分析】
在main函数中,我们创建了两个对象objA和objB,并它们调用了同一个方法methodA(), 但是传入的参数是不同,那么methodA()是怎么知道它是objA、objB调用的呢?
其实,是编译器在暗中做了一个操作:将“所操作对象”的引用作为第一个参数传给了被调用的方法。
对应于程序实例1中代码,就是:
objA.methodA(3) --- methodA(objA,3)
objB.methodA(10) --- methodA(objB,10)
前面说,将操作对象的引用作为第一个参数传入到了方法中,参数传进来是要来使用的,否则多此一举传到方法中干啥,那么在方法内部该怎么获得“操作对象的引用”呢?
仔细观察程序实例1中的MyObject类的methodA(),发现:this.val += x;
也就是说,我们要取当前对象的val值,然后与x相加,再赋值给val。没错,此时this就是操作对象的引用!
其实,面向对象的编程语言中,都有类似java中this的关键字:C++中的this、Python中的self。
(2)作为参数返回
【程序实例2】
1 public class MyObject { 2 3 public Integer val; 4 5 public MyObject() { 6 this.val = 0; 7 } 8 9 public MyObject methodA(Integer x) { 10 this.val += x; 11 return this; 12 } 13 14 public void printf(){ 15 System.out.println("print: val="+this.val); 16 } 17 18 }
1 public static void main(String[] args) { 2 MyObject objA = new MyObject(); 3 objA.methodA(3).printf(); 4 5 }
【运行结果】
1 print: val=3
【结果分析】
由于methodA()中返回的参数是this,我们才可以链式地调用方法printf(),否则,不能链式地调用。(this可以作为返回值很有用啊)
当然,此处的this仍然是当前操作对象的引用。
====================我是华丽的分割线====================
再说下,this不被建议使用的情况:
【程序实例3】
1 public class MyObject { 2 3 public Integer val; 4 5 public MyObject() { 6 this.val = 0; 7 } 8 9 public void methodA(Integer x) { 10 this.val += x; 11 this.methodB(); 12 System.out.println("MethodA: val = " + this.val); 13 } 14 15 private void methodB(){ 16 System.out.println("Run methodB !"); 17 } 18 19 }
该代码是可以正常运行的,但是其实程序的第11行中的this是不符合规范的:如果我们想在方法内部调用另外一个方法,那么直接写方法名即可,不需要加上this。如果非要写上也可以,但是毫无必要。
2、在构造器中调用构造器
一个类中可能会有多个构造器,这时,如果想在一个构造器中调用另外一个构造器,则可以使用this。
【程序实例4】
1 public class MyObject { 2 3 public Integer val; 4 5 public String strVal; 6 7 public MyObject(Integer x) { 8 this.val = x; 9 } 10 11 public MyObject(String str){ 12 this.strVal = str; 13 } 14 15 public MyObject(Integer x, String str){ 16 this(x); 17 this.strVal = str; //此处不能再次使用this(str) 18 } 19 20 }
注意:
(1)可以用this调用另一个构造器,但是却不能调用两个;
(2)必须将构造器的调用放在方法的起始处,否则编译器会报错。
转载时,请附上本文出处:http://www.cnblogs.com/acode/p/5829879.html
作者: Acode
出处: http://www.cnblogs.com/acode/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可留言咨询.