2 luke003 luke003 于 2016.01.30 21:03 提问

java 方法传值问题:请大家帮忙看看指点指点:代码如下:

package com.imooc;

public class Test{
public static void main(String[] args) {

Circle c1 = new Circle(1);
Circle c2 = new Circle(2);
 swap1(c1,c2);

 System.out.println("After swap1:"+c1.radius+c2.radius);

 swap2(c1,c2);
 System.out.println("After swap2:"+c1.radius+c2.radius);


}

public static void swap1(Circle x,Circle y){
    Circle t = x;
    x = y;
    y = t;
}


public static void swap2(Circle x,Circle y){
   double k = x.radius;
   x.radius = y.radius;
    y.radius = k;
}

}

class Circle{
double radius;
Circle(double newRadius){
radius = newRadius;
}
}

不是说传递基本数据类型的参数时:方法内的参数变化不影响方法外的参数。而传递引用数据类型的参数时,是传递共享,参数会发生变化吗?为什么这里的swap1没发生变化而swap2却发生对调了?

3个回答

caozhy
caozhy   Ds   Rxr 2016.01.31 06:37
 传递引用改变的是对象本身,而不是让引用指向两一个对象。
看下面的代码:
class A
{
    public int x;
        public int y;
}
正确写法如下
void swap(A a)
{
int t = a.x;
a.x = y; //改变对象的字段
a.y=t;
}
错误写法
void swap(A a)
{
    int x = a.x;
        int y = a.y;
        a = new A(); //让a指向另一个对象
        a.x = y;
        a.y = x;
}
zrf1335348191
zrf1335348191   2016.01.31 14:56

同意楼上,方法执行过程是,先对对象进行拷贝,方法结束后,拷贝的对象将不再使用,对象还是那个对象

july_apple
july_apple   2016.01.30 21:28

java中只有值传递。swap1方法中,你试图去交换两个引用变量,引用类型变量的值传递,传递的是存储单元中的内容,而非地址或者引用。所以swap1没有发生变化。而swap2方法是值传递,它传递的是存储单元的内容。内容可以改变,引用不可以改变。所以你会看到不一样的运行效果。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
请教别人与指点别人
无论工作与学习, 都会遇到这个问题。  先从一个小故事讲起吧。 某人问神父, 为啥每次讲教义时, 都先从一个故事讲起, 为啥不直接讲教义的内容。 神父说:一枚果子, 你是想自己吃呢, 还是我嚼过了再喂你吃? 以前上大学时, 宿舍里的哥们除我之外, 几乎个个都是魔兽迷, 游戏玩的疯狂。 到了考试前一两天, 傻了, 赶快跑自习室赶快看老师划的重点。 其中一个私下里跟我说, 为啥不帮他们复习,
java编写的计算器,小程序!
初学java,刚编写了一个计算器的小程序,希望大家帮忙指点指点!
检测灰鸽子教程的方法,请高手指点指点
检测灰鸽子教程的方法,检测灰鸽子教程的方法,请高手指点指点请高手指点指点检测灰鸽子教程的方法,请高手指点指点检测灰鸽子教程的方法,请高手指点指点
java多线程案例,很不错哦。
一个理解java多线程的案例。请大家指点指点。
LINUX下ThinkPad指点杆设置
修改/etc/X11/xorg.conf即可Section "InputDevice"    Identifier  "Configured Mouse"    Driver      "mouse"    Option      "CorePointer"    Option      "Device" "/dev/input/mice"    Option      "Protocol
ubuntu 14.04 下 启用thinpad指点杆
(1)禁用触控板--注:这是可选项,根据个人需要进行选择 建议进入BIOS进行禁用。 大家型号有不同,进入方法自行掌握,我这个是按F1进入。 说一下,我这个BIOS的设置步骤: Config->Keyboard/Mouse->Touch Pad->Disabled (2)为Trackpoint安装驱动程序 在终端中输入:sudo agt-get install gpointing-
急,请大家指点
我用jsp访问数据库,我想在里面用一个分页显示,每一个产品都有一个大的类,我想根据大类来控制显示,也就是我想要一个获取不同记录个数的方法,请问哪位高手解答一下啊!谢谢!
静态企业网站(html)
自己做刚刚的静态企业网站 用HTML做的,大家帮忙指点指点
javaScanner
java 中的输入:Scanner请大家指点
ACCESS教师管理系统
一个简单的系统,请大家指点指点