java 引用调用问题
答案:3 悬赏:20 手机版
解决时间 2021-04-21 19:19
- 提问者网友:自食苦果
- 2021-04-21 06:44
代买如下
放在Only.java中的代码如下:
public class Only{
private int x1;
private int x2;
public void set1(int a){
x1 = a;
}
public void set2(int b){
x2 = b;
}
public int get1(){
return x1;
}
public int get2(){
return x2;
}
}
放在TestSwap.java中的代码如下
public class TestSwap{
public void Swap(Only a,Only b){
Only temp;
temp = a;
a = b;
b = temp;
}
public void show(){
Only a = new Only();
Only b = new Only();
a.set1(100);
b.set2(200);
System.out.println("调用Swap()函数之前");
System.out.println("x1 = "+a.get1()+"'"+"x2 = "+b.get2());
System.out.println("调用Swap()函数之后");
Swap(a,b);
System.out.println("x1 = "+a.get1()+"'"+"x2 = "+b.get2());
}
public static void main(String [] args){
TestSwap B = new TestSwap();
B.show();
}
}
运行 输出结果是一样的
为什么我用引用调用 怎么值不变了呢 怎么和c++里面的不一样呢?
请java高手给我详细的解释哈
给我解释清楚了 我给你20分 说到做到!
最佳答案
- 五星知识达人网友:渊鱼
- 2021-04-21 07:30
问题出在这个方法上
public void Swap(Only a,Only b){
Only temp;
temp = a;
a = b;
b = temp;
}
你是想实现引用的交换,但是这个交换的只是局部变量的引用。方法执行完了,这两个引用都会消失,而且你测试方法不应该设置不同的实例变量。你看看我给你修改的实例,然后你测试下
public class Only{
private int x;
public void set(int a){
x = a;
}
public int get(){
return x;
}
}
public class TestSwap{
Only a = new Only();
Only b = new Only();
public void Swap(){
Only temp;
temp = a;
a = b;
b = temp;
}
public void show(){
a.set(100);
b.set(200);
System.out.println("调用Swap()函数之前");
System.out.println("x1 = "+a.get()+"'"+"x2 = "+b.get());
System.out.println("调用Swap()函数之后");
Swap();
System.out.println("x1 = "+a.get()+"'"+"x2 = "+b.get());
}
public static void main(String [] args){
TestSwap B = new TestSwap();
B.show();
}
}
全部回答
- 1楼网友:酒醒三更
- 2021-04-21 08:37
public class Obje {
public void test(){
System.out.println(123456);
}
public void setNull(Obje o){
o=null;
}
public static void main(String []args){
Obje o = new Obje();
o.setNull(o);
o.test();
}
}
输出123456 //并没有出现空指针异常,说明o.setNull(o);并没有把 o 对象设为null,证明是值传递。
或许这个例子更能说明问题,java里面只有值传递。。确实和c不一样。
你传过去的的确是引用,不过是Swap函数里的引用,也就是说Swap里的Only a和Only b虽然的确引用了实际new出来的a和b,不过它们自己只是Swap函数里的局部变量,你在Swap里交换a和b,是影响不到show里的a和b的
对应c的代码:
vodi swap( int* a, int* b ) // 传过来的是一份原变量地址的拷贝
{
int* p; p = a; a = b; b = t; // 只改变了拷贝
}
int a = 3, b = 4; swap( &a, &b );
你可以:
public void Swap(){
Only temp;
temp = a;
a = b;
b = temp;
}
Only a, b;
public void show(){
a = new Only();
b = new Only();
a.set1(100);
b.set2(200);
System.out.println("调用Swap()函数之前");
System.out.println("x1 = "+a.get1()+"'"+"x2 = "+b.get2());
System.out.println("调用Swap()函数之后");
Swap();
System.out.println("x1 = "+a.get2()+"'"+"x2 = "+b.get1());
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯