java中对象的参数传递都是引用传递嘛?没有值传递嘛?能不能给个比较系统的回答,谢谢拉。呵呵。这个搞不是很明白

解决方案 »

  1.   

    4类8种是值传递,其他的都是 引用的逻辑型
    boolean
    字符型
    char
    整形
    byte
    short
    int
    long
    实数型  浮点型
    float
    double
      

  2.   

    可以说是值传递也可以说是引用传递,要看个人对这两个概念怎么理解
    public class NewTest {

    public static void main(String args[]){
    Hello hello = new Hello(4);
    changeHello1(hello);
    System.out.println("Hello.i=" + hello.getI());

    hello = new Hello(4);
    changeHello2(hello);
    System.out.println("Hello.i=" + hello.getI());
    }

    public static void changeHello1(Hello hello){
    hello.setI(3);
    }

    public static void changeHello2(Hello hello){
    hello = new Hello(2);
    }}class Hello{
    private int i = 0;

    public Hello(int i){
    this.i = i;
    }

    public void setI(int i){
    this.i = i;
    }

    public int getI(){
    return i;
    }
    }上面的程序结果是什么?如果你能正确回答,那么你已经知道你的问题的答案了
      

  3.   

    public class NewTest {public static void main(String args[]){
    Hello hello = new Hello(4);//创建一个<Hello对象>,<引用类型>
    changeHello1(hello);      /*调用NewTest静态方法,将你新建的hello的值,确切的说是
                              <hello引用的值>传递给changeHello1的<形参hello>,在使用
                              changeHello1的形参hello,调用 class Hello 中的setI方法,
                              应为传递的是 <引用的值> ,所以changeHello1的<形参hello>
                              == Hello hello = new Hello(4)这句话New出来的 Hello,
                             操作changeHello1的<形参hello> 等于直接操作 new出来的hello 
                             所以输出的hello是 3*/
    System.out.println("Hello.i=" + hello.getI());
    //
    hello = new Hello(4);
    changeHello2(hello);
    System.out.println("Hello.i=" + hello.getI());
    }public static void changeHello1(Hello hello){
    hello.setI(3);
    }public static void changeHello2(Hello hello){
    hello = new Hello(2);//他是让changeHello2的<形参hello> 等于 new 出来的新对象(可以说
                       // 是引用)
    }                //等于说 这个changeHello2的<形参hello>的引用不在指向
                //hello = new Hello(4)而是指向changeHello2()方法中hello = new Hello(2)
                //既然不时操作一个对象,所以输出原值4
     
                          
    //我上次打得4类8种之外的,全是 引用的, 只要引用相等,他们就是一个对象。
    //值传递 可以说是 COPY 传递
    }class Hello{
    private int i = 0;public Hello(int i){
    this.i = i;
    }public void setI(int i){
    this.i = i;
    }public int getI(){
    return i;
    }
    }
      

  4.   

    java 核心技术里面说得很清楚了
    方法参数共有两种:基本类型和对象引用
    1.方法不能修改基本类型(即数字或布尔值)的参数
    2.方法可以修改对象参数的状态
    3.方法不能让对象参数指向新的对象
      

  5.   

    可以说java中的传递都是值传递,这个值指的是参数地址的值。不过也有说基本类型和String是值传递,其他的都是引用传递,还是看个人理解了,这个很多书里面都有论述,好像这两种观点都有提及,^_^
      

  6.   

    迷糊  vagrant1984(曾因酒醉鞭名马, 生怕情多误美人)  这位兄弟
    你看的那本书里说 String是值传递 的啊,  介绍给我看看,虽然我看书想睡觉
    但是我想看看,那本书有多么的帅
      

  7.   

    一楼回答很清楚了,8类基本类型值传递
    其他都引用传递
    String类的想不清楚再好好想想
      

  8.   

    要注意String类基本用法,还是很容易想通的
      

  9.   

    可以看成都是值传递,如果是对象类型,其实是传递的引用的副本,比如:
    函数:change(A c){
    c=new A();
    }
    A a=new A();
    change(a);
    传给change函数的是引用a的副本,所以在函数里改掉a指向的对象以后,并不影像函数外引用a的值,在函数退出后,引用a还是以前的值
      

  10.   

    LS的说错了吧,change(a);后a的值应该是被改变后的值,方法参数中传递的是对象引用的副本而不是值的副本,也就是说只是传递堆中的拷贝而不是栈中的
      

  11.   

    java中 只有两种传递方式,即值传递和引用传递。
    所有基本数据类型都是采用值传递的方式,而所有对象都是采用引用传递的方式,包括数组
      

  12.   

    java:是有两种参数传递,但java只有值传递,没有引用传递。。即便:发生引用传递,那java也会把引用传递变成值传递,传出去。
      

  13.   

    xiangfeidecainiao() 说话可仔细看了,那个值到底是什么值?我还特别标明了
      

  14.   

    一般传递的都是值传递
    但值本身可能是值参数或引用参数
    不过不清楚java的闭包是怎么样的
      

  15.   

    vagrant1984(曾因酒醉鞭名马, 生怕情多误美人),迷糊,既然是大家刚刚学,某些概念性的问题还是要分清楚的.
    不好意思引用你的话<不过也有说基本类型和String是值传递,其他的都是引用传递>
                                         和,大家都是中国人,和的意思,应该都知道吧         所以我才说<你看的那本书里说 String是值传递 的啊,  介绍给我看看,虽然我看书想
                        睡觉但是我想看看,那本书有多么的帅>既然你已经说出  值传递 和 引用传递,这两个概念了,请不要模糊回答别人的问题.
    String 类 是字符串常量,也是引用,不过 相同的 字符串他只保存一份,他保存在 data segment
                                                                   中,靠的是引用
    自己试 ,他们的地址全部一样
    public class Test {
    public static void main (String [] args) {
    String s0 = new String ("HAHA");
    String s1 = new String ("HAHA");
    String z0 = "HAHA";
    String z1 = "HAHA";

    System.out.println(s0.hashCode());
    System.out.println(s1.hashCode());
    System.out.println(z0.hashCode());
    System.out.println(z1.hashCode());
    }
    }我个人觉得 既然新学 值传递 和 引用传递,要分清楚
     申明 是 个人觉得
      

  16.   

    对了 ,谁厉害,把 int 型的地址掉出来给我看看,不要是用基本类型的封包Integer.(基本型)  分配的内存栈中 直接装的值(对象类型) 栈中装的是一个对象的引用值,只有用 引用值,才可以找到堆中的对象
      

  17.   

    请问   ownraul(小蝴蝶的人偶太太太太可爱了~~~)     String类基本用法  是什么???
      

  18.   

    汗了,不同的人有不同的理解啊
    我的理解 2楼的理解跟我一样 
    java中凡是对象传递的都是对象的引用,而8种基本类型是java为了方便程序设计而引进的,他们是值传递,他们都有对应的类的,如int-----Integer类
      

  19.   

    Java全是值传递.参考java核心技术上卷.
      

  20.   

    xiangfeidecainiao():
    其实java里面争论这个没意思的,我最开始说的就有两种答案,看个人理解,还有你举的那个例子判断hashCode来看地址,我是觉得不对吧。
    public class Test {
    public static void main (String [] args) {
     String s0 = new String ("HAHA");
     String s1 = new String ("HAHA");
     String z0 = "HAHA";
     String z1 = "HAHA"; System.out.println(s0.hashCode());
     System.out.println(s1.hashCode());
     // 上面的输出是相等的但是 s0 == s1应该是false吧,它们指向的地址是不一样的
     System.out.println(z0.hashCode());
     System.out.println(z1.hashCode());
     // 这个设置到常量池的问题,z0,z1是指向相同的地址(记为A)的,常量创建的时候传给z0,z1的都是
      地址A对应的值"HAHA",由于String类是final的,你不能改变z0,z1所对应地址的值,所以如果下面
      z1 = "aaa"; 那原先地址A的值"HAHA"是没有改变的,但是现在传个z1的值为"aaa",对应的是另外一个地址B
    }
    }好了,咱语文功力比较差,下面那段很绕,建议还是看core java
    其实,我不喜欢这种无谓的争论,还是个人的理解了,说的太多反而误导!
    ps:写core java是大师吧,你应该看看这本书有多帅?!下次语气缓和点吧,我不喜欢这种带嘲讽的语气,你喜欢?
      

  21.   

    to yyw84(乱码人生) ( 二级(初级)):
    你可以试试下面的代码
    package com;public class Test { void change(String a){
    a=new String("abc");
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
    Test t=new Test();
    String s=new String("ddd");
    t.change(s);
    System.out.println(s);
    }}看看打出来的是abc还是ddd,或许我错误理解了你的意思?
      

  22.   

    楼上的例子不好!
    要是这样呢:
     public class Test { String change(String a){
     a=new String("abc");
                     return a;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
    Test t=new Test();
    String s=new String("ddd");
    //t.change(s);
    //System.out.println(s);
                    System.out.println(t.change(s));
    }}
      

  23.   

    vagrant1984(曾因酒醉鞭名马, 生怕情多误美人) 
    谢谢指点,不过 core java 是不是只有 2本啊, 我在网上 下的时候只有 I  和 II