zoukankan      html  css  js  c++  java
  • Java学习笔记----你可能不知道那些知识,对象复制与引用

    1.private ,protected,static不能用来修饰interface。

    2.java在处理基本数据类型(比如int ,char,double)时,都是採用按值传递的方式运行。除此之外的其他类型都是按引用传递的方式运行。对象除了在函数调用时时引用传递,在使用“=”赋值时也是採用引用传递。

    3.怎样在java中进行对象的复制。而不是引用。举例:

    class Obj implements Cloneable{
    	private int a=0;
    	public int getA(){
    		return a;
    	}
    	public void setA(int b){
    		this.a=b;
    	}
    	public void changedA(){
    		this.a=1;
    	}
    	public Object clone(){
    		Object o=null;
    		try{
    		0=(Obj)super.clone();
    		}catch(CloneNotSupportedException e){
    			e.printStatckTrace();
    		}
    		return o;
    	}
    }
    public class TestRef{
    	public static void main(String args[]){
    		Obj a= new Obj();
    		Obj b=(Obj)a.clone();
    		b.changedA();
    		System.out.println("a:"+a.getA());
    		System.out.println("b:"+b.getA());
    	}
    }

    程序执行结果为:

    a:0

    b:1

    因此要赋值一个类,必须实现Cloneable接口。步骤:

    (1)实现clone的累首先要继承Cloneable接口。

    Cloneable接口实质是一个标识接口(没有不论什么方法,即空接口)

    (2)在类中重写Object类的clone()方法。

    (3)在clone()方法中调用super.clone().

    (4)把浅复制的引用指向原型对象新的克隆体。

    当类中有除基本数据以外的其他复杂对象属性时,在重写clone()方法时要对非基本类型的属性完毕深复制。举比例如以下:

    class Obj implements Cloneable{
    private Date birthday = new Date();
    	private int a=0;
    	public int getA(){
    		return a;
    	}
    	public void setA(int b){
    		this.a=b;
    	}
    	public void changedA(){
    		this.a=1;
    	}
    	public Date getDate(){
    		return birthday();
    	}
    	public void setDate(Date date){
    		this.birthday = date;
    	}
        public void changeDate(){
    		this.birthday.setMonth(4);
        }
    	public Object clone(){
    		Object o=null;
    		try{
    		0=(Obj)super.clone();
    		}catch(CloneNotSupportedException e){
    			e.printStatckTrace();
    		}
    	//实现深复制
    	o.birthday=(Date)this.getDate().clone();
    		return o;
    	}
    }
    public class TestRef{
    	public static void main(String args[]){
    		Obj a= new Obj();
    		Obj b=(Obj)a.clone();
    		b.changedA();
    		System.out.println("a:"+a.getA());
    		System.out.println("b:"+b.getA());
    	}
    }


    浅复制和深复制的差别:

    浅复制:被复制对象的全部变量都含有与原来对象同样的值,而全部其它对象的引用仍然指向原来的对象同样的值,而全部对其它对象的引用仍然指向原来的对象。

    深复制:被复制对象的全部变量都含有与原来对象同样的值。出去那些引用其它对象的变量。

    那些引用其它对象变量将指向被复制的新对象,而不再是原有的那些被引用的对象都复制了一遍。





  • 相关阅读:
    第六章 虹销雨霁(中)
    第四章 曙光初现(下)
    第三章 曙光初现(上)
    第二章 福祸相伴(下)
    第二章 福祸相伴(上)
    小云(云层-陈霁)的发展史
    小白成长建议(9)-苞丁解牛
    NYoj 116士兵杀敌(二)区间求和,单点更新
    HDU 1754 区间查询,单点更新
    《灯亮or灯灭》 --有个有趣的数论问题
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6873287.html
Copyright © 2011-2022 走看看