遇到一个方法调用的语法问题,抽象成代码测试如下。大惑不解。。
public class A {

public void f(int i) {//这个方法的作用就是将传入的实参加1呀
i++;
}
}
class B {
public static void main(String[] args) {
final int j = 4;
A ob = new A();
ob.f(j);//现在我调用它让j加1,应该会有语法的上的错误的,因为j不可改变。
System.out.println(j);//它不仅没有语法错误,还输出了4
}
}那就是说它实际上没有改变j的值了。那如果我想调用某个方法处理这个方法里定义的某个变量的话,实际上这个变量还是没变了。这是为什么呢?public class A {

public int f(int i) {//这个方法的作用就是将传入的实参加1呀,而且还要返回给调用方
i++;
return i;
}
}
class B {
public static void main(String[] args) {
final int j = 4;
A ob = new A();
int k = ob.f(j);
System.out.println(k);//输出5;
}
}那是不是说我想调用某个方法来改变我这个方法里的变量,是不可以的???????

解决方案 »

  1.   

    函数传参机制对于 基础类型(int,double...)传入的变量的副本,和以前的是不同的public class A {
        
        public void f(int i) {----------------------------这两个是不同的变量了
            i++;                                             |在栈内存创建了一个j副本为i
        }                                                   |失去了产量特性
    }                                                       |return i;也只是将i的值返回而以
                                                            |当然成了5
                                                            |
    class B {                                               |
        public static void main(String[] args) {            |
            final int j = 4;---------------------------------
            A ob = new A();
            ob.f(j);//现在我调用它让j加1,应该会有语法的上的错误的,因为j不可改变。
            System.out.println(j);//它不仅没有语法错误,还输出了4
        }
    }
      

  2.   

    打字有误,不好意思public class A {
        
        public void f(int i) {----------------------------这两个是不同的变量了
            i++;                                             |在栈内存创建了一个j副本为i,当然
        }                                                   |报错,副本i失去常量特性
    }                                                       |return i;也只是将i的值返回而以
                                                                    |当然成了5
                                                            |
    class B {                                               |
        public static void main(String[] args) {            |
            final int j = 4;---------------------------------
            A ob = new A();
            ob.f(j);//现在我调用它让j加1,应该会有语法的上的错误的,因为j不可改变。
            System.out.println(j);//它不仅没有语法错误,还输出了4
        }
    }
      

  3.   

    弄明白java参数传递就懂了
    http://nmj1987.javaeye.com/blog/349463
      

  4.   

    第一个: j是作为形参的,他的值并没有改变 它只是给 "i" 这个局部变量(也是实参)赋值。第二个:f(int i)返回值是 i(实参),自然是5另外 如果形参是object类型的(也就是对象的引用),形参是不会变的,实参只是把形参的应用copy了一份,方法中科通过实参来改变 对象的一些属性(比如 age)。
      

  5.   

    我在百度贴吧里找到是:
    因为你那个是值传递, 
    int j = 4;   // 在内存常量区里面申请一个空间,里面有一个值 4 
    A ob = new A();  // 在栈里面申请一个空间存放A的对象ob,并在内存常量区里面有一个地址去指向它。 
    ob.f(j); 把4传进栈里面的ob对象执行,虽然给4+1,但在常量区的那个4依然没变,变的是ob对象里面的i值此时是5,i只在ob对象内有效,出了ob对象它便消亡了。 
    System.out.println(j); // 此时打印的是常量区的那个j,j值始终没有改变,当然还是4了。 如果你想改变试试这个 public class A {  
         public void f(ref int i) {  
          i++;  
          System.out.println(i);  
         }  
    }  class B {  
    public static void main(String[] args) {  int j = 4;  
    A ob = new A();  
    ob.f(ref j);  
    System.out.println(j);  
    }  
    }  加上ref试试~~ 
    ref是什么怎么有一堆的语法错误