public class Test{ 
  public static void add3(Integer i){ 
        int val=i.intValue(); 
        val+=3; 
        i=new Integer(val); 
  } 
  public static void main(String args[]){ 
       Integer i=new Integer(0); 
       add3(i); 
       System.out.println(i.intValue()); 
  } 

请问这个为什么输出的结果是0呢?

解决方案 »

  1.   

    下面程序标记处应该插入哪个选项的代码?
    class EnclosingOne{ 
      public class InsideOne{} 
        } 
      public class InnerTest{ 
       public static void main(String args[]){ 
       EnclosingOne eo=new EnclosingOne(); 
       //insert code here 
       } 
      }
    A) InsideOne ei=eo.new InsideOne(); 
    B) eo.InsideOne ei=eo.new InsideOne(); 
    C) InsideOne ei=EnclosingOne.new InsideOne(); 
    D) InsideOne ei=eo.new InsideOne(); 
    E) EnclosingOne.InsideOne ei=eo.new InsideOne(); 
    这是关于内部类的问题,请问哪位高手知道这是考内部类的哪些内容?请介绍详细一点,谢谢!
      

  2.   


    那个值怎样传递呢?
    我怎么觉得结果是3呢?不是调用那个add()方法吗?
      

  3.   

    下面那样就对了
    public class Lian {
    public static void add3(Integer i) {
    int val = i.intValue();
    val += 3;
    i = new Integer(val);
    System.out.println(i.intValue());
    } public static void main(String args[]) {
    Integer i = new Integer(0);
    add3(i);

    }
    }
    main函数中的i为局部变量,所以在main方法中,输出时为此局部变量的值。
      

  4.   


    这个应该是作用域的问题
    public class Test{  
      public static void add3(Integer i){  
      int val=i.intValue();    //而这i只可以在add3函数中
      val+=3;  
      i=new Integer(val);  //所以在这里i是3
      }  
      
      public static void main(String args[]){  
      Integer i=new Integer(0);             //这个i貌似是全局的 
      add3(i);  //没有任何数据的返回,只是把add3中的i变成3啦,main中的i还是0
      System.out.println(i.intValue());  //这个还是main中的i
      }  
    }  
      

  5.   

    可以看看:http://hi.baidu.com/fevagotwh/blog/item/2255bbafedaf7aeffaed5068.html
      

  6.   

    我也觉得是3.感觉是引用类型。int类型被包装成Integer是不是也就跟其他的引用类型一样了。如果一样了就是3,如果不是那就是0.LZ我知道的就这么多呀
      

  7.   

    Java中的值传递和c++中的值传递是相似的。不知楼主对c++了解否。值传递,说白了就是在你调用的函数里面只是使用了你所赋予的参数的一个副本,那个副本只在那个被调用的方法中有效,不管在那个被调用的方法里那些参数被如何的更改,在调用的函数中都没有变。不知道听懂没有。(没的话可以找本书看看值传递和引用传递相关内容)
    举个例子:public class Test { public void exchangeXandY(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    System.out.println("a= " + a);
    System.out.println("b= " + b);//可以看出在被调用方法中确实交换了
    } public static void main(String args[]) {
    int a = 8;
    int b = 9;
    Test7 test = new Test7();
    test.exchangeXandY(a, b);//在被调用函数中交换了a,b的值,但是不影响在main方法
    System.out.println("a= " + a);
    System.out.println("b= " + b); }
    }
      

  8.   

    单向值传递啊,add里面的i开辟的是另一段内存空间,两个方法中的i是完全独立的
    其实这个程序不符合面向对象程序的设计思想,所以只会出现在考试中,自己写OOP千万不能这样写。
      

  9.   

    因为你输出的值是你main方法中的,初始值为0,所以是0.虽然调用了add3()方法 但是并不会改变你所传的参数的值,故而是0.建议看一看 值传递和址传递的区别
      

  10.   

    原因之一的确是值传递,public class Test{  
      public static void add3(Integer i){  
      int val=i.intValue();  
      val+=3;  
      i=new Integer(val);  /*方法执行到此,i拆箱后的值是3,但是在方法内,没有继续传递所以只在方法内有效*/
      }  
      public static void main(String args[]){  
      Integer i=new Integer(0);  
      add3(i);//调用结束,i依然是0,因为只是i拷贝了一份数据在方法内,i本身并未受到影响。
      System.out.println(i.intValue());  
      }  
    }  要想得到i=3可以改成这样
    public class Test{  
      public static Integer add3(Integer i){  
      int val=i.intValue();  
      val+=3;  
      i=new Integer(val);  
    return i;
      }  
      public static void main(String args[]){  
      Integer i=new Integer(0);  
      i=Test.add3(i);  
      System.out.println(i.intValue());  
      }  
    }  
      

  11.   

    java是值传递,你调用add3(i)在方法内部的i其实是外面i的一个副本,引用的对象相同,名字也相同而已,所以你内部对i进行了修改i = new Integer(val);使它引用到别的对象上了,但是原来外层的i不会改变。所以是0。
      

  12.   

    java是值传递,你调用add3(i)在方法内部的i其实是外面i的一个副本,引用的对象相同,名字也相同而已,所以你内部对i进行了修改i = new Integer(val);使它引用到别的对象上了,但是原来外层的i不会改变。所以是0。
      

  13.   

    java 的方法是值传递,不是引用传递,对象还是以前引用的对象
      

  14.   

    java语言函数基本数据类型都是值传递,函数调用完成后形参空间释放,实参到形参值又不会反向传递,所以实参值不会改变
      

  15.   

      Integer i=new Integer(0);  //利用构造器给i变量赋初值。
      add3(i);  //因为该方法是void类型的,没有返回值  System.out.println(i.intValue());  //所以i的值一直是'0'。
    你如果知道他们之间的内存关系,你就明白是怎么一回事了。
      

  16.   

    java中基本类型是使用值传递的方式为方法传递变量的,而对象是使用引用传递的方式来传递参数的。
    package shang;class Obj{
    int val;
    Obj(int i){
    val = i;
    }
    }public class Arg {
    public static void main(String[] args){
    Obj obj = new Obj(1);
    int val = 1;
    valfn(val);
    objfn(obj);
    System.out.println(val);
    System.out.println(obj.val);

    }
    public static void valfn(int i){
    i++;
    }
    public static void objfn(Obj o){
    o.val++;
    }
    }这段代码输出的结果是:1
    2
      

  17.   

    这里根本你们所说的作用域的原因。跟那个没有任何关系。这里涉及到得知识是引用传递。
    首先我们需要搞清楚的是,引用时如何传递的。
    1、首先将当前的引用复制一份,然后传递给函数。那么函数使用的就是复制品引用。但是这个引用仍然是指向你所创建的new Integer(0)的。
    当你写 i = new Integer(val);时
    那么这个复制品引用就指向了new Integer(3)了。
    你真正的引用仍然是指向的new Integer(0)。这就是为什么输出的是0了。

    如果换成这种情况。
    public class Test {
    private int i = 0;
    public Test(int i) {
    this.i = i;
    }
    public int intValue() {
    return i;
    }
    public static void add3(Test i) {
    i.i = 10;
    }
    public static void main(String args[]) {
    Test i = new Test(0);
    add3(i);
    System.out.println(i.intValue());
    }
    }那么这里传递的引用仍然是复制品。
    但是我们在写i.i = 10;语句时,其实真是是这样操作的。
    使用复制品引用i。但是i指向的是new Test(0);。
    然后i.i = 10;就是让复制品引用i指向的内存块new Test(0)中的变量i修改为10。
    因此我们打印出的是10.
      

  18.   


    这里插入的应该是E) EnclosingOne.InsideOne ei=eo.new InsideOne();
    这里涉及到得就完全是内部类的关系了。
    根据内部类的定义。因为InsideOne是内部类。它是与EnclosingOne相关联的。根据内部类的定义,如果不是static class。那么内部类就不能脱离其从属类。因此我们在创建内部类的对象的时候,就必须使用通过它从属的类来创建。如果我们不通过它从属的类来创建,那么久违反了java 内部类的定义。
    因为我们的创建语法为:E) EnclosingOne.InsideOne ei=eo.new InsideOne();
      

  19.   

    不要觉得想不出就自己test一下。。
      

  20.   

    值的作用域啊,main里的i初始化就是0啊
      

  21.   

    不是作用域的原因也不是什么内部类的东东,参数是值传递,但是我标注的部分又创建了一个对象,引用变量i的值已经改变,指向新的对象,而新对象有没有return返回,下面会发生啥你懂得。楼主多看看引用变量和对象的内存图(最好是图,直观)很简单。