﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-irusist-随笔分类-java基础</title><link>http://www.blogjava.net/irusist/category/50601.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 10 Jan 2012 15:02:23 GMT</lastBuildDate><pubDate>Tue, 10 Jan 2012 15:02:23 GMT</pubDate><ttl>60</ttl><item><title>java中的"+"操作符</title><link>http://www.blogjava.net/irusist/archive/2012/01/10/368268.html</link><dc:creator>irusisit</dc:creator><author>irusisit</author><pubDate>Tue, 10 Jan 2012 14:35:00 GMT</pubDate><guid>http://www.blogjava.net/irusist/archive/2012/01/10/368268.html</guid><wfw:comment>http://www.blogjava.net/irusist/comments/368268.html</wfw:comment><comments>http://www.blogjava.net/irusist/archive/2012/01/10/368268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/irusist/comments/commentRss/368268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/irusist/services/trackbacks/368268.html</trackback:ping><description><![CDATA[&nbsp; &nbsp; java虚拟机处理byte，short，char，int类型之间的&#8220;+&#8221;操作都是将他们转化成int类型，压入操作数栈，用int类型来做加法操作的，当java程序中有还有long，float，double中的一种时，会转化成他们之中优先级最高的，优先级从long，float，double依次增高。boolean类型与上面所说的4种类型进行"+"运算，编译报错不通过。基础类型与String以外的引用类型进行"+"操作时，编译器报错不通过。&nbsp;当两个非String的引用类型进行&#8220;+&#8221;操作时，编译器会报错不通过。<br />&nbsp; &nbsp; 当byte，short，int类型与String的引用类型进行&#8220;+&#8221;操作时，比如，在一个静态方法里定义如下：<br /><span style="font-size: 12px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; color: #0000ff; ">byte</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;b&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; ">=</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; ">127</span><span style="background-color: #eeeeee; font-size: 13px; ">;</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str1&nbsp;=&nbsp;"string";</div><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String&nbsp;str&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; ">=</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;b&nbsp;</span><span style="background-color: #eeeeee; font-size: 13px; ">+</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;str1;&nbsp;</span><span style="font-size: 12px;">&nbsp;<br /></span><div><p><font size="1">&nbsp; &nbsp;产生的字节码为：</font><br /></p><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0: &nbsp; bipush &nbsp;127</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2: &nbsp; istore_1</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3: &nbsp; ldc &nbsp; &nbsp; #2; //String string</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5: &nbsp; astore_2</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6: &nbsp; new &nbsp; &nbsp; #3; //class java/lang/StringBuilder</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;9: &nbsp; dup</span></div><div style="text-align: left; "><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; 10: &nbsp;invokespecial &nbsp; #4; //Method java/lang/StringBuilder."&lt;init&gt;":()V</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; 13: &nbsp;iload_1</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; 14: &nbsp;invokevirtual &nbsp; #5; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; 17: &nbsp;aload_2</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; 18: &nbsp;invokevirtual &nbsp; #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; 21: &nbsp;invokevirtual &nbsp; #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;</span></div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; 24: &nbsp;astore_3</span></div><div><div style="text-align: left;"><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp; 25: &nbsp;return</span></div>&nbsp; &nbsp; &nbsp;可见，String对象的与byte进行&#8220;+&#8221;操作会先生成一个StringBuilder(jdk5以后，jdk5以前是StringBuffer)对象，将byte类型转换为int类型传入StringBuilder.append(int)的方法内,再将String对象传入StringBuilder.append(String)方法内，最后调用这个StringBuilder对象的toString方法得到String对象。同理，short，boolean,long,float,double类型，引用类型与String对象进行&#8220;+&#8221;操作也是同样处理，分别调用StringBuilder的不同参数的重载方法，不过char对象与short会有所不同，他不会转换成int类型，而是直接将char类型的值传递给StringBuilder的append(char)的方法。</div></div><div><p>&nbsp;</p></div><img src ="http://www.blogjava.net/irusist/aggbug/368268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/irusist/" target="_blank">irusisit</a> 2012-01-10 22:35 <a href="http://www.blogjava.net/irusist/archive/2012/01/10/368268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>