java 中this 的理解

求助,菜鸟初学者,java中的this该怎么理解

指向一块小小的内存的指针.

能用一种文学的方式而非技术描述解释一下吗

在找女朋友之前,你指定了一个女朋友必须符合的标准,这就是定义Classsssss

然后你拿着这个标准找啊找...费劲千辛万苦,终于有志者事竟成,,,找到了不止一个的女朋友.... (new 了一大堆Instance)

但是今年这个情人节该跟谁过呢????

然后你经过了3秒钟漫长的思考,,,,指着其中一位: this

1 个赞

哥你是高人,不懂了再求助你

如何理解这段代码中的this,第一个constructor this可以理解了,第二个constructor中this还是不太理解

this 就像 汉语中的代词 “我” , 谁用 “我”就是谁,小明说 我是好人, 那么"我“ 此时就是小明,

2就相当于把 小明p复制一份一模一样 。 通常是 p:=Planent(1,2,3,4,5,6)

p2:=Planent( p)

现在p2拥有了和p一样的属性。

所谓OO,不考虑继承重载多态这些高级的东西,最初的目的/想法,我觉得就是一种组织/模块化代码的方式:

  • 所有的代码放一个文件,要改的时候全部看一遍太难了,那我们按功能,每个功能的代码放一个文件吧,这样下次改的时候,去找相应的文件,看一个小文件就行了,轻松很多;同理,整个马里奥游戏,写一个文件里肯定爆炸,那怎么分模块呢,有marioRun() marioHeight tortoiseMove() tortoiseColor这些属性和函数,那自然,把mario的放一个文件,把tortoise的放一个文件,是个好主意。
  • 然后在用marioRun()的时候,好像要靠命名时的约定才能看出这是mario对象的方法,那mario.run()呢?很不错,一眼就能看出对象是mario
  • mario就一个(不考虑player two吧)(Ready Player One!),tortoise小怪兽可是有很多呢,它们行为都一样,大小颜色不一样,大概可以叫他们做 a class of objects ?这就渐渐有了class和object的语法。

上面图里的第二个constructor可以不要,需要复制一个Planet的时候,new Planet(p1.xxPos, p1.yyPos ...)就可以了,但是如果经常要复制一个和p1一样的Planet p2的话,那再加个第二个这样的constructor好了,反正java支持。

你写的代码叫做类,类是通用的模板代码。

a = new A(); b= new A();

a叫做A的实例。同理b

根据冯诺依曼理论指出程序是由 指令+数据 组成。

如果class A中有 数据 xxPos,… 又有函数 distance 那么a, b 的内存中保存的都是什么呢? 只保存数据(可能还有虚表),也就是xxPos这些东西,方法(函数,也就是指令)是共用的,为了不浪费内存。所以a,b中数据是各自一份,但是方法是用的同一个。

方法是用来操作数据的,所以存在this就是为了复用函数,不同的实例都有同一份函数但是操作的数据是不同的,也就是this不同.

执行完distance后 a的数据变了,b的不变,符合一般人的逻辑。

所以这段代码中的this 值得是planet 这个类?

论c语言的重要性....

如果不懂c/c++, 计算机原理,要讲清楚这个概念好像还真挺麻烦.

求大神赐教,继续以文学的方式

指的是这个类创建的实例。

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html 你可以看一下官方文档,没上面说的那么复杂,主要干两件事,一个是用来区分重名的传参和类中声明的属性;一个是显式调用类中的其它构造器。

然而先把指针讲明白了就差不多了。


Welcome to Clozure Common Lisp Version 1.11-r16635  (DarwinX8632)!

CCL is developed and maintained by Clozure Associates. For more information
about CCL visit http://ccl.clozure.com.  To enquire about Clozure's Common Lisp
consulting services e-mail [email protected] or visit http://www.clozure.com.

? (setf foo (make-array 3))
#(0 0 0)
? (setf bar (make-array 3))
#(0 0 0)
? (setf *print-circle* t) 
T
? (setf (aref foo 1)  bar)
#(0 0 0)
? (setf (aref bar 1)  bar)
#1=#(0 #1# 0)
? (aref bar 1)
#1=#(0 #1# 0)
? (aref foo 1)
#1=#(0 #1# 0)
? ^D

这樣沒辦法讲透的

我来!

你不是定义了一个类型(class)了嘛比如说动物。这个动物类型有几个属性(property):身高,体重,颜色。这个类型又有“自我介绍”这个方法(merhod)。方法的定义是说“我的身高是this.身高,我的体重是this.体重,我的颜色是this.颜色”。然后你又用这个类型作为模版创建了一个实例“动物1”。设定了动物1的身高是20,体重是18,颜色是蓝。最后用动物1.自我介绍()。结果是“我的身高是20,体重是18,颜色是蓝”。

也就是说,this就代表使用方法的实例本身。

谢谢各位热心帮助