遇到一个方法调用的语法问题,抽象成代码测试如下。大惑不解。。
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;
}
}那是不是说我想调用某个方法来改变我这个方法里的变量,是不可以的???????
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;
}
}那是不是说我想调用某个方法来改变我这个方法里的变量,是不可以的???????
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
}
}
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
}
}
http://nmj1987.javaeye.com/blog/349463
因为你那个是值传递,
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是什么怎么有一堆的语法错误