很多书籍都说Java支持传引用调用的方式,类似于C++中的reference调用,而近来编程遇到一系列问题让我对此产生了怀疑,java的调用方式到底是怎样的?求助!

解决方案 »

  1.   

    java 里只有by value (至于reference,是以by value方式传递reference)
      

  2.   

    对象而言传递就去的都是“引用”,对普通数据类型而言传递进去的是“值”比如 public void paixu(Vector a);  在方法paixu(Vector a)里对a进行的任何操作都是对调用此函数时放入的Vector进行操作,,所以你可以不用给返回值。
      

  3.   

    可是我发现两个对象的互换,却只是导致了形参的互换,而实参并无变化啊?而对象数组却能够,比如
    class Person {     private String name;//姓名    private String sex;//性别    public Person(String x, String y) {
            this.name = x;
            this.sex = y;
        }    public void setStatus(String x, String y) {
            this.name = x;
            this.sex = y;    }    public String toString() {        return name + sex;    }
    public static void changeref(Person tmpx, Person tmpy) {
            //交换tmpx和tmpy对象
            Person swapref = tmpx;
            tmpx = tmpy;
            tmpy = swapref;
            System.out.println("在方法中交换的结果: refa =" + tmpx.toString());
            System.out.println("在方法中交换的结果: refb =" + tmpy.toString());
        }
      

  4.   

    Java中是By Value的,例如:Date d1 = new Date();void f(Date d) {......}当
    f(d1);
    时,
    实参d1和形参d引用同一个对象(应时上面创建的那个)1. 如果在f方法中有: d = new Date(另一个日期);
       则d引用了新建对象,但是实参d1仍然引用原来对象,没有变化.2. 如果上一步没有,而只是d.XXX方法去修改其引用对象的域的值,由于d和d1引用同一对象,所以看起来d1也变化了.
      

  5.   

    public static void changeref(Person tmpx, Person tmpy) {
            //交换tmpx和tmpy对象
            Person swapref = tmpx;
            tmpx = tmpy;
            tmpy = swapref;
            System.out.println("在方法中交换的结果: refa =" + tmpx.toString());
            System.out.println("在方法中交换的结果: refb =" + tmpy.toString());
        }你可以这样理解,首先这里的tmpx,tmpy所指向的是外部的某个对象,而你这样交换无非是让这里的形参所指的对象改变而已。所说的“引用”指的是你可以对tmpx.setStatus("a","male");这样相当于你对外部的实参进行操作。
      

  6.   

    Person tmpx, Person tmpy这是2个对象!而你改变的只是形参所指的对象,而实际的参数并没有改变!
      

  7.   

    但是对象数组却可以,改成Person[] tmpx, Person[] tmpy,就改变了,这是为什么呢,我以前是写c++的,刚转java很多地方不适应,还有持有堆内存的对象可以用=赋值, “=”重载了么?
      

  8.   

    JAVA是万物皆对象,数组也是一种对象。所以就算换成数组之前的说法也成立,你说的“改变了”是不是仍然说的是形参改变了?楼主应该把基本概念搞清楚。JAVA不能象C++那样分配内存。据我所知也没有符号的重载。
      

  9.   

    vcao(胶泥) ,感谢,可否推荐一些阐述Java内部机制的书籍,我手头使用的一本deitel :java how to program 5th edition 的书,感觉泛泛而论,无法知其所以然,让人很不爽。上面所提的问题,我试过很多次了,却实存在形参的改变而导致了实参的改变的现象。还有我所提到的持有堆内存的对象可以用=赋值,引起我的注意的是因为在分配大量堆内存时,有时会抛出错误(Error Not Exception),而当我显式释放资源调用finalize()后,错误就没有了,我对于java感到非常困惑,望各位不吝赐教!
      

  10.   

    Java没有提供运算符重载的,个人觉得应该加上!
    楼主有没有看过thinking in Java(Java编程思想)啊,应该仔细看看它啊.
      

  11.   

    xtaotao(淘淘) ,感谢,我没有看过这本书,我使用java是因为迫于项目,无法仔细一一从头看起,只能边写边学,个人觉得java确实方便,但总给我不放心的感觉,比如垃圾收集,我总是要怀疑资源是否得到了及时的释放,一些collections比如ArrayList的操纵,使得我总是对其效率产生十二分的怀疑.
      

  12.   

    垃圾收集的机制一方面就是处于效率的考虑,当空闲是才收集。所以垃圾不会被及时释放,所以当资源足够多的情况下,JAVA的效率应该是可以相信的。至于collections的查找算法,如果你不放心可以自己写一个……