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

浅复制和深复制的区别:

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

深复制:被复制对象的所有变量都含有与原来对象相同的值,出去那些引用其他对象的变量。那些引用其他对象变量将指向被复制的新对象,而不再是原有的那些被引用的对象都复制了一遍。

时间: 2024-11-05 11:42:24

Java学习笔记----你可能不知道那些知识,对象复制与引用的相关文章

Java学习笔记(一)背景知识

1.Java属于编译型语言还是解释型语言? (1)Java即是编译型语言(把Java源代码编译成字节码,也就是*.class文件),又是解释型语言(由解释器解释字节码运行): (2)Java既不是纯粹的编译型语言(不生产特定平台的机器码),也不是纯粹的解释型语言(解释的不是源代码而是字节码) 2.如何理解Java虚拟机? (1)Java语言里负责解释执行字节码文件的是Java虚拟机(JVM Java Virtual Machine): (2)Java编译器负责生成虚拟机能理解的代码,然后由虚拟机

Effictive Java学习笔记1:创建和销毁对象

建议1:考虑用静态工厂方法代替构造器 理由:1)静态方法有名字啊,更容易懂和理解.构造方法重载容易让人混淆,并不是好主意 2)静态工厂方法可以不必每次调用时都创建一个新对象,而公共构造函数每次调用都会创建一个对象实例.就可以预先创建好对象嘛,从而能避免创建不可重复的对象. 静态工厂方法能为重复的调用返回相同对象. 缺点:如果类没有构造函数,就不能被子类化了,子类的super()就没法用了 建议2:遇到多个构造器参数时,考虑采用构建器 理由:重叠构造函数形式,构造函数重载. 当遇到很多构造器参数的

Java学习笔记心得——初识Java

初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开始走进Java的世界.  Java产生的历史 Java来自于Sun公司的一个叫Green Project中撰写的程序语言,全球信息网(World Wide Web)兴起,Java Applet成为网页互动技术的代表,特别适合于Internet应用程序开发. Java语言的特点 1.面向对象 这是Java最重要

Java学习笔记day_01

Java学习笔记(复习整理) 虽然不知道该怎么写,但是不起步就永远不知道该怎么做..刚开始可能会写的很差劲,但会一点一点变好的. 本笔记是以我按照传智播客的视频和Java核心思想来学习,前面的基础部分主要是用于个人的复习使用的. 第一段代码:HelloWorld public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep

java学习笔记12--异常处理

java学习笔记系列: java学习笔记11--集合总结 java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/arch

java学习笔记9--内部类总结

java学习笔记系列: java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note9.html,转载请注明源地址. java内部类分为:

Java学习笔记之深入理解引用

引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解的版本. 我们知道引用根据引用的类型不同有许多名称,如字符串引用,数组引用等等. 一.栈内存和堆内存 我们数组来引出和解释这两个概念. 数组引用变量只是一个引用,这个引用可以指向任何有效的内存. 简单的理解就是,这个引用是用来存放数据地址的(数据地址指向数据在内存中的存储位置),在声明引用变量的时候

java学习笔记16--I/O流和文件

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理设备之间的数据传输,对数据的操作是通过流的方式,Java用于操作流的对象都在IO包中 输入/输出流可以从以下几个方面进行分类 从流的方向划分: 输入流.输出流 从流的分工划分: 节点流.处理流 从流的内容划分: 面向字符的流.面向字节的流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对