- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈Java中的this作为返回值时返回的是什么由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
有时会遇到this作为返回值的情况,那么此时返回的到底是什么呢?
返回的是调用this所处方法的那个对象的引用,读起来有点绕口哈,有没有想起小学语文分析句子成份的试题,哈哈.
一点点分析的话,主干是“返回的是引用”; 。
什么引用呢?“那个对象的引用”; 。
哪个对象呢?“调用方法的那个对象”; 。
调用的哪个方法呢?“调用的是this所位于的方法”;这样就清楚了.
再总结一下就是,this作为返回值时,返回的是调用某方法的对象的引用,这个方法正是包含“return this;”这行命令的那个方法;更简单点说,就是谁调用返回的就是谁.
为了更清楚、直观的理解问题,下面以简单的例子说明.
包human中定义了person类,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package
human;
public
class
person {
string name;
int
age;
public
person() {
}
public
person(string n, string g) {
name = n;
gender = g;
}
//test:this作返回值
person rethis1() {
person per =
new
person(
"lu"
,
"female"
);
system.out.println(
"rethis1 per:"
+ per.name);
return
this
;
}
person rethis2() {
person per = rethis1();
system.out.println(
"rethis2 per:"
+ per.name);
return
this
;
}
person rethis3() {
name =
"ma"
;
return
this
;
}
static
void
equrefer(person per1, person per2) {
if
(per1 == per2)
system.out.println(
"per1指向的对象没有改变,仍与per2指向同一个对象"
);
else
system.out.println(
"per1指向的对象已改变,与per2指向不同的对象"
);
system.out.println(
"per1:"
+ per1.name);
system.out.println(
"per2:"
+ per2.name);
}
public
static
void
main(string[] args) {
person per1 =
new
person(
"liu"
,
"female"
);
person per2 = per1;
per1 = per1.rethis1();
person.equrefer(per1, per2);
per1 = per1.rethis2();
person.equrefer(per1, per2);
system.out.println(
"调用rethis3之前,per1.name="
+ per1.name);
per1 = per1.rethis3();
system.out.println(
"调用rethis3之后,per1.name="
+ per1.name);
}
}
|
输出结果如下:
1
2
3
4
5
6
7
8
9
10
11
|
rethis1 per:lu
per1指向的对象没有改变,仍与per2指向同一个对象
per1:liu
per2:liu
rethis1 per:lu
rethis2 per:liu
per1指向的对象没有改变,仍与per2指向同一个对象
per1:liu
per2:liu
调用rethis3之前,per1.name=liu
调用rethis3之后,per1.name=ma
|
逐句分析执行过程:
(1).第1句:person per1 = new person("liu","female"),
创建一个person对象,将name初始化为“liu”,gender初始化为“female”,并让per1指向该对象.
(2).第2句:person per2 = per1,
定义一个person类的对象引用,并与per1指向同一个对象;具体内存分配见图1:
(3).第3句:per1 = per1.rethis1(),
由per1调用rethis1()方法,并将返回值赋给per1;rethis1()方法体内定义了一个局部变量per,并创建一个对象,由per指向它;具体内存分配见图2:
紧接着输出rethis1 per:lu;最后返回this,并把返回的值赋给per1.
(4).第4句:person.equrefer(per1, per2),
调用equrefer(per1,per2)来验证per1的值并未改变;根据下面的输出结果也可知per1仍与per2指向原来的对象,也就是说此时this的值与per1的值是一致的;也可以说,谁调用的返回的就是谁.
输出结果:
per1指向的对象没有改变,仍与per2指向同一个对象 per1:liu per2:liu 。
此时的内存图如图3:
(5).第5句:per1 = per1.rethis2(),
per1调用rethis2(),由(4)可推测,此时per1的值也不会变,是由per1调用的this所处的方法,所以返回的也是per1;具体来分析的话,rethis2()定义了一个局部变量per,并给其赋值为rethis1(),也就是说rethis2()调用了rethis1(),由(3)、(4)可推知,此时的内存结构是下面这样的:
局部变量per指向的对象与per1是一致的,因为调用rethis1的对象是per1所指的对象,所以返回值也是per1.
此处的输出结果为:
rethis1 per:lu rethis2 per:liu 。
(6).第6句:person.equrefer(per1, per2),
验证上面的结论,per1指向没变,此时的内存分配图如图4所示:
(7).第7、8、9句:
system.out.println("调用rethis3之前,per1.name=" + per1.name); per1 = per1.rethis3(); system.out.println("调用rethis3之后,per1.name=" + per1.name),
per1调用rethis3();rethis3()中修改了namer的值,由"liu"改为"ma",然后返回this.
调用前后的内存结构分别如图6、图7所示:
输出结果:
调用rethis3之前,per1.name=liu 调用rethis3之后,per1.name=ma 。
再一次验证了上述的结论.
关于为什么使用this,我是这么理解的:由于定义类的时候尚未创建对象,所以不能确定对象到底叫什么,就用this来统一表示,等到具体调用时就可以知道对象的名字了,然后就用对象的引用替换this;所以为了便于记忆,可以理解成谁调用返回的就是谁.
至于返回this有什么意义,我的理解是:记返回this的方法为a,可能a的方法体中对对象的属性做了某些操作或调用了某些方法完成了某些动作,总之,做完这些操作后就把原对象的引用返回,返回后的状态是对象最新的状态,可能与对象调用方法a前不同.
以上这篇浅谈java中的this作为返回值时返回的是什么就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/chanchan/archive/2017/11/10/7812166.html 。
最后此篇关于浅谈Java中的this作为返回值时返回的是什么的文章就讲到这里了,如果你想了解更多关于浅谈Java中的this作为返回值时返回的是什么的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!