求助,菜鸟初学者,java中的this该怎么理解
指向一块小小的内存的指针.
能用一种文学的方式而非技术描述解释一下吗
在找女朋友之前,你指定了一个女朋友必须符合的标准,这就是定义Classsssss
然后你拿着这个标准找啊找...费劲千辛万苦,终于有志者事竟成,,,找到了不止一个的女朋友.... (new 了一大堆Instance)
但是今年这个情人节该跟谁过呢????
然后你经过了3秒钟漫长的思考,,,,指着其中一位: 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就代表使用方法的实例本身。
谢谢各位热心帮助