一个引用对象问题

大概是这样的一个故事,首先看成员: 谢霆锋,张柏芝 以及他的两个儿子,如果实体没有实现Cloneable方法,没有调用clone方法,将会得到两个不同的结果。

首先看结果:

错误的结果1:(未实现实体的Cloneable方法)

我是第一个孩子我的名字是Lucas我爸是谢霆锋我妈是张柏芝
我是第二个孩子我的名字是Quintus我爸是谢霆锋我妈是张柏芝
突然有一天,港媒记者爆料,第一个孩子的老爸是陈冠希
Lucas的爸爸是谢霆锋
Quintus的爸爸是谢霆锋

正确的结果2:(实现实体的Cloneable方法)

我是第一个孩子我的名字是Lucas我爸是谢霆锋我妈是张柏芝
我是第二个孩子我的名字是Quintus我爸是谢霆锋我妈是张柏芝
突然有一天,港媒记者爆料,第一个孩子的老爸是陈冠希
Lucas的爸爸是陈冠希
Quintus的爸爸是谢霆锋

代码实现

Coding :

实体:

package com.example.model;

public class Student implements Cloneable {
  public String Name;
  public String Father;
  public String Monther;
  @Override
  protected Object clone() throws CloneNotSupportedException {
    // TODO Auto-generated method stub
    Student o = null;
    try {
      o = (Student) super.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return o;
  }
}

Coding:

List<Student> AllList = new ArrayList<Student>();

    Student Chirld = new Student();
    Student Lucas = new Student();
    Student Quintus = new Student();
    Chirld.Father = "谢霆锋";
    Chirld.Monther = "张柏芝";

    Quintus = Chirld;
    Lucas = Chirld;

    Lucas.Name = "Lucas";

    Log.d("1", "我是第一个孩子" + "我的名字是" + Lucas.Name + "我爸是" + Lucas.Father + "我妈是" + Lucas.Monther);

    Quintus.Name = "Quintus";

    Log.d("2", "我是第二个孩子" + "我的名字是" + Quintus.Name + "我爸是" + Quintus.Father + "我妈是"
        + Quintus.Monther);

    Log.d("3", "突然有一天,港媒记者爆料,第一个孩子的老爸是陈冠希");

    // 爆料过程
    for (int i = 0; i < 2; i++) {
      Student name = new Student();
      name = Chirld;
      if (i == 1)
        name.Father = "谢霆锋";
      else
        name.Father = "陈冠希";
      AllList.add(name);
    }

    // 爆料完毕
    Log.d("最后他们说", "");

    for (int i = 0; i < AllList.size(); i++) {
      String name = "";
      if (i == 0) {
        name = "Lucas";
      } else {
        name = "Quintus";
      }
      Student str = AllList.get(i);
      Log.d("他们说", name + "的爸爸是" + str.Father);
    }

主要错误在爆料过程的循环中,虽然new了两个对象,但是指向的是同一块内存区域。这时候必须调用Cloneable的clone方法,克隆一个实体,才能真正将值改变

Coding

    // 爆料过程
    for (int i = 0; i < 2; i++) {
      Student name = new Student();
      try {
        name = (Student) Chirld.clone();
      } catch (CloneNotSupportedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      if (i == 1)
        name.Father = "谢霆锋";
      else
        name.Father = "陈冠希";
      AllList.add(name);
    }
时间: 2024-10-12 11:19:34

一个引用对象问题的相关文章

返回一个引用对象涉及到的内存问题

using System; namespace ConsoleApplication1 { class Program { int [] f() //此函数的返回值类型为int[] { int []a = new int[5] { 1, 2, 3, 4, 5 }; return a; } static void Main(string[] args) {Program obj=new Program(); int[] a=obj.f(); for (int i = 0;i<a.Length; i

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。

在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型 的对象时检测到循环引用. 异常信息(部分): System.Web.Services.Protocols.SoapException: 服务器无法处理请求. ---> System.InvalidOperationException: 生成 XML 文档时出错. ---> System.InvalidOperationException: 序列化类型 Web

Asp.Net MVC学习记录之“一个实体对象不能由多个 IEntityChangeTracker 实例引用”

原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. ? 1 2 3 4 5 var re = /\d/; console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1") ); console.log( re.test("1"

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):

函数可以返回一个局部对象,而不能返回一个局部对象的引用(指针):当函数返回一个局部对象时,虽然这个对象已经释放,但是返回时会产生一个临时的对象.而当返回一个局部对象的引用时,这个对象已经不存在了.这就要求在函数参数中,包含一个引用或指针.int &func(int a,int b,int &retsult){ retsult = a + b; return &retsult}但是如下代码是错误的(返回局部对象的引用)int &func(int a,int b){ int &

设计一个不强引用对象的单例字典

大家都知道,使用NSDictionary存储对象的时候会强引用对象,导致被存储对象的引用计数+1,有时候,我们想用单例来存储对象,但又不希望强引用存储的对象,这该怎么实现呢? 在这里,我们可以使用NSMapTable来实现这个功能. 我直接给出源码: WeakDictionary.h   +   WeakDictionary.m // // WeakDictionary.h // 弱引用字典 // // http://www.cnblogs.com/YouXianMing/ // Copyrig

一个实体对象不能由多个 IEntityChangeTracker 实例引用。

错误代码 public bool addSubOptionItem(csModel.cs_Answer answers) { bool result = false; wpe = new csWeiPlatformEntities();//实例化entity对象 try { wpe.CreateObjectSet<cs_Answer>().AddObject(answers); wpe.SaveChanges(); result = true; } catch (Exception) { re

ServletContext对象(每个工程只有一个此对象)

一]重点方法:        1>存取对象                        void setAttribute(String name, Object object);//将object存入ServletContext对象中,并取名为name(方便取出,与Map类似)                        Object getAttribute(String name);//获取name对应的对象        2>解析web.xml中<context-param&

一个Java对象到底占多大内存?(转)

最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数

本文参考<Android系统源代码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/binder ----BpBinder.cpp ----Parcel.cpp ----ProcessState.cpp ----Binder.cpp ----IInterface.cpp ----IPCThreadState.cpp ----IServiceManager.cpp ----Static.cpp ~/Androi