﻿<?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-lifelinger</title><link>http://www.blogjava.net/whicky/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 15 May 2026 17:48:22 GMT</lastBuildDate><pubDate>Fri, 15 May 2026 17:48:22 GMT</pubDate><ttl>60</ttl><item><title>陷阱--作用域范围</title><link>http://www.blogjava.net/whicky/archive/2010/03/22/316102.html</link><dc:creator>whicky</dc:creator><author>whicky</author><pubDate>Mon, 22 Mar 2010 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/whicky/archive/2010/03/22/316102.html</guid><wfw:comment>http://www.blogjava.net/whicky/comments/316102.html</wfw:comment><comments>http://www.blogjava.net/whicky/archive/2010/03/22/316102.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/whicky/comments/commentRss/316102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/whicky/services/trackbacks/316102.html</trackback:ping><description><![CDATA[今天差点被一段代码给陷阱了。
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">BidDO</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;bidDOs</span><span style="color: #000000; ">=</span><span style="color: #000000; ">result.getBids();<br />
</span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; ">List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">AuctionBid</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;abids&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">AuctionBid</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />
</span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">AuctionBid&nbsp;abid&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;AuctionBid();<br />
</span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #0000FF; ">for</span><span style="color: #000000; ">(BidDO&nbsp;bid&nbsp;:&nbsp;bidDOs){<br />
</span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;abid&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.translate(bid);//把bidDO转成AuctionBid<br />
</span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;abids.add(abid);<br />
</span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">8</span>&nbsp;</div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">debug的时候才发现abids里面的值都是同一个，而且是最后add进去的那个abid值。原来是我add进去的abid都是对同一个对象的引用，每次重新赋值都会把原有的值给覆盖掉了，才导致错误的结果。</div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">这个问题其实是挺简单的，就是没有注意变量的作用域.因为abid变量的作用域是全局的，是对对象AuctionBid的一个引用，所以在for循环中对abid的不同赋值，其实都是对AuctionBid对象产生了影响，因为你使用的是同一个引用(指针)。</div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; ">解决的话把<span style="color: #000000; ">AuctionBid&nbsp;abid&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">new</span><span style="color: #000000; ">&nbsp;AuctionBid()这句在for循环中声明即可。</span></div>
</div>
<img src ="http://www.blogjava.net/whicky/aggbug/316102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/whicky/" target="_blank">whicky</a> 2010-03-22 22:12 <a href="http://www.blogjava.net/whicky/archive/2010/03/22/316102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>