两段代码,思路大体是一样的但是输出结果却不同:第一段:
public class DHCC extends Another{ public static void diandao(int[] a)
{
int l = a.length;
int half = l/2;
int tmp;

for(int i=0;i<half;i++)
{
tmp = a[i];
a[i] = a[l-i-1];
a[l-i-1] = tmp;
}
}

public static void main(String[] args) {
int [] a = {1,2,3,4,5,6,7,8,9};
diandao(a);
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}这段代码是将一个为{1,2,3,4,5,6,7,8,9}的数组传入diandao()函数中进行倒序排列,运行以后的输出结果是9 8 7 6 5 4 3 2 1 实现了倒序;第二段代码:public class Another{
public static void diandao(String str){
str = "kkkk";
}

public static void main(String[] args){
String str = "lllll";
changeString(str);
System.out.println(str);
}
}这段代码将一个为"lllll"的字符串传入diandao()中,输出应该是"kkkk"吧,为什么还是 "lllll" 呢?我都对这参数传递方式有点迷糊了,哪位能帮我解释一下,多谢了哦

解决方案 »

  1.   


    public class Another{
        public static void diandao(String str){
            str = "kkkk";
        }
        
        public static void main(String[] args){
            String str = "lllll";
            changeString(str); /* 这是什么函数?写错了吧*/
            System.out.println(str);
        }
    }那叫引用传参和值传参。
    第一个程序,传递的是个数组,属于引用传参。就是会把内存地址传过去。。在diandao函数里对数组做的任何修改,都会保存下来下一个程序,传递的是个String,(PS:虽然String是对象。。但它比较特殊),只是把String里的值传了过去。。在diandao函数里对它的赋值等,只在diandao函数里有效,因为它没有真正的改变String里的值出了这个函数体。。diandao里对它的修改不会影响到外面
    所以只会输出lll不输出kkk
      

  2.   

    java中只有传值的方式,对于数组来说,引用和原型指向同一块内存,所以通过方法可以改变数组的值,而对于String来说,引用和原型指向不同的内存,所以改变引用并不改变原始的String的值,StringBuffer可以
      

  3.   

    你看下你在main里面调的是什么函数,还是changeString(str);
    11111逆序的结果是什么呢?呵呵
      

  4.   

    最简单的区别办法就是:我一眼就能看出来
    这段代码将一个为"lllll"的字符串传入diandao()中,输出应该是"lllll"  是引用传递,不是值传递
    为什么? 传的参数是对象类型或是数据,那一定是 引用传递
    说说下概念:
    值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值
    引用传递:也称地址传递,方法调用时,实际参数的引用(地址,而不是参数值)被传递给方法中的形式参数,在方法执行
    中对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数的值的改变将会影响实际参数的值。
      

  5.   

    java中String是一个特别的类型,虽然是对象,但如果作为参数的时候,和基本类型一样,会copy一个副本,也不是想其他对象一样,传的是内存地址。所以String作为参数时,即使在方法内修改了该参数的值,也只是修改了副本的值。
      

  6.   

    Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。引用类型,一般指new 出来的对象  比如 数组, new 一个Class等等 这类是按引用传递的
    基本类型:包括了int ,String ,long 等等, 这类通俗易懂的说,是按值传递的吧.大致就是这样, 如果还想多了解一些,可以多看看教程,和多做题, 
      

  7.   

    引用传参和值传参(简单来说):
    值传参 是将copy一份,是两个不同。
    引用: 是将地址传过去, 是同一个。
      

  8.   

    基本类型变量的传递,传的是copy。对象类型变量(也叫引数)传“指向”String例外
    刚查下了下。。呵呵,“在JAVA中只有值传递,没有引用传递这个概念”,这句话是对滴。。当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的以上仅供参考
      

  9.   

    java 中只有传值,没有传参 
      

  10.   

    String有他自己的特殊性,不可能改变本身的值的
      

  11.   

    10楼的“在JAVA中只有值传递,没有引用传递这个概念”这句话,是只在有的学派里才对吧。刚翻了一下《Java编程思想》第3版,机械工业出版社。第34页,第9行。“像Java中任何传递参数的场合一样,这里传递的实际上也是引用,……”楼主问题,跟传参类型无关,主要是由于String一旦初始化就不能再改变引起的。
      

  12.   

    那么除了String类型以外,有多少是值传递的类型呢?
      

  13.   

    Java虚拟机编译时,所有的静态代码块都要执行,先执行main中的,后调用执行diannao中的,先打印的str="kkkk",后打印str="llll",后者覆盖前者。
      

  14.   

    这个属于C++方式的理解, java里根本就是值传递。
    如果在方法里把一个int[] arr改变了 arr = new int[]{1,2,3};
    对方法外也完全没有影响。只有在arr[i] = N;的情况下才有影响。 对于对象,只有通过调用对象本身的方法才有影响。
      

  15.   

    你不知道thinking in java有很多错误么?作者本身都在不断改进作品, 你还当作真理来读。
    看了这个帖子, 感觉很可怕, 其实很简单的, 大家写几个测试程序跑一下就知道了。 
    有人居然还拿String是final类型来说事。
      

  16.   

    楼上可以去看看core java I  里面还有证明,只有传值,没有传址
      

  17.   

    支持。
    String的值是不可变的,StringBuffer却是可以通过append方法改变值。
      

  18.   

    java中对于数组来说,引用和原型指向同一块内存,所以通过方法可以改变数组的值,
    对于String来说,它是基本类型,引用和原型指向不同的内存,所以改变引用并不改变原始的String的值,但StringBuffer可以
      

  19.   

    我在CSDN里面发的第一个帖子,就是这个问题, 楼主看看
    http://topic.csdn.net/u/20081109/16/b37da4ce-61c3-4a51-a90a-3f34b60a9510.html
      

  20.   


    Java code
    public class Another{
        public static void diandao(String str){
            str = "kkkk";
        }
        
        public static void main(String[] args){
            String str = "lllll";
            changeString(str); /* 这是什么函数?写错了吧,应是diandao(str)*/
            System.out.println(str);
        }
    }
    [/Quote]
      

  21.   

    code=Java]public class Another{
        public static String diandao(String str){
            str = "kkkk";
            return str;
        }
        
        public static void main(String[] args){
            String str = "lllll";
                    System.out.println(diandao(str));
        }
    }[[/code]
    这是我改的,你看看这改后与之前的区别吧,也许会有帮助的。
      

  22.   

    public class Another{ 
        public static String diandao(String str){ 
            str = "kkkk"; 
            return str; 
        } 
        
        public static void main(String[] args){ 
            String str = "lllll"; 
                    System.out.println(diandao(str)); 
        } 

    这是我改的,你看看这改后与之前的区别吧,也许会有帮助的。
      

  23.   

    String 是基本类型?没有看懂。
      String str = "lllll"; str对象是存在在栈里面的,同是在在旁边开辟一个内存空间来存str的引用
    在java传递的过程中,只有意义上的传引用,其实是值得传递
      
      

  24.   

    java是不可能把对象放在栈里的。
    除非你有兴趣开发一个不遵从java虚拟机规范的jvm
      

  25.   

    我不知道在哪个帖子回过, 专门说了一下这种问题的理解。
    我们可以不考虑函数调用, 只考虑一个函数内部的逻辑, ok?比如
    void foo() {
       SomeObject obj = new SomeObject();
       SomeObject obj2 = obj;   // 分支1:你们说这时候obj的引用变了么?内部某属性变了么?
       obj2.setSomeValue(...);      // 分支2:你们说这时候obj的引用变化了么?
       obj2 = new SomeObject();
    }单纯上面的例子, 很明显obj2重新new的时候, 并不影响obj本身。 如果你把obj2理解成一个函数的参数, 就很直观了。实际上函数的参数就是这样的一个obj2 --> void foo2(SomeObject obj) {
    //注意这里参数的名字很迷惑人,如果把obj换成obj2是不是好懂点?
    }
      

  26.   

    如果看明白我上面的例子, 谁还拿String或者基本类型说事, 那我就完全无语了。