刚才看了论坛里面的一个问题,后来改了代码结果还是原来那样,自己都傻了。代码如下:
int str=2;
public int method1(int str){
str+=5;
return str;
}
public void method2(){
method1(str);
System.out.println(str);
}
public static void main(String[] args){
Test1 t1=new Test1();
t1.method2();
}
输出的结果是2.为什么呢?之前看到论坛上的是把str定义为局部变量的,现在我定义成全局变量结果还是2.太郁闷了。
基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的,
在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。
String比较特殊,传的是在常量池的中的地址
你的运行中 有2个String对象,全局变量的str的值一直都是2 而方法1中的是局部变量 运行到方法1的时候 只是把str的值传给了这个方法1中的局部变量 全局的str的值没变 你输出的是全局的str当然还是2了
楼上正解,传入method只是拷贝了一份str而已
PS:定义一个int类型的str变量,感觉怪怪的 :oops:
变量作用域
public void method2(){
//method1(str);
System.out.println(method1(str));
}
试试
变量的作用域问题吧 你在method1()中操作的 其实是参数变量str,而非你所谓的全局变量str,如果你在method1中 str前添加this. 那么你的method2输出就为7了吧
String不是基本类型
变量作用域,这里method1中str+=5是局部变量str,屏蔽了全居变量str
public int method1(int str){
str+=5;
return str;
你把str+=5 修改为this.str+=5,就会收到不同的结果,因为在method1中,修改的只是局部变量中的str值,不是全局变量中的str值。
有点搞啊, int 类型的变量名是str, 怎么感觉怪怪的;
[code="java"]
public void method2(){
method1(str);
System.out.println(str);
}
[/code]
这里如果改成 System.out.println(method1(str));
就是楼主希望的结果了吧
我感觉楼主这题 跟参数传递和地址传递没关系 就是局部和全局变量的问题
public class Test {
int str=2;
public int method1(int str){
//修改了下
this.str=str+=5;
return str;
}
public void method2(){
System.out.println(method1(str));
System.out.println(str);
}
public static void main(String[] args){
Test t1=new Test();
t1.method2();
}
}
修改的是局部变量、输出的却是全局变量——debug一下,就明白了。。。
其实就是一个传值,还是传地址的问题,你去找个书看明白了,传值还是传地址,就明白了,很简单的