论坛首页 招聘求职论坛

一个馒头引发的血案

浏览 16798 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2008-11-28  
楼主,很赞你这种要知根的精神。

其实这个问题涉及到jvm堆栈的很多知识,我也不能完全了解。
本人愚见:
根据jvm堆栈的知识,声明的变量存在于栈中,指向堆中的某个地址。
——————————————————————
那么我们来解释下:
List a = null;
只是在栈中要了一块地址,声明的时候并没有指向堆中的某个地址。

public void mm(List a) ;
该函数的参数等同于同样在栈中要了一块地址但是没有指向堆中的某个地址。
并不是用的和Main函数中的a有相同的地址。
在函数体中这个参数指向了堆中的某个地址(通过new ArrayList(); 进行操作和c++的new以及c中的malloc操作差不多)。
但是由于声明的是void的函数,函数执行完的时,你并没有把这个地址显示的赋给Main函数中的声明的变量。也就是函数没有返回值。

所以,这两个同名变量在栈中并没有同样的地址。
如果你把函数
public void mm(List a);定义成可以返回该栈地址的时候,例如:
public List mm(List a){
    a = new ArrayList();
    a.add("mm");
    return a
}
那么在当函数执行完成,出栈的时候就会把栈顶的a的地址返回给调用函数。

解释的不是很清楚。只要能让你知道有jvm堆和栈的区别就可以了,以后考虑问题就可以朝这方面考虑。


0 请登录后投票
   发表时间:2008-11-28   最后修改:2008-11-28
dingjun123 写道
foxxiao 写道


java的 基本类型是值传递
对象是 引用传递

你这句话等于白说,关键说出个为什么?你的分析正确你的话就是正确的,国外包括国内都对这个问题争论很久了!大部分承认java只有值传递,当然你说有引用传递,只要你的分析是正确的,也没有问题,关键你拿出点建设性的意见出来啊!

基本对于java,你的实参给了形参,那么实参和形参就没有关系了,function body中都是对形参操作,这里包括基本类型(比如int,这也是说java不是纯面向对象的,后来sun为了挽回这个,说java是纯面向对象的加了wrapper class类型),如果是基本类型,体部的修改,不会对实参产生影响,如果是对象类型,实际是一个class类型的变量的copy,实参和形参指向同一块对象的存储地址,对object attribute的修改,会对实参对象产生影响。这是java最容易混淆的地方,所以很多人说java有引用传递,这不是很重要,关键要理解!

另外理解一些java内存布局的知识,比如静态区,常量区等,比如String,为什么叫final类呢?仔细研究研究!既然叫final class,为什么String s="abc"; s="d";好像把这个String给修改了啊?怎么回事??不清楚内部操作的话,研究一下这些吧!
String在所有的编程语言,包括java,c,c++,pl/sql,js中都是很重要的,外围隐射的东西太多,比如RegExp处理String的瑞士军刀,这玩意是一门艺术!


恩..我错了..确实是对象引用的copy
0 请登录后投票
   发表时间:2008-11-28   最后修改:2008-11-28
wangshizhe2477 写道

Main.class
package mytest;
import java.util.ArrayList;
import java.util.List;
public class Main {

    public static void main(String[] args) throws CloneNotSupportedException, BusinessException {      
        List a = null;
        B b = new B();
        List l = b.mm(a);
        System.out.println(l);
    }
}
B.class
package mytest;
import java.util.ArrayList;
import java.util.List;
public class B {

    public List mm(List a) {
       a = new ArrayList();
       a.add("mm");
return a;
    }
}


你这样写不如这样写:
public class Main {

    public static void main(String[] args) throws CloneNotSupportedException, BusinessException {

        B b = new B();
        List l = b.mm();
        System.out.println(l);
    }
}

B.class

package mytest;

import java.util.ArrayList;
import java.util.List;

public class B {

  private List<String> a=new ArrayList<String>();
    public List mm() {
       a.add("mm");
       return a;
    }
}

用面向对象封装,不在main中定义变量a,乱七八糟的,C++多看就知道了.
0 请登录后投票
   发表时间:2008-11-28  
楼主真幽默。。。
0 请登录后投票
   发表时间:2008-11-28  
1. LZ的情况: null
2. public class Main {

public static void main(String[] args){
List a = null;
B b = new B();
b.mm(a);
System.out.println(a);
}

}

class B {
public void mm(List a) {
// a = new ArrayList();
a.add("mm");
}
}

Exception in thread "main" java.lang.NullPointerException
at com.kewill.ispex.client.app.B.mm(Main.java:37)
at com.kewill.ispex.client.app.Main.main(Main.java:28)

3.
public class Main {

public static void main(String[] args){
List a = new ArrayList();
B b = new B();
b.mm(a);
System.out.println(a);
}

}

class B {
public void mm(List a) {
// a = new ArrayList();
a.add("mm");
}
}

[mm]

4.
public class Main {

public static void main(String[] args){
List a = new ArrayList();
B b = new B();
b.mm(a);
System.out.println(a);
}

}

class B {
public void mm(List a) {
a = new ArrayList();
a.add("mm");
}
}

[]
0 请登录后投票
   发表时间:2008-11-28  
问这样的问题一看就知道没有好好学java,就看了几个java例子就称自己会java了
0 请登录后投票
   发表时间:2008-11-28  
抛出异常的爱 写道
zhangsheng79 写道
应该不会抛出异常,这个涉及实例创建和参数引用的问题,一般初学者不明白也很正常,不明白为什么这么多人都劝lz改行,你们真的明白?

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

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


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

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

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


这么多人。。。。。。再大的火坑也迟早会被填满。。。。

没这么多人跳下来火也不会烧的这么旺.
PS:人被烧完了剩下来的东西不多.
没有个金身下来就变腊烛了.
0 请登录后投票
   发表时间:2008-11-28  
楼主目前不具备主动寻找问题的能力,要锻炼啊!

出了问题,你首先应该寻找这个问题涉及到哪个知识点,然后google先解决,最好再找个资料全面的看一下,做个笔记!以后再碰到个两次,我敢保你永远忘不了!光知道答案是没有用的,不全面了解这个知识,对你帮助还不是很大!所以网络是快速解决问题的一个方法,但是变成自己的东西看你怎么思考,最重要的就是看书全面学习了!
0 请登录后投票
论坛首页 招聘求职版

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