黑马程序员技术交流社区

标题: 怎么理解运算符重载? [打印本页]

作者: xjandrew    时间: 2012-12-2 17:49
标题: 怎么理解运算符重载?
本帖最后由 xjandrew 于 2012-12-6 12:39 编辑

既然+和=+JAVA中运算符重载的代替实现,那么怎么理解运算符重载呢?
作者: 奚华    时间: 2012-12-2 18:10
java中不允许运算符重载,至于String str="abc"+"12";里面的+主要是用于连接字符串,这是在java内部实现的,java不允许我们对运算符重载,至于字符串连接+主要是通过StringBuffer的append方法来进行的
作者: xjandrew    时间: 2012-12-2 18:39
没能解释运算符重载,又讲了一遍+跟+=。
还没解决疑问
作者: 丁桂松    时间: 2012-12-2 23:26
+= 是 左边等于左边加右边.由jvm做了一个强转操作.
+当String类型  用他链接的时候做字符串连接符.将字符串进行串联.当与基本数据类型中存在时做加法运算.
作者: xjandrew    时间: 2012-12-2 23:35
丁桂松 发表于 2012-12-2 23:26
+= 是 左边等于左边加右边.由jvm做了一个强转操作.
+当String类型  用他链接的时候做字符串连接符.将字符串 ...

大哥们,我表达的意思不够清楚吗?
完全是答非所问啊!
作者: 丁桂松    时间: 2012-12-2 23:38
不知道谁懂了.反正我没懂
作者: 程宏志    时间: 2012-12-2 23:54
“+”是算术运算符,而+=是赋值运算符,它只不过比=多了些功能而已。
作者: xjandrew    时间: 2012-12-3 12:20
本帖最后由 xjandrew 于 2012-12-3 17:00 编辑
程宏志 发表于 2012-12-2 23:54
“+”是算术运算符,而+=是赋值运算符,它只不过比=多了些功能而已。


实例体现
short s = s + 1;
无法实现
short s =+ 1;
可以实现

System.out.println(2386+"");
输出字符串

那么运算符重载怎么理解?

作者: 何伟    时间: 2012-12-3 12:31
+  是算数运算符  比如   int x=3;    x=x+1; 而+=是赋值运算符,比如    int  x=4;x+=2;“+=”是把左右两边的值赋给左边,这里x+=2,就相当于   x=x+1.
作者: xjandrew    时间: 2012-12-3 12:41
何伟 发表于 2012-12-3 12:31
+  是算数运算符  比如   int x=3;    x=x+1; 而+=是赋值运算符,比如    int  x=4;x+=2;“+=”是把左 ...

看来运算符重载这个问题不是初级阶段的人能解答的,没有个给力的解答呀
作者: 何伟    时间: 2012-12-3 12:48
xjandrew 发表于 2012-12-3 12:41
看来运算符重载这个问题不是初级阶段的人能解答的,没有个给力的解答呀 ...

运算符重载不是java支持的特性,也没有规定必须有替代实现
作者: xjandrew    时间: 2012-12-3 13:49
何伟 发表于 2012-12-3 12:48
运算符重载不是java支持的特性,也没有规定必须有替代实现

敢问你回答的是什么问题?

运算符重载怎么理解?

考sun公司的认证时才会遇到的知识点,大哥你在哪个阶段呢?
作者: 何伟    时间: 2012-12-3 14:36
xjandrew 发表于 2012-12-3 13:49
敢问你回答的是什么问题?

运算符重载怎么理解?

目前确实不知道Java有运算符重载这一说,可能我还没学到吧,丢人了-_-#
作者: 何伟    时间: 2012-12-3 14:37
xjandrew 发表于 2012-12-3 13:49
敢问你回答的是什么问题?

运算符重载怎么理解?

目前确实不知道Java有运算符重载这一说,可能我还没学到吧,丢人了-_-#
作者: 黑马_张伟    时间: 2012-12-3 15:49
xjandrew 发表于 2012-12-3 12:20
实例体现
short s = s + 1;
无法实现

我很纳闷,short s += 1;是怎么实现的,s刚定义,连初始化都没有,你+=1编译器不报错吗?
作者: xjandrew    时间: 2012-12-3 16:59
本帖最后由 xjandrew 于 2012-12-3 17:03 编辑
黑马_张伟 发表于 2012-12-3 15:49
我很纳闷,short s += 1;是怎么实现的,s刚定义,连初始化都没有,你+=1编译器不报错吗? ...


敲误
顺便你也整点重点
作者: 黑马_张伟    时间: 2012-12-3 17:15
我感觉你问的就很难理解,满篇除了贬低别人之外,就没有对题目认真解释过。或许你才应该“整点重点”。别人试图回答你是别人的权利而不是义务,你可以不接受,但不要贬低任何人。
作者: xjandrew    时间: 2012-12-3 17:21
本帖最后由 xjandrew 于 2012-12-3 17:46 编辑
黑马_张伟 发表于 2012-12-3 17:15
我感觉你问的就很难理解,满篇除了贬低别人之外,就没有对题目认真解释过。或许你才应该“整点重点”。别人 ...


的确如此,你说的没错,同时这个感受你也体会下
你提的问题得到的答案总是答非所问,连着3回你还能保持淡定之?
咱都是老大不小的人了,对于问题的理解把握的好点可以吧。

最后我再把问题划线标示出来吧

既然+和=+JAVA中运算符重载的代替实现(JAVA不支持运算符重载,那么怎么理解运算符重载呢?
运算符重载是什么?
作者: 何伟    时间: 2012-12-3 17:55
针对楼主这个问题,我很好奇而且不是很懂只有问度娘,下面是度娘的答案。


JAVA有运算符重载吗?
如果没有,可是为什么String   s=s1+s2;却可以?
这不是运算符重载,而是方法重载,JAVA中是可以方法重载的.
此句真正实现是用JAVA   中的APPEND方法,重载的也是APPEND方法,并不是运算符.
请把下面的程序编译后再反编译:  
                  String   a   =   "a";  
                  String   b   =   "b";  
                  String   c   =   a   +   b;  
   
  得到的结果是:  
                  String   a   =   "a";  
                  String   b   =   "b";  
                  String   c   =   (new   StringBuilder(String.valueOf(a))).append(b).toString(); 
请把下面的程序编译后再反编译:  
                  String   a   =   "a";  
                  String   b   =   "b";  
                  String   c   =   a   +   b;  
                  String   d   =   c   +   1;  
   
  得到的结果是:  
                  String   a   =   "a";  
                  String   b   =   "b";  
                  String   c   =   (new   StringBuilder(String.valueOf(a))).append(b).toString();  
                  String   d   =   (new   StringBuilder(String.valueOf(c))).append(1).toString();  
   
  所以,重载的是   append()   方法。



最后还啰嗦几句,楼主应该把问题说完全点,其实沙发回答的是正确的。
作者: xjandrew    时间: 2012-12-3 18:22
本帖最后由 xjandrew 于 2012-12-3 18:26 编辑
何伟 发表于 2012-12-3 17:55
针对楼主这个问题,我很好奇而且不是很懂只有问度娘,下面是度娘的答案。


的确,JAVA中并没有运算符重载,具体运行上实际重载的是StringBuilder中append()方法
而+和+=或=+只能是运算符重载的代替,那么追本溯源,运算符重载又是什么?
作者: 程宏志    时间: 2012-12-3 23:18
xjandrew 发表于 2012-12-3 12:20
实例体现
short s = s + 1;
无法实现

java内部自己重载了String类的加法运算符!即什么东西与String相加都会转换成String,然后与连接。


作者: 梁胜海    时间: 2012-12-4 12:26
一句话,a+=b是a=a+b的简写。
没有重载之说,只有简写之说。重载是发生在方法之间的,麻烦楼主搞清名词,不要乱问。
java很多语法都有简写形式,自己以后就知道了。
作者: xjandrew    时间: 2012-12-4 12:36
程宏志 发表于 2012-12-3 23:18
java内部自己重载了String类的加法运算符!即什么东西与String相加都会转换成String,然后与连接。

...

这样解释比较有门,原来是虚拟机在String类和其它包装类内部做的运算符重载,开始有点印象了。
有谁还有没有更多的解释么?
作者: xjandrew    时间: 2012-12-5 14:30
本帖最后由 xjandrew 于 2012-12-5 14:35 编辑
梁胜海 发表于 2012-12-4 12:26
一句话,a+=b是a=a+b的简写。
没有重载之说,只有简写之说。重载是发生在方法之间的,麻烦楼主搞清名词,不 ...


大哥,你所说的我都明白,除了21楼说的内容,其它的我都知道,能说点我不知道的吗?
作者: cjx2080@163.com    时间: 2012-12-5 15:12
short s=s+1;  这个语句将出错,因为s为short型,但是s+1后,1默认为int型,s将自动向上转型变成int型,所以s+1的结果是int型,将int型变量赋给short型变量,所以出错
short s+=1; 这个语句是正确的,这个语句可以看做是 short s=(short)(s+1),系统在底层自动执行了强制转换,将int型强转为short型,所以运行通过。
作者: xjandrew    时间: 2012-12-5 15:21
cjx2080@163.com 发表于 2012-12-5 15:12
short s=s+1;  这个语句将出错,因为s为short型,但是s+1后,1默认为int型,s将自动向上转型变成int型,所 ...

我知道这一点,那么运算符重载是什么?
21楼解释了一部分,还有人懂吗?
作者: 丁桂松    时间: 2012-12-6 00:18
每个语言有每个语言的特性,运算符重载不是java支持的特性,也没有规定必须有替代实现。就像java至今不支持闭包一样,运算符重载也没有代替实现。对面向对象的语言来说,运算符本身就不够“面向对象”,一切都可以用方法来实现
作者: 赵学刚    时间: 2012-12-6 00:36
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。具体例子可以去百度啊, 这个是c++的网上很多这方面的例子的
作者: 但汉涛    时间: 2012-12-6 00:49
运算符重载,能理解的你都理解了。
很简单,比如:
1+1=2。数字相加没有问题。
a+b=ab。换成了字母呢?在JAVA里没有问题,它扩展了+的功能。而在C++里是不行的,想要能这么计算,必须对+进行重载,实现字符串或字符串相加的功能。
a+b=c。换成对象呢?其中a,b,c都是同一个类的对象。是否能 进行计算呢?不行的话,写函数对+进行重载。

作者: xjandrew    时间: 2012-12-6 10:20
丁桂松 发表于 2012-12-6 00:18
每个语言有每个语言的特性,运算符重载不是java支持的特性,也没有规定必须有替代实现。就像java至今不支持 ...

这几句话我太熟悉了,有你自己的部分吗?
作者: xjandrew    时间: 2012-12-6 12:42
但汉涛 发表于 2012-12-6 00:49
运算符重载,能理解的你都理解了。
很简单,比如:
1+1=2。数字相加没有问题。

这个解释使人满意




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2