class Circle{
double dbRadius;
Circle(double radius) {
dbRadius=radius;
}
public double Area() {
return 3.14*dbRadius*dbRadius;
}}public class Test2 {
public static void main(String[] args)
{
Circle circle1=new Circle(5.0);
Circle circle2=new Circle(3.0);
swap(circle1,circle2);
System.out.println(circle1.Area());
System.out.println(circle2.Area());
}
public static void swap(Circle cir1,Circle cir2) {
Circle circle;
circle=cir1;
cir1=cir2;
cir2=circle;
}
此程序的运行结果为:
78.5
28.259999999999998
swap()函数显然没有交换掉对象变量
circle1,circle2
原因可能就是参数按值传递的,
java中怎样能像C/C++一样
按 swap(&circle, &circle2)
把对象变量的地址传过去,使结果为
28.259999999999998
78.5

解决方案 »

  1.   

    你这样swap肯定是行不通的
    JAVA传递的是引用
    你这样的结果是最后
    cir1==cir2
    两个对象变成一样的了要用clone来交换
      

  2.   

    java不能改变这种引用指向,所以严格来说还是相当于值传递,你一定要实现那个结果的话把它传回来不就行了
    class Circle{
    double dbRadius;

    Circle(double radius) {
    dbRadius=radius;
    }

    public double Area() {
    return 3.14*dbRadius*dbRadius;
    }
    }public class Test2 {
    public static void main(String[] args){
    Circle circle1=new Circle(5.0);
    Circle circle2=new Circle(3.0);
    Circle circle[] = swap(circle1,circle2);
    circle1 = circle[0];
    circle2 = circle[1];
    System.out.println(circle1.Area());
    System.out.println(circle2.Area());
    }

    public static Circle[] swap(Circle cir1,Circle cir2) {
    Circle circle;
    circle=cir1;
    cir1=cir2;
    cir2=circle;
    return new Circle[]{cir1, cir2};
    }
    }
      

  3.   

    java只有值传递,public static void swap(Circle cir1,Circle cir2) {}当实参传进来时,传的是引用的值的拷贝,但两个引用变量circle1和circle2的值还是跟原来一样,swap执行完,cir1和cir2被释放,还是没有成功交换,可以自己画图分析下。可以用LS的方法交换,也可以用clone。
      

  4.   


    cir1 不等于 cir2 ,引用其实也是地址,也不知道该怎么说,你的例子是这样的
    假如  circle1 = "AAAAA" ,circle2 = "BBBBB"  ,你传值过去,cir1 ="AAAAA"  cir2 = "BBBBB",而你在swap()里只是对cir1 和cir2,进行交换,确实也交换了,但是对circle1 和circle2 没有影响。老师常说,你把引用看成拴牛的绳子,你对引用操作,就是对栓的牛的绳子的操作,而不是对牛进行操作。
      

  5.   

    class C1
    {
        private:
             int age;
             string name;
        public:
             int getage();
             string getname;
             C1(int &age = 10,string &name = "Tom");
    };C1::C1(int age,string name)
    {
        this->age = age;
        this->name = name;
    }int C1::getage()
    {
        return this->age;
    }string C1::getname()
    {
        return this->name;
    }
    int main()
    {
        C1 c1(5,"Jerry);
        C1 *pC1 = &c1;/////这里获取c1对象的地址
         pC1 = new C1(10000,"ghost");    delete pC1;
    }言外之意:java是不能获取对象地址的