下面一段JAVA代码,请告诉我为什么结果是100,111,本人菜鸟,请详细点。

public class Test
{
public static void changeValue(int i){
i = 100;
}

public static void changeValue(Person p){
p.age = 100;
}

public static void main(String[] args){
Person p = new Person();

changeValue(p);
System.out.println(p.age);
int i = 111;
changeValue(i);
System.out.println(i);
}
}

class Person
{
int age = 10;
}

1.首先你的int i = 111,定义在main方法内,那么你定义的这个i的作用域就是在本方法内,在栈里单独分配一个地址

2.其次,你在public static void changeValue(int i)方法内定义的这个int i 是作为本方法的参数使用,这个i的作用域自然也在本方法内,在栈里还会再预留一个内存地址作为传参使用,当有值传过来的时候,这个值就会填充在预留的这个内存地址内,当你在 changeValue方法内为i=100赋值时,确实改变了内存地址的值,但改变的只是在changeValue方法内为i分配的内存地址,当该方法返回后,该方法便失效,那么你刚才给i=100赋的这个值也就失效了

3.当在main方法内调用changeValue(i)返回后,方法内的i的确进行了赋值,不过瞬间便失效了,当执行System.out.println(i);时,之所以打印出来的是111,因为该语句“System.out.println(i);”在方法main内,打印的i自然就是main方法作用域内的i值!

如果把int i 定义为全局变量,便没有失效这一说,打印的自然是100!
============================================================
使用作用域有效期描述如下:
作用域1-----int i = 111;
作用域2-----changeValue(i){
作用域2-----i = 100;
作用域2-----}
作用域1-----System.out.println(i);
如果你把System.out.println(i);放在作用域2内,打印的自然就是100
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-11
你这个i是局部变量,进行参数传递的是后是值传递,你的changeValue(int i)方法并没有返回值,changeValue(int i)方法中的局部变量在changeValue(int i)方法执行完毕后也就没有用了,你输出的还是你main方法中定义的int i = 111;这个i
第2个回答  2012-04-11
changeValue(Person p) 在编译器的眼里,他的标识符是changeValue_Person
changeValue(int i)同理是changeValue_int
所以,这是两个名字都不一样的函数。
changeValue(i);根据参数不同,编译器就知道你调用的是哪个函数。追问

我知道这个 我是说为什么I不等于100

追答

int i = 111;

public static void changeValue(int i){
i = 100;
}

这里的两个i不是同一个变量。

而根据语法规则,函数内的变量,函数外是不可见的,所以System.out.println(i);中的i指的是 int i = 111;这个i.

你都知道我之前说的,竟然不知道这基本的语法规则,惊讶- -
说专业点,理论点,函数内变量的作用域即变量存在的函数范围内。所谓作用域,你也可以把它理解成“能出现的地点”,所以100那个i是不能出现在System.out.println(i)这个地方的,而111那个i却正好可以。

本回答被提问者采纳