论坛首页 招聘求职论坛

一个馒头引发的血案

浏览 16805 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2008-11-28  
我觉得这个首先是多态的问题!
B.mm(List a) 参数是List  ,然后在方法体里把a  new成ArrayList,这里肯定是不行的!!!
其次就是作用域的问题了、、、、、、、、
0 请登录后投票
   发表时间:2008-11-28  
牛X的人物开始会犯这类错误,但是牛X的人物会自己解决问题
0 请登录后投票
   发表时间: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。

希望我的解释合理,最后我想说的是,当有人遇到了不能理解的问题,大家应该多多帮助,不应该过多的指责和置疑,多给新人一点空间和包容。
0 请登录后投票
   发表时间: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当然没有任何元素 */
0 请登录后投票
   发表时间:2008-11-28  
tjxjj 写道
第一,不会抛异常,如果抛异常,检查下开发环境

第二,不会打出mm,如果打出了mm,你别改行,我改

至于改行...自己决定.


更搞笑
0 请登录后投票
   发表时间:2008-11-28  
cocory 写道
抛出异常的爱 写道
zhangsheng79 写道
应该不会抛出异常,这个涉及实例创建和参数引用的问题,一般初学者不明白也很正常,不明白为什么这么多人都劝lz改行,你们真的明白?

......程序员这个职业吃不饱,穿不暧,现在还大大的找不到工作.
如果不爱好编程
不能主动的找到问题答案
干点什么不好
还是趁还没进入门坎之前放弃吧
少损失些青春......

PS:劝你也不要跳入火坑了


异常兄好猛啊,常在线啊,你们老板没意见?

抛哥跳出来说:其实我就是老板。。。。。
0 请登录后投票
   发表时间: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的确没被销毁,还可以重新为其赋值

0 请登录后投票
   发表时间: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"); //这儿就不说了
    }
}
0 请登录后投票
   发表时间:2008-11-28  
LZ,把基础好好补习下.
0 请登录后投票
   发表时间:2008-11-28  
画图容易明白
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics