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());
}
}
浅复制和深复制的差别:
浅复制:被复制对象的全部变量都含有与原来对象同样的值,而全部其它对象的引用仍然指向原来的对象同样的值,而全部对其它对象的引用仍然指向原来的对象。
深复制:被复制对象的全部变量都含有与原来对象同样的值。出去那些引用其它对象的变量。
那些引用其它对象变量将指向被复制的新对象,而不再是原有的那些被引用的对象都复制了一遍。
Java学习笔记----你可能不知道那些知识,对象复制与引用的更多相关文章
- Java学习笔记(二)——类和对象
[1]类是模子,确定对象将会拥有的特征(属性)和行为(方法). [2]类的特点:类是对象的类型: 具有相同属性和方法的一组对象的集合. [3]属性:对象具有的各种特征(每个对象的每个属性都拥有特定值) ...
- Effictive Java学习笔记1:创建和销毁对象
建议1:考虑用静态工厂方法代替构造器 理由:1)静态方法有名字啊,更容易懂和理解.构造方法重载容易让人混淆,并不是好主意 2)静态工厂方法可以不必每次调用时都创建一个新对象,而公共构造函数每次调用都会 ...
- Java学习笔记【四、类、对象、接口】
编程语言的发展 机器语言 过程语言 面向对象编程--封装.继承.多态 关键字 extends implements override overload super this static abstra ...
- Java学习笔记【一、环境搭建】
今天把java的学习重新拾起来,一方面是因为公司的项目需要用到大数据方面的东西,需要用java做语言 另一方面是原先使用的C#公司也在慢慢替换为java,为了以后路宽一些吧,技多不压身 此次的学习目标 ...
- java学习笔记之基础篇
java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...
- 20145330《Java学习笔记》第一章课后练习8知识总结以及IDEA初次尝试
20145330<Java学习笔记>第一章课后练习8知识总结以及IDEA初次尝试 题目: 如果C:\workspace\Hello\src中有Main.java如下: package cc ...
- JAVA学习笔记—review基本知识[反射与异常]
JAVA学习笔记—review基本知识[反射与异常] 1.异常: 1.1异常的分类: Java会将所有的异常封装成对象,其根本父类为Throwable. Throwable有两个子类:Error 和E ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
随机推荐
- 根据截至日期格式获取倒计时&&时间戳转日期格式
//时间戳转日期格式,传入时间戳必须为数字类型function currentDate(shijianchuo) { var date = new Date(shijianchuo); var y = ...
- zabbix4.2学习笔记--监控tomcat
zabbix提供了一个java gateway的应用去监控jmx(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架 环境 主机 ...
- 为什么 [\000-\177]匹配任意7bit ascii码 ?
如题 41 print \000; 42 print "\n"; 43 print \177; 输出: SCALAR(0x3fce0)SCA ...
- live555简介
live555 编辑 目录 1live555简介 2Live555 Streaming Media整体框架 3openRTSP客户端流程 1live555简介编辑 Live555 是一个为 ...
- DataRow复制一行到另一个DataTable
DataRow复制一行到另一个DataTable 下面两个方法是DataRow复制一行到另一个DataTable的,直接Add会出错“此行已属于另一个表”,其实以前就知道怎么做的,可每次要用到的时 ...
- Chrome插件:微信公众号自动登录(chrome.extension)
manifest.json: { "manifest_version": 2, "name": "WX.AutoLogin", " ...
- (转载)Catalan数——卡特兰数
Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...
- SPI与I2C
spi的最快传输速率是20mhz,i2c的传输速率是400khz. 版权声明:本文为博主原创文章,未经博主允许不得转载.
- STM32F407 新建基于固件库的项目模板
1.新建文件夹如图: 2.新建项目在USER文件夹中,选cpu如图: 若再弹出窗口, 直接点cancel 3.删了这俩文件夹: 4.复制文件到fwlib: src 存放的是固件库的.c 文件, inc ...
- 完美解决了span的宽度设置
下 面代码的CSS定义完美解决了span的宽度设置问题.由于浏览器通常对不支持的CSS属性采取忽略处理的态度,所以最好将display:inline -block行写在后面,这样在Firefox里面, ...