java 对象引用与赋值

案例:

package com.util;

import java.util.ArrayList;
import java.util.List;

public class CopyObjectUtil {
    private static List<String> list;
    private static User userTemp;
    static{
        list=new ArrayList<String>();
        list.add("aa");
        list.add("bb");
        
        userTemp=new User();
        userTemp.setName("CA");
        userTemp.setRemark("原始值");
        userTemp.setAge(20);
    }
    
    public static void main(String[] args) {
        List<User> userList=new ArrayList<User>();
        for(int i=0;i<list.size();i++){
            User user =new User();
            user=userTemp;
            user.setName(list.get(i));
            user.setAge(user.getAge()+i);
            userList.add(user);
        }
        int i=0;
        for(User o : userList){
            System.out.println("===="+i+++"=======");
            System.out.println(o.getName());
            System.out.println(o.getRemark());
            System.out.println(o.getAge());
        }
        
    }

}
class User{
    private String name;
    private String remark;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
}
输出结果:

====0=======
bb
原始值
21
====1=======
bb
原始值
21

问题:从结果表项上看list中的前一个对象的值被后一个对象给覆盖了。

User user =new User();
            user=userTemp;

原因:地址指向同一对象,List<User> 中的User都引用了同一对象,而这个对象就是userTemp=new User();静态块里创建的;for循环对其修改,实际修改的是同一对象,固会出现后面的值覆盖前面的值的现象;

解决方案:

方案1——

public static void main(String[] args) throws Exception{
        List<User> userList=new ArrayList<User>();
        for(int i=0;i<list.size();i++){
            User user =new User();
            user=(User)BeanUtils.cloneBean(userTemp);
            user.setName(list.get(i));
            user.setAge(user.getAge()+i);
            userList.add(user);
        }
        int i=0;
        for(User o : userList){
            System.out.println("===="+i+++"=======");
            System.out.println(o.getName());
            System.out.println(o.getRemark());
            System.out.println(o.getAge());
        }
        
    }

输出:

====0=======
aa
原始值
20
====1=======
bb
原始值
21

方案2——

public static void main(String[] args) throws Exception{
        List<User> userList=new ArrayList<User>();
        for(int i=0;i<list.size();i++){
            User user =new User();
            BeanUtils.copyProperties(userTemp, user);
            user.setName(list.get(i));
            user.setAge(user.getAge()+i);
            userList.add(user);
        }
        int i=0;
        for(User o : userList){
            System.out.println("===="+i+++"=======");
            System.out.println(o.getName());
            System.out.println(o.getRemark());
            System.out.println(o.getAge());
        }
        
    }

输出:

aa
原始值
20
====1=======
bb
原始值
21

时间: 2024-10-27 05:43:46

java 对象引用与赋值的相关文章

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

Java - 对象引用的初始化方式

Java对象引用的初始化方式: (1) 在定义对象的位置; (2) 在类的构造器中; (3) 在使用对象之前, 即惰性初始化; (4) 实例初始化. 代码 /** * 四种初始化方式 * <p/> * Created by wang on 15/8/5. */ class Soap { public Soap() { System.out.println("Soap"); } @Override public String toString() { return "

java对象引用在方法中传递

java对象引用在方法中传递 package com.cy; public class Client { public static void main(String[] args) { Student std = new Student("cy", 24); changeStudentNameAndAge(std); System.out.println(std.toString()); } // 改变学生姓名和年纪 // 1.直接操作对象 private static void c

atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug

atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug 1. core.setProperty(o, "materialId", null); 1 2. Java Reflection (JAVA反射) 1 3. 反射的用处 2 4. Java类反射中所必须的类: 2 BeanUtils.copyProperty 2 5. BeanUtils.setProperty 2 6. 参考 4 1. core.setProperty(

Jsp获取Java的重定向赋值(String)

Jsp获取Java的重定向赋值(String) Java代码片段: //传递String request.setAttribute("msg", msg); //重定向 request.getRequestDispatcher("error.jsp").forward(request, response); Jsp代码片段: <%@ page language="java" contentType="text/html; char

JAVA 连等赋值问题

阅读目录一.描述二.分析三.总结一.描述关于 Java 连等赋值,例如a=b=c;我们知道它是从右往左依次赋值的,其结果大致可以拆分为b=c;a=b;,但是当栈中没有持有变量的引用时,则会出现问题,例如: public class Node {int i;Node n; Node(int i) {this.i = i;} Node(Node n, int i) {this.i = i;this.n = n;} @Overridepublic String toString() {return i

JAVA 对象引用,以及对象赋值

转自:http://www.cnblogs.com/focusChen/articles/2497768.html 关键字: java对象 引用 Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没法很好地理解下面的面向对象技术.把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路. 为便于说明,我们先定义一个简单的类:

【转载】JAVA 对象引用,以及对象赋值

我们先弄清楚对象和引用的区别,为便于说明,我们先定义一个简单的类: public class Person { int age; } 有了这个模板,就可以用它来创建对象: Person person=new Person(); 通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作. 1)右边的“new Person”,是以Person类为模板,在堆空间里创建一个Person类对象(也简称为Person对象). 2)末尾的()意味着,在对象创建后,立即调用Person类的构造函数,对刚生

Java对象引用

1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用.图1为对象应用类层次. 图1 ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空