public static void main(String[] args) {
        Integer j=new Integer(500);
        changer(j);
        System.out.println(j);为何out 500 传递的是地址 为何没有原对象的值呢 }
private static void changer(Integer j) {
j=100;

}请教这块都这么执行的啊 java引用这块 我学得比较烂 请大侠们不要再把我搞晕 谢谢了

解决方案 »

  1.   

     但我想知道这个Integer是对象传递 怎么改变后没影响到自己呢
      

  2.   

    个人理解:
    包装类都覆盖了Object类的toString()方法,以字符串的形式返回包装对象所表示的基本数据类型
      

  3.   

    传递的是一个j引用的副本。就是把j的地址值复制了一份传递给changer方法,changer方法指向其他对象与j无关。
      

  4.   

    另外:
    JAVA 只有值传递..
      

  5.   

    Integer自动解包为int,你打印一个int,当然是500啦
      

  6.   

    下面是核心技术卷I的解释 书上有图会更好理解些 JAVA 程序设计语言使用值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是方法不能修改传递给他的任何参数变量的 
    内容 下面举个例子 
    假定一个方法试图将一个参数值增加至3倍 
    public static void tripleValue(double x) 

      x=3*x; 
    } 然后调用这个方法 double percent = 10; 
    tripleValue(percent); 
    可以看到无论怎样调用这个方法,执行之后,percent的值还是10。下面看一下具体的执行时间过程: 
    1)X被初始化为percent值的一个拷贝(也就是10) 
    2)X被乘以3后等于30。但是percent仍然是10 
    3)这个方法结束之后,参数变量X不再使用 
    然而,方法参数共有两种类型: 
    基本数据类型(数字,布尔值)和引用类型 
    已经看到,一个方法不可能修改一个基本数据类型的参数。而对象引用作为参数就不同了,我们很容易利用下面的这个方法实现将一个雇员的薪金提高两倍的操作: 
    public static void tripleSalary(Employee x) 

    x.raseSalary(200); 

    当调用 
    harry = new Employee(...); 
    tripleSalary(harray); 具体执行的过程为 
    1)X被初始化为harry值的拷贝,这里是一个对象的引用。 
    2)raiseSalary方法应用于这个对象引用。x和harry同时引用的那个Employee对象的薪金提高了200% 
    3)方法结束后,参数变量X不再使用。当然,对象变量harry继续引用那个薪金增至3倍的雇员对象。 已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝 
    同时引用同一个对象。 
    很多程序设计语言(比如C++)提供了两种参传递的方式:值调用和引用调用。有些程序员认为Java采用的是引用调用,实际上,这种理解是不对的。下面给个反例: 
    public static void swap(Employee x,Employee y) 

    Employee temp = x; 
    x=y; 
    y=temp; 

    如果是引用调用的话,这个方法应该能够实现交换数据的效果 
    Employee a = new Employee("Alice",...); 
    Employee b = new Employee("Bob",...); 
    swap(a,b); 
    但是方法并没有改变存储在变量a和b中的对象引用。swap方法的参数x和y被初始化为两个对象的引用的拷贝,这个方法交换的是这两个拷贝 JAVA 中方法参数使用情况 
    1)一个方法不能修改一个基本数据类型的参数(即数值型和布尔型) 
    2)一个方法可以改变一个对象参数的状态 
    3)一个方法不能让对象参数引用一个新的对象。 
      

  7.   

    在你进入changer方法的时候,对j进行重新分配,也就是让他等于了100,你并不是改变它的值,而是改变地址,这里问题就来,在java中,changer方法输入的参数,是一个Integer的对象引用,也就是地址,但是你并没有改变这个地址的值,所以除了changer方法以后,j的地址还是指向500的,输出为500,100只在changer方法内适用,如果在changer方法内打印j的值,此时会输出100
      

  8.   


    对于基本类型,在方法体内对方法参数进行重新赋值,并不会改变原有变量的值。 
    对于引用类型,在方法体内对方法参数进行重新赋予引用,并不会改变原有变量所持有的引用。 
    方法体内对参数进行运算,不影响原有变量的值。 
    方法体内对参数所指向对象的属性进行运算,将改变原有变量所指向对象的属性值。http://zangweiren.javaeye.com/blog/214369
      

  9.   

    这里主要是比较特殊,private static void changer(Integer j)这个方法的形参,只是传递了元数据值。当实参是元数据类型的变量时,该变量的值在方法调用期间会复制给形参。由于形参是方法的局部变量,因此对形参做出的任何修改在调用结束后都不会影响到实参。如果LZ想要输出100,可以把方法改变一下,获取一个返回值,并把返回值赋给j,只有这样才会在方法调用上影响到实参。
    public static void main(String[] args) { 
            Integer j=new Integer(500); 
            j = changer(j); 
            System.out.println(j);

    private static int changer(Integer j) { 
    j=100; 
    return j;
    } 注意:如果实参为对象引用或者数组引用时候,形参的改变才会影响到实参。因为这时候传递的是对象的引用。