关于程序运行结果的问题

gogollili 2005-05-20 11:05:40
public class Class3 {

public static void main(String[] args) {
int i=5;
int j[]={1,2,3,4};
StringBuffer sb=new StringBuffer("abcde");
a(i,j,sb);
System.out.println("i=="+i);//为什么i的值是5而不是7?
System.out.println("j[]=="+j[0]);//j[0]的结果却是11,而不是1。
}
static void a(int i,int j[], StringBuffer sb){
i=7;
j[0]=11;
sb.append("fghij");
}

}

在程序的注释中已经表示了我的疑问,希望大家能帮我解决这个问题。
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
newmeteor 2005-05-20
  • 打赏
  • 举报
回复
System.out.println("i=="+i);//为什么i的值是5而不是7?
--------------------------------------------------
这个没有问题打印的是main中定义的i,a()中只是修改了形参,不影响实参.java是值传递的.

调用static void a(int i,int j[], StringBuffer sb)的时候,
实参 j[]={1,2,3,4}和形参指向了同一个地址!对形参的修改影响到了实参.
所以 "System.out.println("j[]=="+j[0]);//j[0]的结果却是11,而不是1"也没有问题.
ChDw 2005-05-20
  • 打赏
  • 举报
回复
i=7; //改变了i 的指向,这时候,这个 i 已经和main中的i并不是指向同一个地址了
j[0]=11; //改变了j 所指向对象的值,j仍然和main中的j指向同一个地址,且修改了这个地址中对象的值
sb.append("fghij");// 同上
xiaohanjiang 2005-05-20
  • 打赏
  • 举报
回复
"那j[0]=11,却不是main()中的j[0]=1,你又如何解释呢?"
在a函数里面传入的是数组名,也就是数组的引用,相当于地址,所以在该函数中就
是直接对传入得参数进行的修改
gogollili 2005-05-20
  • 打赏
  • 举报
回复
那j[0]=11,却不是main()中的j[0]=1,你又如何解释呢?
godhammer 2005-05-20
  • 打赏
  • 举报
回复
i
打印的i指的是 main中定义的i,不是在a()中定义的
gogollili 2005-05-20
  • 打赏
  • 举报
回复
谢谢各位的帮助,分数不多,聊表谢意
016161yuandj 2005-05-20
  • 打赏
  • 举报
回复
同意
cat_871017(零下九度)的解释,
应该把他运行时 内存 的分配画个图;
理解就容易一些
cat_871017 2005-05-20
  • 打赏
  • 举报
回复
说的清楚点:
首先,java是以传值方式传递参数的,所以传i时实际是传的i的一个拷贝,对这个拷贝的修改并不影响原i的值
而当你传对象的引用时,传进去的也是那个引用的拷贝,但拷贝和原来的引用都指向同一个内存地址,即同一个对象,所以你在方法中当然会修改掉以前的那个数组。因为数组也是对象,它是存在堆中的,而不象基本数据类型一样在栈里

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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