• 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());
    	}
    }


    浅复制和深复制的差别:

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

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

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





  • 相关阅读:
    spring applicationContext.xml中<beans>中属性概述
    ES6新特性
    JavaWeb工程 目录结构
    web项目目录结构
    关于 eclipse启动卡死的问题 解决方法
    eclipse 僵死/假死 问题排查及解决
    Ajax的text/plain、application/x-www-form-urlencoded和application/json
    js的等值比较规则
    jsp页面中注释 <!-- --> 和<%-- --%> 的区别
    Spring的配置文件ApplicationContext.xml配置头文件解析
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6873287.html
Copyright © 2020-2023  润新知