求救:一个迷惑的问题

dongfengsun 2006-11-22 11:15:47
class example {
private static void swap(StringBuffer s1,StringBuffer s2) {
s1.append("sky");
StringBuffer t;
t = s1;
s1 = s2;
s2 = t;
System.out.println("in :"+s1);
System.out.println("in :"+s2);
}
public static void main(String[ ] args) {
StringBuffer sb1= new StringBuffer();
StringBuffer sb2= new StringBuffer();
sb1.append("ut");
sb2.append("wuhan");
swap(sb1,sb2);
System.out.println(sb1);
System.out.println(sb2);
}
}
打印结果是:
in :wuhan
in :utsky
utsky
wuhan

我是这样想的,因为sb1、sb2是本地变量,那么就是按值传递,传递的是sb1、sb2的一份copy.

于是我就改成这样:
class example {
static StringBuffer sb1= new StringBuffer();
static StringBuffer sb2= new StringBuffer();
private static void swap(StringBuffer s1,StringBuffer s2) {
s1.append("sky");
StringBuffer t;
t = s1;
s1 = s2;
s2 = t;
System.out.println("in :"+s1);
System.out.println("in :"+s2);
}
public static void main(String[ ] args) {
sb1.append("ut");
sb2.append("wuhan");
swap(sb1,sb2);
System.out.println(sb1);
System.out.println(sb2);
}
}
但输出结果仍然一样!
实在搞不明白.

既然是按值传递,传递的就是本地的一份copy,那么为什么里面的append()方法又传回改变后的值了?

求高人解答!
...全文
395 24 打赏 收藏 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lkdtk 2006-12-05
  • 打赏
  • 举报
回复
StringBuffer对象是可以修改的字符串。
它调用append()方法时,不重新分配内存,直接在先前的内存空间里进行修改。
所以会出现swep中的StringBuffer.append改变引用本来的值。导致最后的sb1为utsky
zhangbin_10 2006-12-05
  • 打赏
  • 举报
回复
动了。。
Dishine 2006-11-24
  • 打赏
  • 举报
回复
flyineagle(逆风飞扬)说得非常清楚了

另String类型有点特殊,String的内容是存在一个叫对象池中的。
jicken_woo 2006-11-24
  • 打赏
  • 举报
回复
学习一下。。。
Zero2One 2006-11-23
  • 打赏
  • 举报
回复
如果你用String 就可以看到不同的结果,可以试下。这就是StringBuffer与String 的不同。
Zero2One 2006-11-23
  • 打赏
  • 举报
回复
如果方法的参数是int,char,long等简单类型,则传递的是值得拷贝。
如果方法的参数是对象类型,传递的是引用的拷贝。

private static void swap(StringBuffer s1,StringBuffer s2)
中的参数s1,s2是变量sb1,sb2的引用拷贝,即指向同一个对象。

这是jackxing(Jack) 的解释,我认为是正确的。
至于楼主问的:既然是按值传递,传递的就是本地的一份copy,那么为什么里面的append()方法又传回改变后的值了?
因为你用的是stringbuffer,StringBuffer对象是可以修改的字符串。所以,它调用append()方法时,不用重新分配内存,也就是它直接在先前的内存空间里进行修改。所以值会变。
jackxing 2006-11-23
  • 打赏
  • 举报
回复
如果方法的参数是int,char,long等简单类型,则传递的是值得拷贝。
如果方法的参数是对象类型,传递的是引用的拷贝。

private static void swap(StringBuffer s1,StringBuffer s2)
中的参数s1,s2是变量sb1,sb2的引用拷贝,即指向同一个对象。
dongfengsun 2006-11-23
  • 打赏
  • 举报
回复
快显身吧
dongfengsun 2006-11-23
  • 打赏
  • 举报
回复
为啥还不见高手来解答?
dongfengsun 2006-11-23
  • 打赏
  • 举报
回复
高手呢 继续顶
hyzzf 2006-11-23
  • 打赏
  • 举报
回复
顶一个,楼主,flyineagle(逆风飞扬)说得非常清楚了
Zero2One 2006-11-23
  • 打赏
  • 举报
回复
你误会我的意思了,改成String 以后,输出结果肯定不一样,但是交换还是不会交换,上面说的很清楚了。StringBuffer 改成String后,swap()里的append(),当然要改成+=了,对sb1就不起作用,也就说,sb1的输出将不会有sky。前面一条输出会有的,也就是swap()方法会把这个拼接上去,因为你用+=的话,相当于new了一个字符串
我只能说那么多了,如果还不理解,偶也没办法了.......
dongfengsun 2006-11-23
  • 打赏
  • 举报
回复
继续顶
dongfengsun 2006-11-23
  • 打赏
  • 举报
回复
还是期望高手能够来解答
dongfengsun 2006-11-23
  • 打赏
  • 举报
回复
呵呵 楼上说的还是不对
改成String结果也是一样 只不过有些稍微变化
还是没交换过来.
Zero2One 2006-11-23
  • 打赏
  • 举报
回复
ft!这样来理解吧,就这道题而言:
假设:sb1 ->35(此数字代表内存地址)
sb2 ->36
调用swap()方法后,把sb1的值附给s1,把sb2的值附给s2。
也就是说,s1->35,s2->36。但是注意此时sb1 ->35,sb2 ->36这是不变的。
然后在swap()方法里,s1.append()来拼接一个字符串,注意上StringBuffer,所以在原内存地址里面做修改,而不重新分配内存。所以35内存存储的内容发生变化。
然后s1,s2做交换,只是把s1,s2的指向改变,也就是引用改变,跟内存中存储的内容无关,同时,s1,s2也与sb1,sb2无关。改变后s1->36,s2->35。而sb1 ->35,sb2 ->36。
sacred02 2006-11-23
  • 打赏
  • 举报
回复
还是没人答到点上

首先,先确定一点:传引用是没错的。这也是为什么append()的时候可以更新到地址上的值的原故;
但问题是在交换之后,返回主函数之前,值是交换的了,但返回后为什么没有交换???
期待~~~

继续关注!
dongfengsun 2006-11-22
  • 打赏
  • 举报
回复
我想问的问题是:
为什么swap方法交换不了sb1、sb2的值?
而在方法里面可以交换?
dongfengsun 2006-11-22
  • 打赏
  • 举报
回复
顶啊 高手呢
dongfengsun 2006-11-22
  • 打赏
  • 举报
回复
既然是引用的话 为何对两个引用进行了交换 结果却是交换前的值?
加载更多回复(4)
内容概要:本文基于Matlab/Simulink平台,对电励磁同步电机在异步牵入、稳态运行及能耗制动三个阶段的全周期动态特性进行建模仿真与系统研究。研究构建了完整的电机数学模型与仿真系统,重点分析了电机从异步启动到同步运行的过渡过程、稳态运行时的电磁与机械性能,以及执行能耗制动时的减速特性与能量耗散机理。通过仿真,揭示了励磁电流、负载转矩与转速在不同工况下的动态响应规律与耦合关系,为电机的控制策略设计与性能优化提供了理论依据和数据支持。; 适合人群:具备电机学、电力电子与电力拖动基础知识的电气工程及相关专业的研究生、科研人员与工程技术人员。; 使用场景及目标:①研究电励磁同步电机的启动特性,解决异步牵入过程不稳定或失败的问题;②分析电机在不同负载下的稳态运行性能,优化运行效率;③设计和验证能耗制动策略,精确控制制动过程的减速时间和能量消耗。; 阅读建议:在学习过程中,应结合电机的基本原理,深入理解仿真模型中各模块(如电机本体、励磁控制、负载模型)的搭建逻辑,并通过调整仿真参数(如励磁电压、负载大小)来观察和分析系统动态响应,以加深对电机全周期运行特性的理解。
内容概要:通过介绍短时倒谱(Cepstrogram)计算方法,开展时-倒频分析研究,深入探讨倒谱分析机理、短时倒谱构建逻辑及时-倒频分析的内涵。文中系统对比了时-倒频分析与全局倒谱、传统时频分析方法的差异,阐明其在卷积特征解耦、非平稳信号跟踪、微弱周期特征增强及多维特征融合方面的技术优势,并分析其在语音识别、机械故障诊断、音频处理和非平稳时序信号分析中的典型应用,同时指出其在分辨率、计算复杂度等方面的局限性并提出优化方向。; 适合人群:具备一定信号处理或数据分析基础,从事机械、通信、声学或自动化等领域研究的研发人员及研究生。; 使用场景及目标:① 掌握短时倒谱与时-倒频分析的理论基础与实现方法;② 应用于语音信号处理、机械设备故障诊断、音频相似性检测等工程实践;③ 对比传统方法,提升对复杂非平稳信号中隐含周期特征的识别能力; 阅读建议:此资源以Matlab代码实现为核心,强调理论与实践结合,建议读者在理解核心算法原理的基础上,动手运行代码并调试参数,结合具体应用场景深化对方法适用性与局限性的认识。

67,535

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧