this指针 java_彻底理解Java中this指针

每次看到Java中的this指针,总摸不着头绪。在网上看了很多人的讲解,还是不知道this指针到底是什么东西,今天的的这篇日志可以让你看清this到底是谁。(内容摘自:http://www.mathcs.emory.edu/~cheung/Courses/170.2010/Syllabus/03/implicit-param.html)

抽象的讲,this指针就是一个Implicit Parameter,那到底什么是Implicit Parameter,请看下文详解。

Implicit Parameter

Parameters to an instance method

Recall that a parameter is a value that is given to a method as input - see: click here

Methods can have one or moreparameters

You can pass one or more inputs into a method by specifying the value as parameters when you invoke the method.

We have learned that instance methods have two different kinds of parameters:

Explicit parameter that is passed by specifying the parameter in the parenthesis of a method call.

Implicit parameter that is passed by specifying an object variable (object reference) before the name of a method.

Explicitparameter

Review:

The parameters between the brackets/parenthesisof the method call are called explicit parameters

Examples: the values in red are explicit parameters

harrysChecking.deposit(500);

harrysChecking.withdraw(amount);

box.translate(10, 20);

double x = 4.0, y = 6.0;

box.translate(x, y);

NOTE: these statement must be contained in some method, and most likely, they will be in different methods (because their actions are kinda "unrelated". I have omitted the method for brevity - just want to show you how to identify explicit parameters

Accessing an explicit parameter variable inside the method

Accessing an explicit parameter variable inside a method is very simple:

To use an explicit parameter variable inside a method, you simply refer the parameter variable by its name

Example:

public void deposit(double amount)

{

balance = balance + amount;

}

(Because this is so trivial, I did not dwell on it when we discuss the implementation of the methods.

I dwell on it now because I will show you how to access the implicit parameter variable next.)

Implicit parameter

Review:

The object variable before the method namein the method call are called implicit parameters

The object on which you invoke a method is also as a parameter in the method call, because if you use a different object in the method call, the operation is performed on a different object (i.e., the behavior of the method is modified):

harrysChecking.deposit(500);

momsSaving.deposit(500);

The first call updates the balance instance variable in harrysChecking, while the second call updates the balance instance variable in momsSaving

Accessing the Implicit parameter inside the method

There is exactly ONE implicit parameter variable in every method.

Java has assigned a special name (a keyword) to identify this implicit parameter variable

The keyword that Java (and C++) uses to refer to the implicit parameter variable is called this

It must be written with all lower case letters

The obvious question that you will be asking is:

Question:

What value does the implicit parameter variable this contain ???

You can figure the answer to this question by using analogy...

Consider the following two pieces of program fragments:

public void deposit(double amount)

{

balance = balance + amount;

}

(1) harrysChecking.deposit(700);

(2) momsSaving.deposit(500);

Question:

What is the value of the (explicit parameter variable) amountin the case (1) ?

amount= 700

Question:

And what is the value of the (explicit parameter variable) amountin the case (2) ?

amount= 500

OK, it's time to apply the analogy:

Question:

What is the value of the (implicit parameter variable) thisin the case (1) ?

this= harrysChecking !!!

Question:

And what is the value of the (implicit parameter variable) thisin the case (2) ?

this= momsSaving !!!

Here is a pictorial representation on what's going on inside the computer when momsSaving.deposit(500) is called:

implicit.png

As you know, object variables such as harrysChecking and momsSaving are used to locate the instance variables of an object - see: click here

Since the object variable (harrysChecking in case (1) and momsSaving in case (2)) is passed to the implicit parameter variable this in the method call, the method can use this to obtain the correct instance variables !!!

(That's how the magic works....)

Important Fact:

The implicit parameter variable this is an object reference variable and is used to locate the instance variables of the object

It remains to show you how the implicit parameter variable this is used...

Example:

public void deposit(double amount)

{

balance = balance + amount;

}

public void deposit(double amount)

{

this.balance = this.balance + amount;

}

Notice that the variable balance is an instance variable in the object that is being referenced by the implicit parameter variable this

Java assumes that a variable name that does not any a name of a parameter variable or a local variablemust refer to an instance variable

That's why you don't need to write this before the variable balance

A case that necessitate the use of this

It is rare that you need to use the implicit parameter variable this

Here is one case where it is necessary to use this, but it is only so, because of a very bad choice of nomenclature:

the name of (one of the) parameter variable is the sameas the name of the instance variable

Example where you need to use this in the method:

public void deposit(double amount)

{

balance = balance + amount;

}

public void deposit(double balance)

{

balance = balance + balance;

}

The deposit() on the right will not work properly....

You can fix this by using this:

public void deposit(double balance)

{

this.balance = this.balance + balance;

}

DEMO Program:(BankAccount class with this)                                                 589636d070c2ee59176e0b3da8da7edb.png

BankAccount.java file: click here

BankAccountTester.java file: click here

Compile with:   javac BankAccountTester.java

Run with:   java BankAccountTester

Now edit BankAccount.java and remove the this., compile and run the program again...

The method deposit() can no longer increase the balance in a BankAccount object...

Question: WHY NOT ???

The name balance matches the name of a parameter variableand thus, the name balance refers to the parameter variableand not to the instance variable

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring开发人员知道的一件事

在最近关于(核心)Spring Framework的培训课程中,有人问我:“(Java)Spring开发人员是否应该知道一件事,那应该是什么?” 这个问题使我措手不及。 是的,(核心&a…

JavaWeb(十七)——JSP中的九个内置对象

一、JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。  由于JSP第一次访问…

在Eclipse上创建JSF / CDI Maven项目

当我在研究JSF和CDI示例时,我认为提及创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下,M2E插件随附的Eclipse Luna。 因此,无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->新建->其他。…

luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作。操作有4种。操作从0到3编号。点从1到N编号。 0:后接两个整数(&a…

java api操作hbase_通过JavaAPI使用HBase

1.准备工作(1) 启动zookeeper服务,我的是在本地启动zookeeper/usr/local/zookeeper/bin$ sudo zkServer.sh start(2) 启动HBase和HBase shell启动HBase:/usr/local/hbase/bin下启动start-hbase.sh启动HBase shell/usr/local/hbase/bin下终端输入hbase shell(3) 工程…

duilib入门简明教程 -- 部分bug (11) (转)

原文转自:http://www.cnblogs.com/Alberl/p/3344886.html 一、WindowImplBase的bug在第8个教程【2013 duilib入门简明教程 -- 完整的自绘标题栏(8)】中,可以发现窗口最大化之后有两个问题,1、最大化按钮的样式还是没变,正确的样式…

在考生文件夹存有JAVA3_注意:下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为J_网考网(Netkao.com)...

【分析解答题】注意:下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为Java_2.java文件,本题功能是完成点定义,并输出点坐标。请完善Java_2.java文件.并进行调试,使程序结果如下:x5 y5点的坐标…

jasperreports_JasperReports JSF插件用例系列

jasperreports这是文章系列的切入点,在该系列文章中,我将尝试介绍JasperReport JSF插件的一些用例,该工具的创建是为了轻松地将为JasperReports设计的业务报告集成到JSF应用程序中。 该系列中描述的所有示例都可以从JasperReports JSF插件网站…

RN 47 中的 JS 线程及 RunLoop

RCBridge 初始化时声明了一个 CADisplayLink _jsDisplayLink [CADisplayLink displayLinkWithTarget:self selector:selector(_jsThreadUpdate:)];在 _jsThreadUpdate 函数中,处理界面更新。这个 CADisplayLink 随后被加到 JS 线程对应的 RunLoop 中。 - (void)ad…

java nginx https_docker nginx 配置ssl,实现https

docker nginx 配置ssl,实现https2019-09-05 16:06:35.0nginx配置https总览在nginx配置ssl实现https,简单来说分为三个步骤:1 上传ssl证书等文件将 1_www.domain.com_bundle.crt 和 2_www.domain.com.key 上传到nginx配置文件的目录旁边。这两…

JavaScript入门几个概念

JavaScript入门几个概念 刚刚入门JavaScript的时候,搞懂DOM、BOM以及它们的对象document和window很有必要。 DOM是为了操作文档出现的API,document是它的一个对象。BOM是为了操作浏览器出现的API,window是它的一个对象。DOM When a web page …

微服务有麻烦吗? Lagom在这里为您提供帮助。 尝试一下!

蛋糕支持。 我们很自豪地宣布,新的Apache许可的微服务框架Lagom可在GitHub上使用 ! 当其他框架专注于打包和实例启动时,Lagom重新定义了Java开发人员构建基于微服务的应用程序的方式。 服务是异步的。 服务内通信由您管理。 流是开箱即用的。…

海思芯片硬件java加速_海思芯片直播延迟测试结果(小于100毫秒)

背景最近接触了许多客户,许多是做安全方面产品的客户,有些还涉及到jun队后勤的等等,他们普遍对采集延迟,编码延迟,传输延迟等都有很大关注。例如有个客户是做反狙击探测的,那可是与生命相关的,容…

java jsp登录的验证码_Java Web实现登录验证码(Servlet+jsp)

1.生成验证码图片(Servlet)importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics2D;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.util.Random;importjavax.imageio.ImageIO;importjavax.servlet.ServletException;importjavax.ser…

shrinkwrap_Java EE 6测试第二部分– Arquillian和ShrinkWrap简介

shrinkwrap在Java EE 6测试的第一部分中,我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API,以演示如何启动该容器,如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它…

java中三个基本框架_对于Java基础者应该如何理解Java中的三大框架!

三大框架:StrutsHibernateSpringJava三大框架主要用来做WEN应用。Struts主要负责表示层的显示Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作)Hibernate主要是数据持久化到数据库再用jsp的servlet做网页开发的时候有个 web.xml的映射文件,里面…

Apache Camel的性能调整思路

时不时地,我会以Camel速度较慢的说法来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂,路由引擎全都在内存中,并且不需要任何持久状态。 因此,在99%的情况下,性能问题是由于其他系统的瓶…

java虚拟机源码怎么看_java虚拟机JVM第4讲:从源代码到机器码,发生了什么?

在上篇文章我们聊到,无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外。那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就是今天我们要聊的。如下图所示,编…

java构建内存池队列_池化技术(线程池、连接池、内存池等)

一、池化技术 -简单点来说,就是提前保存大量的资源,以备不时之需。对于线程,内存,oracle的连接对象等等,这些都是资源,程序中当你创建一个线程或者在堆上申请一块内存时,都涉及到很多系统调用&a…

java 堆大小_适当的Java堆大小的5个技巧

java 堆大小确定生产系统合适的Java堆大小不是一件容易的事。 在我的Java EE企业经验中,由于Java堆容量和调整不足,我遇到了多个性能问题案例。 本文将为您提供5个技巧,这些技巧可以帮助您确定当前或新生产环境的最佳Java堆大小。 这些技巧中…