粗粒度上来说,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的功能与作用的更多相关文章

  1. java中instanceof和getClass()的作用

    初学者难免有点混淆java中instanceof和getClass()的作用,  下面就来一一讲解. 父类A: class A { } 子类B: class B extends A { }  构造对象 ...

  2. Java 中的接口有什么作用?以及接口和其实现类的关系?

    Java 中的接口有什么作用? - Ivony的回答 - 知乎 https://www.zhihu.com/question/20111251/answer/16585393 这是一个初学者非常常见的 ...

  3. java中堆栈的功能作用 以及區別(搜集)

    1.用new创建的对象在堆区,函数中的临时变量在栈区,Java中的字符串在字符串常量区. 2.栈:存放进本数据类型的数据和对象的引用,但对象本身不存在栈中,而是存放在堆中.     堆:存放new产生 ...

  4. Java 中的接口有什么作用?好处?

    接口的作用就是把使用接口的人和实现接口的人分开,实现接口的人不必要关心谁去使用,而使用接口的人也不用关心谁实现的接口,由接口将他们联系在一起. 很多JAVA初级程序员对于接口存在的意义很疑惑.不知道接 ...

  5. java中实现定时功能

    网上资料: 我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下: 1.基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务 ...

  6. JAVA中各个包的主要作用

    00:48:0800:48:1022013013-06-282013-06-2800:48:182013-06-2800:48:20  java.util是JAVA的utility工具包 java.l ...

  7. java中的Class.forName的作用

    Class.forName有什么作用 Class.forName(xxx.xx.xx) 返回的是一个类 首先你要明白在java里面任何class都要装载在虚拟机上才能运行.这句话就是装载类用的(和ne ...

  8. Java中HashCode()和equals()的作用

    引言 我们知道Java中的集合(Collection)大致可以分为两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. 这里就引出一个问题: ...

  9. java中的byte有什么作用?

    byte即字节的意思,是java中的基本类型,用心申明字节型的变量. 通常在读取非文本文件时(如图片,声音,可执行文件)需要用字节数组来保存文件的内容,在下载文件时,也是用byte数组作临时的缓冲器接 ...

随机推荐

  1. 一个Socket数据处理模型

    Socket编程中,如何高效地接收和处理数据,这里介绍一个简单的编程模型. Socket索引 - SocketId 在给出编程模型之前,先提这样一个问题,程序中如何描述Socket连接? 为什么这么问 ...

  2. [中级] 有效删除URL中的index.php

    如果你刚接触CI不久又或者刚刚研读CI的使用手册的话,关于如何有效删除URL中index.php以使URL看起来更友好美观的问题,可能是你面对的第一个较为复杂的问题!本贴不是原创,而是一个各种意见的综 ...

  3. mysql如何将一个表导出为excel表格

    方法一:进入到mysql的控制台,输入: 1. SELECT * INTO OUTFILE ‘./test.xls‘ FROM tb1 WHERE 1 ORDER BY id DESC  LIMIT ...

  4. ICE学习第二步-----从第一个程序了解ICE(HelloWorld)

    ICE(Internet Communications Engine)是一种面向对象的中间件平台,主要用于网络通讯.它为面向对象的“客户端-服务器”模型的应用提供了一组很好的工具和API接口.目前在全 ...

  5. HTML5 Canvas画数字时钟

    先不说废话,没代码算个蛋. 一些地方注释都写得比较清楚,不过这只是部分,因为只有秒针,但是时针,分针的逻辑都是一致的. 代码中有些坐标不知道为什么较不准,看看就好

  6. 根据打开页面加载不同Js

    根据打开页面加载不同Js //根据打开页面加载不同JS $(document).ready(function(){ var href = document.URL; /*获取当前页面的URL*/ if ...

  7. ajax验证用户名和找回密码参考

    // JavaScript Document function chkname(form){ var user = form.user.value; if(user == ''){ alert('请输 ...

  8. Centos下安装配置LAMP(Linux+Apache+MySQL+PHP)

    Centos下安装配置LAMP(Linux+Apache+MySQL+PHP)   关于LAMP的各种知识,还请大家自行百度谷歌,在这里就不详细的介绍了,今天主要是介绍一下在Centos下安装,搭建一 ...

  9. Labeling Balls

    poj3687:http://poj.org/problem?id=3687 题意:有N个重量1到N的点,把这N个点涂色,要求在一定的约束下颜色a必须比颜色b要轻,如果有多种选择则让重量最小的对应编号 ...

  10. 《how to design programs》15章 相互引用的数据定义

    由结构体组成的表与结构体中的表. 在用追溯形式建立家家谱树时,我们通常从某个后代除法,依次处理它的父母,组父母等.而构建树时,我们会不断添加谁是谁的孩子,而不是写出谁是谁的父母,从而建立一颗后代家谱树 ...