今天才发现,原来这样改变不了引用,各位高手能否解释一下?class Test{
private int t;
Test(int t){this.t = t;}
static void changeRef(Test test){
//我知道,如果在这里改变t的成员变量值,是可以的。
//比如:test.t = 1;
test = new Test(1);//我理解是这里会指向新的对象,但是从结果来看,没有影响到传进来的那个引用
}
public static void main(Sring[] args){
Test test = new Test(2);
changeRef(test);
System.out.println(test.t);//发现这里还是输出2,也即引用没有改变。各位能否解释一下其中的知识点? }
}
private int t;
Test(int t){this.t = t;}
static void changeRef(Test test){
//我知道,如果在这里改变t的成员变量值,是可以的。
//比如:test.t = 1;
test = new Test(1);//我理解是这里会指向新的对象,但是从结果来看,没有影响到传进来的那个引用
}
public static void main(Sring[] args){
Test test = new Test(2);
changeRef(test);
System.out.println(test.t);//发现这里还是输出2,也即引用没有改变。各位能否解释一下其中的知识点? }
}
解决方案 »
- PL\SQL 接收键盘输入
- 应该是一样功能的代码,但是为什么实际上就不一样
- 关于国际化的XML问题
- 我想将两张(A.gif和B.gif)图片合并成为另一张图片(C.gif)并保存,如何实现?
- 如何获得网页的更新时间?
- 子类为什么要继承父类的构造方法?
- 做一个javaApplications 要用到外部的包.jar,怎样使用?一定要设在classpath里吗?
- JAVA高手帮帮我阿,网页上数据库连接无法显示数据
- 怎么在本地主机做2个serversocket???谢谢
- 《JAVA2核心技术 高级特性》里面的光盘JDK软件(WINDOWS)怎么配置啊?
- apache-common-io的文件监听问题
- java解析问题
test = new Test(1);
这会,这个"test"就和方法外的test没有什么关系了!
当Test test = new Test(2);是test指向的是第一个创建的Test对象
当调用changeRef(test)是虽然新创建了一个新的对象,引用也指向了新的对象,但是由于第一次创建的对象没有销毁,changeRef方法调用完毕后还是指向的第一个对象,不知这样解释是否通
private int t;
TestRef(int t){this.t = t;}
static void changeRef(TestRef test){
test = new TestRef(1); //break point 2
}
public static void main(String[] args){
TestRef test = new TestRef(2);//break point 1
changeRef(test);
System.out.println(test.t);
}在break point 1出添加断点后单步执行,并观察test这个变量的名字,执行到断点时test为learn.java.TestRef@bb7465。当执行到第二个断点时test为learn.java.TestRef@860d49 。所以虽然两个名字相同,但是第一个test并没有把引用赋给第二个test。因此虽然进行的传址操作。但是两个test分部指向了自己相应的实例。
其实还是对象和对象引用的区别
形参test只是对象的引用,test=new Test(1);是对引用的操作,让它变成了另外一个对象的引用。
而对实参test没有影响。
说到底还是传值,只不过类类型传的是引用的值
大家好,今天看到一篇文章,问题解决了,java方法参数的传递是值传递,不是引用传递。楼上有的人已经已经知道了,也有回答不错的,稍后结帖。
不知道的请看这篇文章,就明白了。
我自己写的理解