`

对象简单克隆clone和引用(转)

 
阅读更多
对象克隆,返回和原对象一样的对象,且两个对象是独立的,不是同一个引用

package copyObject;
//克隆对象,能实现clone功能的CloneClass类实现了Cloneable接口
class CloneClass implements Cloneable{
    public int aInt;
    
    public Object clone(){ //返回一个对象的克隆,并非引用
        CloneClass o = null;
        try{
            o = (CloneClass)super.clone();
        }catch(CloneNotSupportedException e){
            e.printStackTrace();
        }
        return o;
    }
    
    public static void main(String[] args){
    	CloneClass cc = new CloneClass();
    	cc.aInt = 8;
    	CloneClass cloned = (CloneClass) cc.clone();
    	
    	System.out.println(cloned.aInt);
    }
       
}


输出结果:8,
2,hashTable存的值如果是对象,则存的是对象的引用
package copyObject;
import java.util.*;
public class HashtableAdd{
    public static void main(String[] args){
        Hashtable ht = new Hashtable();
        StringBuffer sb = new StringBuffer();
        sb.append("abc,");
        ht.put("1",sb);     //向Hashtable传递StringBuffer对象也是只传递了这个StringBuffer对象的引用
        sb.append("def,");
        ht.put("2",sb);
        sb.append("mno,");
        ht.put("3",sb);
        sb.append("xyz.");
        ht.put("4",sb);
        
        int numObj=0;
        Enumeration it = ht.elements();
        while(it.hasMoreElements()){
            System.out.print("get StringBufffer "+(++numObj)+" from Hashtable: ");
            System.out.println(it.nextElement());
        }
    }
}


输出结果;
get StringBufffer 1 from Hashtable: abc,def,mno,xyz.
get StringBufffer 2 from Hashtable: abc,def,mno,xyz.
get StringBufffer 3 from Hashtable: abc,def,mno,xyz.
get StringBufffer 4 from Hashtable: abc,def,mno,xyz.

java中的引用分为强引用,弱引用和软引用。见如下例子;
package ch11exception;

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class TestStackOverFlow {

	public static void main(String[] args) {
		Object referent = new Object();
		Object strongReference = referent;
		referent = null;
		System.gc();
		System.out.println(strongReference); //强引用,GC后不一定销毁

		String  str =  "test";
		SoftReference<String> softreference = new SoftReference<String>(str);
		str=null;
		System.gc();
		System.out.println(softreference.get()); //弱引用,适合缓存,只有当内存空间不足时,垃圾回收后才会销毁
		
		WeakReference<String> weakReference = new WeakReference<String>(str);
		str=null;
		System.gc();
		System.out.println(weakReference.get()); //弱引用,促使对象更快的被GC回收,因此GC后,该对象为null

	}
//	执行结果:
//	java.lang.Object@1fb8ee3
//	test
//	null

	

}



分享到:
评论

相关推荐

    clone 深度克隆对象

    这意味着如果一个对象中包含了其他对象的引用,深度克隆会创建这些引用对象的独立副本,而不是简单地复制引用。因此,即使原始对象被修改,深克隆后的副本也不会受到影响,从而提供了数据安全性。 在Java中,实现...

    对象克隆(clone)详解.docx

    总结来说,对象克隆是Java中用于复制对象的一种机制,分为浅克隆和深克隆,分别对应于是否深度复制对象内部的引用。实现克隆的关键是实现`Cloneable`接口并重写`clone()`方法。理解这两种克隆方式的区别和应用场景,...

    PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析

    本文实例讲述了PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法。分享给大家供大家参考,具体如下: 1.对象克隆 clone PHP4面向对象功能一个很大的缺点,是将对象视为另一种数据类型,这使得很多常见的...

    clone()方法示例(对象克隆)_对象克隆_nervouse78_源码

    但是,需要注意的是,`clone()`方法返回的是一个浅拷贝,即如果对象的属性包含其他对象引用,那么这两个对象引用指向的是同一块内存空间,而不是完全独立的副本。 在`nervouse78`的这个示例中,作者"初生不惑"可能...

    Java中的克隆(Clone)机制

    在上述的`Employee`例子中,如果没有特别处理,`hireDay`日期对象就是一个共享对象,克隆后的`Employee`和原始`Employee`都将引用同一份日期数据。 2. **深克隆(Deep Clone)** 当对象的字段包含非基本类型的引用...

    C#中Clone一个对象的值到另一个对象案例 c#经典案例.pdf

    浅复制是 Clone 方法的默认实现,它只是复制对象的引用,而不复制对象的值。例如,下面的代码: ```csharp public class A : ICloneable { public int i; public string str; public object Clone() { return ...

    java中的指针,引用及对象的clone

    Java中的对象克隆可以通过实现`Cloneable`接口并覆盖`clone()`方法来完成。对象的克隆分为浅拷贝和深拷贝两种形式。 **1. 浅拷贝** 浅拷贝是指创建一个新的对象,然后将原对象的所有非引用类型的成员变量复制到新...

    PHP对象克隆clone用法示例

    在PHP中,对象的克隆可以通过使用`clone`关键字实现,而PHP的对象克隆分为浅克隆和深克隆两种。 浅克隆只是复制对象中的非对象和非资源类型的数据,如果对象中包含其他对象类型的属性,则复制的是这些属性的引用。...

    Java对象的复制克隆

    此外,如果对象包含不可克隆的引用(如 `final` 字段引用的不可变对象),或者对象的属性是复杂的嵌套结构,需要在自定义的 `clone()` 方法中进行额外的处理,以确保深拷贝的正确性。 总之,Java中的对象复制与克隆...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    浅克隆适用于只需要简单复制对象自身属性,不关心引用对象的情况,因为它效率较高。然而,对于具有复杂嵌套结构的对象,或者需要保护引用对象不被修改的情况,深克隆是必要的,尽管它可能带来更高的内存开销和性能...

    JAVA_对象克隆

    在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来完成。`Cloneable`接口本身不包含任何方法,只是一个标记接口,表明该类的对象可以被克隆。`Object`类的`clone()`方法会创建一个...

    java 深克隆浅克隆

    这意味着,浅克隆后的对象和原对象在内存中的引用结构是相同的,改变其中一个对象的引用属性会影响到另一个。为了实现浅克隆,你需要确保你的类实现了`Cloneable`接口,并重写了`clone()`方法。 2. 深克隆(Deep ...

    如何进行Java对象的克隆.pdf

    Java 中的对象克隆可以分为两种类型:浅克隆(Shallow Cloning)和深克隆(Deep Cloning)。 浅克隆是指创建一个新的对象,并将原始对象的引用类型成员变量复制到新的对象中。在浅克隆中,新的对象和原始对象共享...

    java对象复制克隆

    在Java编程中,对象复制和克隆是两个重要的概念,特别是在处理复杂数据结构时。对象复制通常分为浅拷贝和深拷贝。标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制...

    在Unity3D中实现克隆脚本2

    克隆后的对象`clone`不仅仅是一个复制,它有自己的生命周期和独立的状态,可以进行不同的操作,例如改变速度: ```csharp clone.velocity = new Vector3(0, 5, 10); ``` 这段代码设置了克隆子弹在XYZ轴上的速度,...

    java 深克隆 浅克隆

    当一个对象被浅克隆时,新创建的对象会拥有原始对象的所有字段的副本,但是这些字段如果是引用类型(比如对象),则新旧对象共享同一引用。这意味着对原始对象的引用类型字段进行修改会影响到克隆后的对象。 例如:...

    java Clone

    在上述示例中,如果`CloneClass`包含其他对象的引用,那么在`clone`方法中需要处理这些引用,以实现深克隆。 例如,如果`CloneClass`有一个`UnCloneA`类型的成员变量,为了实现深克隆,我们需要在`clone`方法中对`...

    java 对象克隆

    总结,Java中的对象克隆是一项重要的功能,用于复制和独立化对象。通过实现`Cloneable`接口和覆盖`clone()`方法,我们可以创建浅克隆对象。对于更复杂的场景,可以自定义克隆逻辑或利用序列化来实现深克隆。理解并...

    Clone详解.doc

    Java中的克隆(Clone)机制是一种创建对象副本的方法,它允许程序员复制一个对象的状态,而不会影响原始对象。克隆在编程中常用于创建对象的独立副本,使得新副本与原对象之间相互独立,对其中一个对象的修改不会...

    object-clone:克隆对象支持循环引用

    深度克隆对象,支持循环引用和属性描述符 var clone = require ( '@dmail/object-clone' ) ; var a = { name : 'a' } ; var b = clone ( a ) ; b . name ; // 'a' // of course b != a 它克隆得很深 var a = { ...

Global site tag (gtag.js) - Google Analytics