Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 756|回复: 0

在java程序中交换对象

[复制链接]

该用户从未签到

发表于 2011-9-12 22:06:32 | 显示全部楼层 |阅读模式
[blockquote]/*300*250,创建于2011-2-24*/ var cpro_id = 'u388789';
-
[/blockquote]
1. 概述
java中,参数传递是通过传值(对于对象类型,传递的是引用的拷贝),所以常规的交换实现不了两个对象的交换,下面是测试代码:

Java代码  
import org.apache.commons.beanutils.BeanUtils;   
  
public class Employee {   
    // Properties   
    private int id;   
    private String name;   
      
    // Constructors   
    public Employee() {   
    }   
      
    public Employee(int id, String name) {   
        this.id = id;   
        this.name = name;   
    }   
      
    // get、set methods   
    public int getId() {   
        return id;   
    }   
  
    public void setId(int id) {   
        this.id = id;   
    }   
  
    public String getName() {   
        return name;   
    }   
  
    public void setName(String name) {   
        this.name = name;   
    }   
      
    // 无效的交换   
    public static void swap(Employee x, Employee y) {   
        Employee temp = x;   
        x = y;   
        y = temp;   
    }   
      
    // 使用 BeanUtils 方法的有效交换   
    public static void swapByBeanUtils(Employee x, Employee y) {   
        try {   
            // clone x to temp   
            Employee temp = (Employee)BeanUtils.cloneBean(x);   
            // copyProperties from y to x   
            BeanUtils.copyProperties(x, y);   
            // copyProperties from temp to y   
            BeanUtils.copyProperties(y, temp);   
            // then, the Properties values of x,y has been swaped.   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
      
    // 有人提出使用交换数组等集合里的元素 来实现交换,这样也是无效的   
    public static void swapByArray(Object[] a, int i, int j) {   
        Object t = a;   
        a = a[j];   
        a[j] = t;   
    }   
      
    public static void main(String[] args) {   
        Employee a = new Employee(1, "Bob");   
        Employee b = new Employee(2, "Jack");   
           
        // 直接方法调用交换 -- NO   
//      swap(a, b);   
           
        // 利用BeanUtils交换 -- YES   
//      swapByBeanUtils(a, b);   
           
        // 利用 交换数据 思想 -- NO   
//      Object[] o = {a, b};   
//      swapByArray(o, 0, 1);   
           
        // 直接交换 -- YES   
//      Employee temp = a;   
//      a = b;   
//      b = temp;   
           
        System.out.println(a);   
        System.out.println(b);         
    }   
      
    // method for print   
    public String toString() {   
        StringBuilder sb = new StringBuilder();   
        sb.append("id: ").append(id).append(" name: ").append(name);   
        return sb.toString();   
    }   
}  
import org.apache.commons.beanutils.BeanUtils;
public class Employee {
// Properties
private int id;
private String name;

// Constructors
public Employee() {
}

public Employee(int id, String name) {
  this.id = id;
  this.name = name;
}

// get、set methods
public int getId() {
  return id;
}
public void setId(int id) {
  this.id = id;
}
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}

// 无效的交换
public static void swap(Employee x, Employee y) {
  Employee temp = x;
  x = y;
  y = temp;
}

// 使用 BeanUtils 方法的有效交换
public static void swapByBeanUtils(Employee x, Employee y) {
  try {
   // clone x to temp
   Employee temp = (Employee)BeanUtils.cloneBean(x);
   // copyProperties from y to x
   BeanUtils.copyProperties(x, y);
   // copyProperties from temp to y
   BeanUtils.copyProperties(y, temp);
   // then, the Properties values of x,y has been swaped.
  } catch (Exception e) {
   e.printStackTrace();
  }
}

// 有人提出使用交换数组等集合里的元素 来实现交换,这样也是无效的
public static void swapByArray(Object[] a, int i, int j) {
     Object t = a;
     a = a[j];
     a[j] = t;
}

public static void main(String[] args) {
  Employee a = new Employee(1, "Bob");
  Employee b = new Employee(2, "Jack");
  
  // 直接方法调用交换 -- NO
//  swap(a, b);
  
  // 利用BeanUtils交换 -- YES
//  swapByBeanUtils(a, b);
  
  // 利用 交换数据 思想 -- NO
//  Object[] o = {a, b};
//  swapByArray(o, 0, 1);
  
   // 直接交换 -- YES
//  Employee temp = a;
//  a = b;
//  b = temp;
  
  System.out.println(a);
  System.out.println(b);  
}

// method for print
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append("id: ").append(id).append(" name: ").append(name);
  return sb.toString();
}
}
2. 结论
在java中,对象引用是通过值来传递的,方法不能修改参数指向新的对象。

注:需加载 BeanUtils包
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-6-7 15:18 , Processed in 0.362045 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表