锁定老帖子 主题:一个馒头引发的血案
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-28
我觉得这个首先是多态的问题!
B.mm(List a) 参数是List ,然后在方法体里把a new成ArrayList,这里肯定是不行的!!! 其次就是作用域的问题了、、、、、、、、 |
|
返回顶楼 | |
发表时间:2008-11-28
牛X的人物开始会犯这类错误,但是牛X的人物会自己解决问题
|
|
返回顶楼 | |
发表时间:2008-11-28
java是按值传递,
List list = null; B b = new B(); b.mm(list); 这个mm方法,这个list只是一个变量,因为这个时候,list还没有指向一个内存地址,它只是一个变量而已,所以用mm传递的时候,只是传了这个变量,并没有复制内存地址传递。 public void mm(List a) { a = new ArrayList(); a.add("mm"); } 这个方法中,a = new ArrayList(),只是针对这个a变量,分配了内存空间,并没有给list变量分配内存空间,所以用add()方法添加只是添加了a这个变量,而list变量还是null。 希望我的解释合理,最后我想说的是,当有人遇到了不能理解的问题,大家应该多多帮助,不应该过多的指责和置疑,多给新人一点空间和包容。 |
|
返回顶楼 | |
发表时间:2008-11-28
cxhgoo 写道 我把题目改问,修改一下,代码如下:
public class Test { public static void main(String[] args) { List a = new ArrayList(); B b = new B(); b.mm(a); System.out.println(a); } } public class B { public void mm(List a) { a = new ArrayList(); a.add("mm"); } } 为什么打印出来是 : [] 而把B类改成 public class B { public void mm(List a) { a.add("mm"); } } 则打印出 [mm] 以前没发现,很好奇[]是怎么来的,是因为ArrayList是对象数组吗?有人知道其来源吗? /* 因为在mm中将传进去的参数a重写了,a此时相当于局部变量(即定义在方法里的变量)。局部变量在方法执行后是不会保持的,即方法执行后,局部变量被销毁,内存被回收。局部变量一般用栈存储。mm中的a非main中的a ,打印的却是main中的a,main中的a当然没有任何元素 */ |
|
返回顶楼 | |
发表时间:2008-11-28
tjxjj 写道 第一,不会抛异常,如果抛异常,检查下开发环境
第二,不会打出mm,如果打出了mm,你别改行,我改 至于改行...自己决定. 更搞笑 |
|
返回顶楼 | |
发表时间:2008-11-28
cocory 写道 抛出异常的爱 写道 zhangsheng79 写道 应该不会抛出异常,这个涉及实例创建和参数引用的问题,一般初学者不明白也很正常,不明白为什么这么多人都劝lz改行,你们真的明白?
......程序员这个职业吃不饱,穿不暧,现在还大大的找不到工作. 如果不爱好编程 不能主动的找到问题答案 干点什么不好 还是趁还没进入门坎之前放弃吧 少损失些青春...... PS:劝你也不要跳入火坑了 异常兄好猛啊,常在线啊,你们老板没意见? 抛哥跳出来说:其实我就是老板。。。。。 |
|
返回顶楼 | |
发表时间:2008-11-28
cxhgoo 写道 我把题目改问,修改一下,代码如下:
public class Test { public static void main(String[] args) { List a = new ArrayList(); B b = new B(); b.mm(a); System.out.println(a); } } public class B { public void mm(List a) { a = new ArrayList(); a.add("mm"); } } 为什么打印出来是 : [] /* 因为在mm中将传进去的参数a重写了,a此时相当于局部变量(即定义在方法里的变量)。局部变量在方法执行后是不会保持的,即方法执行后,局部变量被销毁,内存被回收。局部变量一般用栈存储。mm中的a非main中的a ,打印的却是main中的a,main中的a当然没有任何元素 */ 而把B类改成 public class B { public void mm(List a) { a.add("mm"); } } 则打印出 [mm] /* 因为传进去的a没有被重写,此时的a就是main方法中的a */ 以前没发现,很好奇[]是怎么来的,是因为ArrayList是对象数组吗?有人知道其来源吗? ps:java的对象方法里定义的变量称为局部变量,局部变量在方法执行后被销毁;但javascript中可以利用函数的闭包在函数内保持数据。即函数执行后变量不会被销毁。(据说新jdk中也加入了闭包特性) var setName, getName; function func() { var name = "Jack"; var get_Name = function() { return name;} var set_Name = function(n) { name = n; } //将私有方法赋给全局变量 getName = get_Name; setName = set_Name; } //测试1 func();//执行方法 alert(getName());//输出"Jack".方法执行后局部变量name未被销毁,仍然可以取得局部变量name的值. //测试2 setName("Tom"); alert(getName());//输出"Tom".name的确没被销毁,还可以重新为其赋值 |
|
返回顶楼 | |
发表时间:2008-11-28
public class Test
{ public static void main(String[] args) { List a = new ArrayList();//全局变量a()在栈上,并且已经指向了堆上的对象ArrayList();,就叫ARR吧 B b = new B(); b.mm(a);//将a这个引用复制一次,a的拷贝所指向的那个对象ARR,并加入一个字符串,为什么打印出来mm?是因为a和a 的拷贝指向同一个对象, System.out.println(a); } } public class B { public void mm(List a) { a = new ArrayList();//将引用指向了另外一个对象了,而且这个对象在执行这个方法后,JVM会在适当的时候回收内存 a.add("mm"); } } 为什么打印出来是 : [] 而把B类改成 public class B { public void mm(List a) { a.add("mm"); //这儿就不说了 } } |
|
返回顶楼 | |
发表时间:2008-11-28
LZ,把基础好好补习下.
|
|
返回顶楼 | |
发表时间:2008-11-28
画图容易明白
|
|
返回顶楼 | |