public class adas {
  public void aa(Integer j)
  {
  j++;
  }
public static void main(String[] args) {

      int i=0;
      Integer j=new Integer(i);
      adas p=new adas();
      p.aa(j);
      System.out.println("j:"+j);
      System.out.println("i:"+i);
}
     
}
创建了 Integer对象 传进去的应该是地址啊 怎么值不变

解决方案 »

  1.   

    答:当然不变啦.
    因为:
    public void aa(Integer j) 
      { 
      j++; 
      } 
    等价于:public void aa(Integer j) 
      { 
        j=Integer.valueOf(j.intVaule()+1);//对j重新赋值,当然没有用啦.
      } 
      

  2.   

    答:另外,Integer类的对象与String类的对象一样,都是内部值不能修改的常量对象.
      

  3.   

    理解一点:java中只有pass by value,一切都清楚了。
    如果不理解,建议参考Core Java或者The  Java Programming Language。
      

  4.   

    java中所有参数传递都是传值的!
      

  5.   

    原因是修改一个常量的值的问题,它和String的效果是一样的
    楼主看看这个:
    http://blog.csdn.net/myjava_024/archive/2008/11/26/3376555.aspx
      

  6.   

    楼主的问题是因为你没有分清楚传值引用和传引用调用之间的区别,这个题目就是一个传值引用的问题。传值引用就是你给aa()函数传递的只是一个副本,这个值是不影响结果的。如果aa()的参数的一个数组或者是一个对象,那就是传引用调用,这个结果是受到影响的。
    即使你的代码改成了
    public class adas { 
      public void aa(Integer j) { 
          ++j; //这个地方更改了。
      } 
    public static void main(String[] args) {       int i=0; 
          Integer j=new Integer(i); 
          adas p=new adas(); 
          p.aa(j); //aa()方法的参数类型很重要,如果是数组或者是一个对象就是传引用调用了。
          System.out.println("j:"+j); 
          System.out.println("i:"+i); 

        
    }你的结果也不会有任何的影响
      

  7.   

    java 八种基本数据类型都是拷贝值的
      

  8.   

    public class adas { 
      public void aa(Integer j) { 
          ++j;              //这个地方更改了。
      } 
    public static void main(String[] args) {       int i=0; 
          Integer j=new Integer(i); 
          adas p=new adas(); 
          p.aa(j);                 //aa()方法的参数类型很重要,如果是数组或者是一个对象就是传引用调用了。
           System.out.println("j:"+j);   //这里还是main方法中的j
          System.out.println("i:"+i); 

        
    }
      

  9.   

    楼上有几个说传引用引用的说法不正确。
    ZangTX说的是对的, java都是pass by value的。
    你即使传个数组进来, 比如int[] arr
    如果你对arr[i]赋值是生效的, 你对arr本身赋值是不生效的。 对象也是如此。
    跟基本类型不基本类型更是不贴边。
      

  10.   

    有意思的是很多java程序员理解的就是pass by reference, 以前我呆过2个大企业的PM都反复跟我强调这点, 面试时我说by value, 他们说by ref, 结果我面试成功后进入项目实际演示给他们看, 就服了。 最有意思的是其中一个SCJP居然靠了96分。真不知道SCJP还有什么用。
      

  11.   

    我记得国内好多书里面都说pass by reference,然后老师上课也那么讲,写过代码才知道纯粹胡扯.
      

  12.   

    专门去搜了些资料值传递  :如果形参是实参的拷贝,改变形参的值不会影响实参
    引用传递:如果形参是实参的引用,改变形参的值将会影响实参以上让我想起了学习C的时候,这个2个概念应该是C语言中就有的,从这个角度出发Java确是都是值传递~不过我相信大多说“引用传递”的时候我们要表达的对象与引用的关系,这样也无可厚非啊
    当然用“传递引用”这个术语会许更好
      

  13.   

    你这个相当于是Integer对象的首地址赋值给方法中的局部变量j,然后j+1,而你实际上Integer所包装的j的值根本就没变化
      

  14.   

    Java在处理参数时有两种方式:值传递和引用传递。
    1.值传递:如果参数类型是String,Integer,int,Long,long等简单类型时,即使方法内部改变了参数的值,也不会影响方法外的参数本身。
    2.引用传递:如果参数类型是Java复合类型,在方法内部修改了参数的值,方法外也会相应地改变。
    原先我对Java类型的理解分为了基本类型和对象类型,所以对上述问题也产生过迷惑。请参考:
    http://www.lifevv.com/java/doc/20080131205712266.html
      

  15.   


    补充:
    对于上述的简单类型,我的理解是基本类型int,short,long,float,boolean,char,double,byte以及它们对应的封装类型Integer,Short,Long,Float,Boolean,Character,Double,Byte的集合。
      

  16.   

    java 只有值传递。比如: 
    class ClassA {
    public void method1(ClassB b) {
    b = new ClassB("B");
    }
    }class ClassB {
    private String name; public ClassB(String name) {
    this.name = name;
    } public String toString() {
    return name;
    }
    }public class Test {
    public static void main(String[] args) {
    ClassB b = new ClassB("A");
    ClassA a = new ClassA();
    a.method1(b);
    System.out.print(b);
    }
    }打印 结果是 A; 并不是什么 传递引用 就是址传递。
    当然 如果你传递一个数组等 指向堆中的引用 而改变堆中内容,不过是看起来像址传递
      

  17.   


    我稍稍加了改动,但对结果始终比较迷惑:
    class ClassA {
    public void method1(ClassB b) {
    // b = new ClassB("B");
    b.name = "B";
    }
    }class ClassB {
    public String name; public ClassB(String name) {
    this.name = name;
    } public String toString() {
    return name;
    }
    }public class Test {
    public static void main(String[] args) {
    ClassB b = new ClassB("A");
    ClassA a = new ClassA();
    a.method1(b);
    System.out.print(b);
    }
    }
      

  18.   

    Integer等包装类与String类一样具有不变性的特性
      

  19.   

    一般类如下B类是可以改变值的
    class B{
     int i = 1;
     }
     class A { 
      public void aa(String s) 
      { 
      s+=1; 
      } 
    public static void main(String[] args) {        B b = new B();
          B c = b;
          c.i = 4;         
          System.out.println("i:"+b.i); 

        
    } 但String 和包装类是特殊情况,具有不变性
    如:
    class A{
       public static void main(String[] args){
          String b = "ABCD";
          String c = b;
          c = c +"E";
          System.out.println(b);//此处得到的b还是“ABCD”
       }
    }