class Test {
public String str = "0000000";
}
public class AA {
private void method1(Test test) {
test.str = "222222";
}
private void method2(Test test) {
test = new Test();
test.str = "3333333";
}
private void method3(String str) {
str = "55555555";
}
public void action() {
Test test = new Test();
test.str = "1111111";
method1(test);
System.out.println("method1 : "+test.str);
method2(test);
System.out.println("method2 : "+test.str);
// String str = "44444444";
// method3(str);
// System.out.println("method3 : "+str);
}
public static void main(String[] args) {
AA a = new AA();
a.action();
}
}为什么打印出来都是“222222”?
public String str = "0000000";
}
public class AA {
private void method1(Test test) {
test.str = "222222";
}
private void method2(Test test) {
test = new Test();
test.str = "3333333";
}
private void method3(String str) {
str = "55555555";
}
public void action() {
Test test = new Test();
test.str = "1111111";
method1(test);
System.out.println("method1 : "+test.str);
method2(test);
System.out.println("method2 : "+test.str);
// String str = "44444444";
// method3(str);
// System.out.println("method3 : "+str);
}
public static void main(String[] args) {
AA a = new AA();
a.action();
}
}为什么打印出来都是“222222”?
解决方案 »
- 同一jvm static变量在什么情况下会不同?
- snmp中timeticks怎么转换成datetime
- eclipse 的中文帮助文档
- 请教if(conf ==true) {} 与if(true == conf){} 的区别和具体用法!
- 简单问题,关于eclipse的build path
- 新手求教:如何实现internalframe窗口之间的通讯?
- 显示动态的时间?在线等....
- 怎样用JAVA语言编写一个画流程图程序!!!!!!!!!
- 求教,关于IBM Websphere Studio的发布问题
- XML文件合并 求救。
- 请大吓帮我写条语句,只用一条语句从控制台录入字符串后反向输出
- 组件调用paint后画面就不动了
产生一个新的对象,,跟你付给method2(Test test)的是二个对象所以值没有改变哦
private void method2(Test test) {//把test引用的值传递给method2方法,注意是按值传递的。
test = new Test();//引用的值被改变,使得test指向另一个对象,原对象保持不变。
test.str = "3333333";//另一个对象str内容改变,退出后,原对象的引用不变。
}
方法结束,副本消失,因此原来的test对象不会发生改变。
我们从这段程序编译执行的过程来看
根据主函数我们知道其实就是调用AA类中的action()方法
在action()方法中
public void action() {
Test test = new Test();//先先堆内存中存放一个 test的引用
test.str = "1111111";//把 字符串"1111"存放到栈内存,然后把test引 用,指向他.
method1(test);//把test引用作为一个参数传递过来,通过函数体从新把test引用指向"2222".
System.out.println("method1 : "+test.str);//打印"2222"
method2(test);/*为了区分我们把传过来的叫TestA,new产生的哪个叫TestB
可以这样想:当testA参数传递过来的时候,执行里面的函数体,这时候method方法里面有新产生了一个对象testB他和testA虽然名字相同但在栈内存中存放的内存地址不同(对于这点可以得到验证在method1()和method2()中分别放置语句System.out.println(test);就知道了),并且他的引用指向堆内存中的"3333"字符串,而传过来的参数testA并没受任何影响还是指向“1111”。并且函数体内的testB也不会受到从外面传过来的testA的影响。可以在method2()方法中放置System.out.println(test.str);语句测试下,发现打印结果是"3333",(实际上我们可以把通过new Test()产生的一个对象的引用test想象成另外一个既把test改一个名字就可以啦。)。*/ ^o^ ^o^ ^o^ System.out.println("method2 : "+test.str);//打印“2222”
// String str = "44444444";
// method3(str);
// System.out.println("method3 : "+str);
}
修正一下!呵呵! ^0^
Test test = new Test();//先先栈内存中存放一个 test的引用
test.str = "1111111";//把 字符串"1111"存放到堆内存,然后把test引 用,指向他.