Java中this的功能与作用
粗粒度上来说,Java中关键字this主要有2个功能:
1、表示“当前对象”的引用
(1)作为参数传入
【程序实例1】
public class MyObject {
public Integer val;
public MyObject() {
this.val = 0;
}
public void methodA(Integer x) {
this.val += x;
System.out.println("MethodA: val = " + this.val);
}
}
public static void main(String[] args) {
MyObject objA = new MyObject();
MyObject objB = new MyObject();
System.out.println("Main A: val = "+objA.val);
System.out.println("Main B: val = "+objB.val);
objA.methodA(3);
objB.methodA(10);
}
【运行结果】
Main A: val = 0
Main B: val = 0
MethodA: val = 3
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】
public class MyObject {
public Integer val;
public MyObject() {
this.val = 0;
}
public MyObject methodA(Integer x) {
this.val += x;
return this;
}
public void printf(){
System.out.println("print: val="+this.val);
}
}
public static void main(String[] args) {
MyObject objA = new MyObject();
objA.methodA(3).printf();
}
【运行结果】
print: val=3
【结果分析】
由于methodA()中返回的参数是this,我们才可以链式地调用方法printf(),否则,不能链式地调用。(this可以作为返回值很有用啊)
当然,此处的this仍然是当前操作对象的引用。
====================我是华丽的分割线====================
再说下,this不被建议使用的情况:
【程序实例3】
public class MyObject {
public Integer val;
public MyObject() {
this.val = 0;
}
public void methodA(Integer x) {
this.val += x;
this.methodB();
System.out.println("MethodA: val = " + this.val);
}
private void methodB(){
System.out.println("Run methodB !");
}
}
该代码是可以正常运行的,但是其实程序的第11行中的this是不符合规范的:如果我们想在方法内部调用另外一个方法,那么直接写方法名即可,不需要加上this。如果非要写上也可以,但是毫无必要。
2、在构造器中调用构造器
一个类中可能会有多个构造器,这时,如果想在一个构造器中调用另外一个构造器,则可以使用this。
【程序实例4】
public class MyObject {
public Integer val;
public String strVal;
public MyObject(Integer x) {
this.val = x;
}
public MyObject(String str){
this.strVal = str;
}
public MyObject(Integer x, String str){
this(x);
this.strVal = str; //此处不能再次使用this(str)
}
}
注意:
(1)可以用this调用另一个构造器,但是却不能调用两个;
(2)必须将构造器的调用放在方法的起始处,否则编译器会报错。
转载时,请附上本文出处:http://www.cnblogs.com/acode/p/5829879.html
Java中this的功能与作用的更多相关文章
- java中instanceof和getClass()的作用
初学者难免有点混淆java中instanceof和getClass()的作用, 下面就来一一讲解. 父类A: class A { } 子类B: class B extends A { } 构造对象 ...
- Java 中的接口有什么作用?以及接口和其实现类的关系?
Java 中的接口有什么作用? - Ivony的回答 - 知乎 https://www.zhihu.com/question/20111251/answer/16585393 这是一个初学者非常常见的 ...
- java中堆栈的功能作用 以及區別(搜集)
1.用new创建的对象在堆区,函数中的临时变量在栈区,Java中的字符串在字符串常量区. 2.栈:存放进本数据类型的数据和对象的引用,但对象本身不存在栈中,而是存放在堆中. 堆:存放new产生 ...
- Java 中的接口有什么作用?好处?
接口的作用就是把使用接口的人和实现接口的人分开,实现接口的人不必要关心谁去使用,而使用接口的人也不用关心谁实现的接口,由接口将他们联系在一起. 很多JAVA初级程序员对于接口存在的意义很疑惑.不知道接 ...
- java中实现定时功能
网上资料: 我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下: 1.基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务 ...
- JAVA中各个包的主要作用
00:48:0800:48:1022013013-06-282013-06-2800:48:182013-06-2800:48:20 java.util是JAVA的utility工具包 java.l ...
- java中的Class.forName的作用
Class.forName有什么作用 Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行.这句话就是装载类用的(和ne ...
- Java中HashCode()和equals()的作用
引言 我们知道Java中的集合(Collection)大致可以分为两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 这里就引出一个问题: ...
- java中的byte有什么作用?
byte即字节的意思,是java中的基本类型,用心申明字节型的变量. 通常在读取非文本文件时(如图片,声音,可执行文件)需要用字节数组来保存文件的内容,在下载文件时,也是用byte数组作临时的缓冲器接 ...
随机推荐
- os项目icon和default 等相关图标命名规则和大小设置
最新的参考apple官网地址:https://developer.apple.com/library/ios/qa/qa1686/_index.html,网页下面有详细的使用方法(ios7以后的) 转 ...
- Javascript的AMD规范
Javascript发展到今天,已经从一个小丑语言变成了不可替代的前端利器,已经脱离了低端的玩笑脚步,而转变为有规可依的强大语言. 本文主要讲述下如今被大力推广的AMD规范,为什么要AMD,什么场景是 ...
- Java循环性能随笔
for iterator做迭代循环性能最好 然后是foreach 然后是提前声明好变量的for循环 最后是每次都要计算集合size的for package test; import j ...
- win7访问windows server 2003服务器出现未知的用户名或者错误的密码(转载)
直接放答案,感谢网友提供答案,否则自已还一直在纳闷,为什么? win7系统的安全机制限制了登陆.只要系统时间和win2003服务器的系统时间相差很多,系统就会阻止其登陆,并显示错误信息:"未 ...
- js 的其它运算符和优先级
三元运算符: 语法为 exp1? exp2:exp3 判断 exp1是true 和 false 如果true,则返回exp2 ,如果false ,则返回exp3 <script> if ...
- sphinx ---rotate 运行机制
如果sphinx在运行中,要indexer时,需要加上--rotate参数,这样索引完就直接生效了. 原因是sphinx的searchd在启动时会创建一个 .spl 锁文件,并在关闭时会删除它.在in ...
- Day11 线程、进程、协程
创建线程第一种:import threadingdef f1(arg): print(arg) t = threading.Thread(target=f1, args=(123,))#t.start ...
- QBImagePickerController 用法
// // ViewController.m // QBImagePickerControllerDemo // // Created by Tanaka Katsuma on 2013/12/30. ...
- linux中用户信息及密码相关知识
在linux中若修改用户信息.密码,组群信息.密码等.其实是在修改/etc/passwd,/etc/shadow,/etc/group,/etc/groupshadow等文件的内容. 这四个文件的意思 ...
- python中xrange与range的异同
转载自:http://ciniao.me/article.php?id=17 >>> range(5) [0, 1, 2, 3, 4] >>> range(1, 5 ...