`

未完 Java Marker interfaces | 标识接口 | 序列化 & 克隆

阅读更多
  
Marker interfaces:
又叫Tagging Interfaces。标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。常见的有Serializable  Cloneable    Remote    EventListener
你当然可以任意定义没有任何方法和属性的接口,但肯定不应该称为标识接口,因为JDK里的“标识接口”不光是“只有个名字”这么简单,更重要的是,实现这些标志接口的类,确实多了功能,尽管你看不到这些功能是怎么实现的。比如,Serializable,实现了这个接口,那这个序列化的工作,到底是谁做的那?Cloneable,实现了这个接口,并在重写的clone()方法里只是调用了一下super.clone(),就产生了一个全新的对象,要知道Object里的clone()方法是没有任何实现的,这个克隆的工作,到底是谁完成的那?JVM or Reflection,但是你看不到它们。
关于标志接口的对于错,争论是有的:
标志接口是对接口的误用,应该被避免,使用标志接口的类,都是一些相当古老的类。Java 5 加入 注解 特性后,标志接口更不会再有出现的必要。
http://www.coderanch.com/how-to/java/Java-FAQ#marker
http://www.artima.com/intv/issuesP.html
也有持不同意见的,详见 Effective Java Item 37.




常用的标识接口:
Serializable:
1 类变量和标记为transient的变量不会被序列化;
2 序列化使用 ObjectOutputStream ,反序列化使用FileInputStream
3 如果对象在序列化及反序列化的过程中需要做一些特殊的处理,那么你需要在对象所在类里加入下面的方法:
private void writeObject(ObjectOutputStream oos)
    throws IOException {
  oos.defaultWriteObject();
  // Write/save additional fields
  oos.writeObject(new java.util.Date());
}

// assumes "static java.util.Date aDate;" declared
private void readObject(ObjectInputStream ois)
    throws ClassNotFoundException, IOException {
  ois.defaultReadObject();
  // Read/initialize additional fields
  aDate = (java.util.Date)ois.readObject();
}

http://java.sun.com/developer/technicalArticles/ALT/serialization/
http://www.tutorialspoint.com/java/java_serialization.htm
http://bluepopopo.iteye.com/blog/486548
http://www.ibm.com/developerworks/cn/java/j-lo-serial/index.html



Cloneable & Object.clone():
1
引用
浅拷贝:只复制一个对象(包括其为基本类型、String的属性),对象内部存在的指向其他对象数组或者引用则不复制

深拷贝:对象,对象内部的引用均复制


为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2:


对象A进行浅拷贝后,得到对象B但是对象A1和A2并没有被拷贝:


对象A进行深拷贝,得到对象B的同时A1和A2连同它们的引用也被拷贝:


在理解了深拷贝和浅拷贝后,我们来看看Java的深拷贝和浅拷贝实现。java.lang.Object的clone()方法默认是返回一个浅拷贝对象。因此如果要用clone()方法实现一个深拷贝,我们必须对每个对象的clone()方法进行特别实现。当对象层次复杂的时候,这样做不但困难而且浪费时间和容易出现错误,特别有时候你不但需要深拷贝同时你也对这个对象进行浅拷贝的时候,你会发现写这个clone()方法真不是一个好的解决方案。

那么除了clone()方法,我们还可以怎么实现呢?答案是序列化,实现步骤和思路是把要拷贝的对象输出成byte array,然后再利用ObjectInputStream转换出新的对象。下面是代码:
public static Object copy(Object oldObj) {   
    Object obj = null;   
    try {   
        // Write the object out to a byte array   
        ByteArrayOutputStream bos = new ByteArrayOutputStream();   
        ObjectOutputStream out = new ObjectOutputStream(bos);   
        out.writeObject(oldObj);   
        out.flush();   
        out.close();   
  
        // Retrieve an input stream from the byte array and read   
        // a copy of the object back in.   
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());    
        ObjectInputStream in = new ObjectInputStream(bis);   
        obj = in.readObject();   
    } catch (IOException e) {   
        e.printStackTrace();   
    } catch (ClassNotFoundException cnfe) {   
        cnfe.printStackTrace();   
    }   
    return obj;   
}  
  • 大小: 5.1 KB
  • 大小: 7 KB
  • 大小: 9.8 KB
分享到:
评论

相关推荐

    Java开发技术大全(500个源代码).

    Student.java 定义一个用来序列化的类 ThreadIn.java 接收数据用的线程类 ThreadOut.java 发送数据用的线程类 TypeFile.java 显示文件内容的类 useScanner.java 用Scanner接收用户的输入 第8章 示例描述:本章...

    联想SLIC2.1Marker.rar

    联想旭日C430系列机型支持Vista&7系统BIOS及“Marker”文件。 联想昭阳E390&旭日420系列机型支持Vista&7系统BIOS及“Marker”文件。 注意:此附件marker文件适用于伟创(Wistron)所有主板机型,其中包括:昭阳E390/...

    联想SLIC2.1MARKER

    联想旭日C430系列机型支持Vista&7系统BIOS及“Marker”文件。 联想昭阳E390&旭日420系列机型支持Vista&7系统BIOS及“Marker”文件。 注意:此附件marker文件适用于伟创(Wistron)所有主板机型,其中包括:昭阳E390/...

    Lenovo&TinkPad; Marker 5.01

    Lenovo&TinkPad; 笔记本Marker工具 5.01 版,文件内包含Bin文件,自己编辑批处理使用即可

    marker

    marker

    google-maps-es6

    js结构如下: -js |- GMap |- GoogleMapsApi.js - google maps api class |- marker.tmpl.js - custom marker template |- stylers.js - JSON styles and custom icon |- index.js - functions to render map, ...

    BaiDuMapDemo(marker).rar

    本章将讲述如何利用Marker在地图生成点,并实现点击Marker弹出该点对应的信息。 1.点击点获取坐标 2.在我的项目里,会将地图上的一些飞机作为Marker,点击并弹出该飞机对应的详情 3.点击地图其他区域,将清除所有...

    高德地图Marker平滑移动

    高德地图Marker平滑移动,这是一个让marker在地图上平滑移动的demo

    百度地图:Marker+定位到当前位置+计算两个坐标的距离+单击marker事件

    百度地图:Marker+定位到当前位置+计算两个坐标的距离+单击marker事件

    联想所有机型marker

    联想所有机型marker,值得收藏,现在网上已经不多了。

    Google地图多marker显示,并且在marker数量增多时聚合

    基于PHP和jQuery的Google地图开发之多个marker显示,并且设置让其在数量过多时聚合。由于是给外国客户开发的接口(还没有做完,只是一个demo),所以里面的说明注释都是英文的,但我相信你们看得懂的

    高德地图将marker用连线连起来

    高德地图将带有自定义的图片的marker用连线连起来

    联想笔记本电脑 Marker 文件

    不用重新刷主板BIOS,在纯DOS下直接运行MARKER,即可刷进slci2.1,激活Windows7系统。 警告:本Marker针对联想笔记本电脑,选择对应的型号刷写,包括十几种型号,不要选错了。

    联想Marker2.1.zip

    联想全系列Marker,包含以下: LENOVOCB-01 LENOVOSV-INT LENOVOTC-03 LENOVOTC-5C LENOVOTC-5H LENOVOTC-5I LENOVOTC-5J LENOVOTC-5K LENOVOTC-5M LENOVOTC-5O LENOVOTC-5P LENOVOTC-5V LENOVOTC-5X LENOVOTC-5Y ...

    联想官方marker工具

    不用刷bios就可拥有slic2.1--联想官方marker工具

    百度地图marker动画的实现

    百度地图marker动画的实现,动画是基于css3的animation实现的,可以根据需求的不同修改乘不同的动画效果

    百度地图加载海量marker卡顿问题

    亲测好用的百度地图海量marker性能优化,包括重写的百度方法以及个人心得

    Folder Marker Home 4.2中文注册版.rar

    Folder Marker是一款文件夹标记软件,它可以给文件夹更改颜色或者图标,支持应用所选图标到所有文件夹,采用可分配方式,重装系统后标记仍然有效。按自己的要求更新文件夹后看上去更醒目,方便你平时的寻找。关于...

    百度地图去掉marker覆盖物或者去掉maker的label文字方法

    var marker = new BMap.Marker(...); //方法1 map.removeOverlay(marker); //方法2 marker.remove(); //如果是Marker设置的setLabel还可以设置其样式来隐藏 mapComponent.state.bikeMarkLabel.setStyle({ display:...

Global site tag (gtag.js) - Google Analytics