Integer i = new Integer(123); i中保存的是什么,是地址还是值

解决方案 »

  1.   

       
         int 基本类型 Integer是int的引用型  
         我个人认为存的是地址(因为它是引用型嘛),虽然System.out.println(new Integer(123))结果是123(这个应该是它
    自己重写toString()的结果
         
      

  2.   

    我只知道一点,i里面并不是存的地址,做个试验public class T { static void change(Integer i){
    i = 12;
    }

    public static void main(String[] args) {
    Integer i = new Integer(1);
    change(i);
    System.out.println(i);
    }
    }这段代码输出值是什么?是1,如果i是地址,那么他应该改变才对呀请高手赐教
      

  3.   

    包装类对于Integer在new个-128~127的数的时候,按普通的int数值,当然存的就是数值了
     对于其他数,按新建对象处理,存的就是地址
    网上的例子很多的,可以看看
      

  4.   


    public class T { static void change(Integer i){ 
    i = 7777; 
    } public static void main(String[] args) { 
    Integer i = new Integer(8888); 
    change(i); 
    System.out.println(i); 

    } 输出怎么还是8888
      

  5.   

    1当调用System.out.println()打印对象地址时,会调用对象的toString()方法,加入此类没有重写toString()时,会调用Subject类的tostring方法,再看看这个方法的代码:
    public   String   toString()   {   
       return   getClass().getName()   +   "@"   +   Integer.toHexString(hashCode());   
     }
    也就是活此方法会返回对象的虚拟地址,因为对象地址都是由jvm管理的,不允许对内存进行操作,所以说是虚拟的,当然你也可以认为就是对象的地址。2:但是,int的封装类复写了toString()方法。它将返回一个表示该 Integer 值的 String 对象。所以打印的是Integer的值,而非地址,要想查看的话,可以调用 对象.hanshCode()查看。不知说清楚了没有。
      

  6.   

    楼上答得很好,但似乎不是我想知道的答案我问的是传值与传地址的问题如果i是一个对象,那么传的应该是地址,如果是地址,那么值就应该变了,但结果没变我就搞不清楚new 出来的怎么存的就不是地址呢把这段代码改一下,假设一个Person类,有个name属性public class T { static void change(Person p){ 
    p.setName("ddd") ; 
    } public static void main(String[] args) { 
    Person p = new Person(); 
    p.setName("abc");
    change(i); 
    System.out.println(p.getName()); 

    } 这么一来输出的就应该是ddd了,对吧
      

  7.   


    Person p = new Person();
    p里面存的一定是地址
      

  8.   

        String str = new String("abc");//str存的是地址吧
     public class T { static void change(String str) {
    str = "dfds";
    } public static void main(String[] args) { String str = new String("dsf");
    change(str);
    System.out.println(str);
    }
    }
    结果打印的是: dsf而不是dfds
      

  9.   


     String str = new String("abc");//str存的是地址吧 
    String 是一个特殊类,虽然使用了new运算符,但对象是在栈空间里面的,而不是堆,str也不是存的地址,而是值
      

  10.   

    答:是的。
    1)当然传的是对象的引用(就是对象的地址)
    2)change(p); 这个不是改变p,而是改变的是p所指的那个对象中的内容(p本身的值永远不会被改变)
    因此:楼主要注意区分:对象的引用与对象之间的区别
    3)楼主要记住:与String的对象一样,Integer等包装类的对象,都是常对象(即:内部值不可更改的对象)
      

  11.   

    4)new 返回的永远是引用(即:地址)
      

  12.   

    [Quote=引用 16 楼 wangearn 的回复:]
    引用 13 楼 ty_tarena_pger 的回复:
        String str = new String("abc");//str存的是地址吧 Java code public class T {     static void change(String str) { 
            str = "dfds"; 
        }     public static void main(String[] args) {         String str = new String("dsf"); 
            change(str); 
            System.out.println(str); 
        } 

    void change()里面的str与main里面的str不是一回事,所以上述程序没啥意义
      

  13.   


    i中保存的是引用,传入change方法的参数也确实是引用,你的这个测试代码之所以没有得到想要的结果,主要是对i=12;这个语句没有搞明白,实际上这个语句就相当于i=new Integer(12);只是重新创建了一个对象,原来传进来的对象的值并没有改变。可惜Integer没有setValue方法,否则如果调用i.setValue(12);你就能够看到效果了。
      

  14.   

    http://msdn.microsoft.com/zh-cn/downloads/dd365372.aspx
    看看这里也许,对这个问题有帮助
      

  15.   

    ...存的是一个地址! 以为 封装类 都重写了toString() 方法!  所以输出的 是赋给的值!
      

  16.   


    这个应该是因为Java中都是传值调用的问题吧……
    当进行change(i)的时候,内部实际上是重新在change()的范围内定义了一个i的值,并对这个值进行操作。
    但是这个i并不能在change()外可见,也不能对原本的i产生影响,除非写了i=change(i);——当然了,这个时候change()的返回类型需要改成int,并且在最后加上return i的语句……
      

  17.   

    答:像String的对象就是一个常对象(即:对象一旦产生,其内部值就不能再改变了),Integer的对象也是这样。
    不是说:这个对象内部有什么特别之处,而是说:这个对象的类就没有提供修改其内部值的方法。
      

  18.   

       我已经把自己说服了:
       Integer i = new Integer(123);
       i中保存的是什么,是地址(与String的对象一样,Integer等包装类的对象,都是常对象(即:内部值不可更改的对象)
      

  19.   


    我的理解是:
    当执行到main方法中的 Integer i = new Integer(1);
    i 中存的是指向一个对象的引用;然后调用change方法,将这个引用传过去.
    然后执行i=12;实际上 i 指向了另外一个对象的引用.但是 main方法中的 i 与 change 方法中的 i 并不是同一个.
      

  20.   

       像String,Integer包装类等常对象,在传递过程中,我们应该把它们看成按值传递,而不是按地址传递
      

  21.   

    已经 NEW 了
    会给出什么呢?
      

  22.   

    new 出来的东西总是值传递,没有引用传递!!
      

  23.   

    new是用来为对象开辟空间的,返回的自然是所开辟空间的引用,最好的证据就是print一个Object对象的引用结果为:Object@a761fe,Java强调类型的安全性,所以这个引用由两部分构成,类型@地址。
      

  24.   

    是数值,int型的包装类  只有数值超过128才转化成  Integer  型的 
      

  25.   

    i中保存的是地址。这是典型的引用传递,static void change(Integer i){
    i = 12;
    }中的i作为change方法的参数,此参数的值是main方法中1对象的地址,此参数现在指向1对象,而当执行到i = 12;时,它就指向12这个对象了;自始至终,main中的i值都没有变化,它始终指向1对象。这道题的迷惑人之处在于change方法的参数也是i,如果改成j,就一目了然了。
      

  26.   

    刚才说的有点乱,再发一遍,看得清楚些:
    i中保存的是地址。这是典型的引用传递,
    static void change(Integer i){
         i = 12;
    }
    中的i作为change方法的参数,此参数的值是main方法中1对象的地址,此参数现在指向1对象,而当执行到i = 12;时,它就指向12这个对象了;自始至终,main中的i值都没有变化,它始终指向1对象。这道题的迷惑人之处在于change方法的参数也是i,如果改成j,就一目了然了。
      

  27.   

    java 中所有传参都是值传递!而且是这个值的一份拷贝! 理解这句话。
    对于基本类型变量,直接将值保存在栽中
    对于引用类型变量,其保存的是对象(new 出来的)在堆中地址的值
      

  28.   


    的确,Integer i中的i与Integer i = new Integer(1); 中的i不是同一个值,第一个是参数,而第二个是一变量。
    我觉得这儿可能是输出的问题,只是输出的是值,而没有输出i地址。
      

  29.   


    包装类的值作为数值形参时是无法在程序中改变的,所以在change函数中是无效的
    i保存的是对象的内存地址应该记住的是包装类定义了就不能改!
      

  30.   

    Integer在new个-128~127的数的时候,按普通的int数值,当然存的就是数值了 
    对于其他数,按新建对象处理,存的就是地址 
      

  31.   

    查API可知
    public Integer(int value)构造一个新分配的 Integer 对象,它表示指定的 int 值。 参数:
    value - Integer 对象表示的值。
    =======================================================================================
    因为i表示是引用对象,它指向Integer(int value)构造一个新分配的 Integer 对象,它表示指定的 int 值。
    ======================================================================================
    在这里i保存的是123,是值.
      

  32.   

    我来总结一下吧,小弟觉得应该是这样的,在
    static void change(Integer i){
    i = 12;

    中,i是一个变量,它只是用来存放一个integer类型的对象的引用,所以调用这个方法的时候才开始i是指向1的,也就是存储1的引用,但是由于i=12这个语句,产生了一个新的对象,i此时存放这个新对象的引用,所以这个i同主函数里面的i是两码事,这样就造成了上面的输出结果,小弟的理解就这么多,应该说的很详细了