`

未完 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
分享到:
评论

相关推荐

    联想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/...

    百度地图自定义Marker(android)

    本项目聚焦于在Android平台上如何利用百度地图SDK实现自定义Marker,以满足个性化需求。 首先,我们需要理解百度地图SDK的基本用法。在Android项目中,需要引入百度地图的SDK库,这可以通过在`build.gradle`文件中...

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

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

    安卓百度地图marker实现类平滑移动

    接下来,创建一个地图fragment或activity,并初始化百度地图。在onCreateView或onCreate方法中设置地图控件并加载地图: ```java MapView mapView = findViewById(R.id.map_view); BaiduMap baiduMap = mapView....

    2022年Java语言的接口与类型安全Java教程.docx

    标识接口(Marker Interface)如`Serializable`,没有任何方法,仅仅表示实现该接口的类具有特定的性质。常量接口(Constant Interface)虽然可以用来存储常量,但不推荐这样做,因为这违反了接口的设计原则,更好的...

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

    在使用高德地图进行开发时,我们经常需要在地图上展示一些特定的点,并且有...例如,你可以根据图片内容为不同的marker设置不同的图标,或者使用图片序列来创建动态效果。总的来说,这需要结合实际项目需求来具体实现。

    Lenovo&TinkPad; Marker 5.01

    Marker 5.01:深入解析笔记本标记工具的高效使用》 Lenovo&TinkPad; Marker 5.01是一款专为Lenovo和TinkPad笔记本设计的标记工具,旨在提升用户在工作和学习中的效率。这款工具的主要功能在于帮助用户在屏幕上进行...

    高德地图Marker平滑移动

    在Android开发中,高德地图API提供了一个强大的功能,即让地图上的Marker实现平滑移动。这个功能在很多场景下非常实用,比如模拟导航、展示动态数据等。本示例项目"Android_Move_Example-master"显然是一个专为演示...

    marker备注

    `TestActivity.java`很可能是项目的主活动,其中包含了地图的初始化、marker的添加以及事件监听等逻辑。在这个活动中,开发者可能使用了百度地图SDK提供的`MapView`类来加载地图,并调用`BaiduMap`对象的`addOverlay...

    联想所有机型marker

    标题中的“联想所有机型marker”可能是指一个包含联想公司各种型号电脑硬件配置、规格或标识符的集合。在IT行业中,"marker"这个词在这种上下文中可能是标记、指示器或者特征的意思,用来区分不同型号的联想产品。这...

    Google Map Marker的显示与隐藏

    1. **创建Marker对象**:首先,你需要实例化一个新的Marker对象,指定其位置。例如: ```javascript var marker = new google.maps.Marker({ position: {lat: -34.397, lng: 150.644}, // 坐标位置 map: map, // ...

    Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用

    在实际应用中,你可能还需要处理Marker的点击事件,可以通过`MapView`的`OnMarkerClickListener`接口实现。当用户点击Marker时,可以在回调方法`onMarkerClick()`中处理相关逻辑: ```java map....

    百度地图marker动画的实现

    在开发Web应用时,地图组件常常扮演着重要角色,而百度地图API则为开发者提供了丰富的功能,包括在地图上添加标记(marker)。本教程将详细讲解如何利用百度地图API和CSS3来实现marker的动画效果。 首先,让我们...

    JavaScript添加marker并连线

    在本实例中,我们将探讨如何利用SuperMap iClient 6R for JavaScript来添加marker(标记)并进行连线,以实现地理空间数据的可视化。 首先,我们需要了解JavaScript中的marker是什么。Marker通常表示地图上的一个...

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

    在开发基于地图的应用时,尤其是使用百度地图API时,可能会遇到一个常见的问题——当需要在地图上显示大量标记(marker)时,地图加载会变得卡顿,用户体验显著下降。这个问题通常由于JavaScript处理大量DOM元素导致...

    高德地图Marker拖动圆环范围

    3. **创建Marker**:使用MapKit提供的接口创建Marker对象,设置其位置、图标等属性,并将其添加到地图上。 4. **监听Marker拖动**:注册OnMarkerDragListener,重写onMarkerDragStart、onMarkerDrag和...

    Matlab画图时-Marker过多的解决方法.pdf

    Matlab画图时Marker过多的解决方法 一、问题描述 在Matlab中画图时,Marker的数量过多会使图像变得拥挤不清晰,影响图像的美观性和可读性。这种情况在写论文时尤其常见,特别是在画曲线图时,Marker的密集会使图像...

    完美解决百度地图聚合中的marker添加label后移动、放大缩小时label消失的问题

    在使用百度地图API进行开发时,经常会遇到一个问题:在实现地图上的marker聚合功能时,当marker数量过多,为了提高用户体验,我们会使用聚合技术将多个marker合并为一个大的标记点。然而,一旦添加了label(标记文字...

    高德地图的marker聚合

    2. 初始化ClusterManager:高德地图API中的ClusterManager是负责管理Marker并进行聚合的类。你需要实例化一个ClusterManager对象,并将其与地图视图关联。 3. 添加Marker到ClusterManager:将之前创建的Marker对象...

Global site tag (gtag.js) - Google Analytics