`
无量
  • 浏览: 1141948 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK-Date类源码学习

阅读更多
这里模仿JDK源码实现了一个自定义的Date类
package com.out.util;

import sun.util.calendar.BaseCalendar;

/**
 * Date类的实质就是,一个重要的属性:长整型,用来表示距离1970.1.1 0点,这个距离的毫秒数(1秒=1000毫秒)
 * 如:1970年1月1号1时0分0秒   就是:60*1000  如果是1969年12月31号13点 就是:-60*1000
 * 1.为什么要实现Serializable接口?
 * 2.为什么要实现Cloneable接口?自定义类默认继承Object类,已经有clone方法了,直接覆盖或者不需要实现,为什么还要实现Cloneable接口
 * clone对象更快,要覆盖因为,直接clone,如果对象中属性是引用,那么就是浅复制,覆盖以实现深度复制
 * 3.为什么要实现Comparable接口?
 * 来实现日期的比较功能
 * @author huangqun08312
 */
public class Date implements java.io.Serializable, Cloneable,Comparable<Date>{
	
	/**
	 * 这个serialVersionUID什么作用,为什么是这样的数?
	 */
	private static final long serialVersionUID = 6660056718619883291L;
	
	/**
	 * transient关键字什么作用?
	 * transient关键字只能修饰变量,被transient关键字修饰的变量不能被序列化
	 * 一个静态变量不管是否被transient修饰都不能被序列化
	 */
	private transient long fastTime;
	
	private transient BaseCalendar.Date cdate;
	
	public Date() {
		this.fastTime = System.currentTimeMillis();
	}
	
	public Date(long date) {
		this.fastTime = date;
	}
	
	public long getTime() {
		return this.fastTime;
	}
	
	public void setTime(long time) {
		this.fastTime = time;
	}
	
	public boolean before(Date when) {
		return getMillisOf(this) < getMillisOf(when);
	}
	
	public boolean after(Date when) {
		return getMillisOf(this) > getMillisOf(when);
	}
	
	public boolean equals(Object obj) {
		return obj instanceof Date && getTime() == ((Date)obj).getTime();
	}
	
	/**
	 * final可以修饰方法么?
	 * final修饰的方法,不可以被子类覆盖,子类不可以复写
	 * final修饰的类,不可以被继承,也就是final修饰的类是叶子类
	 * @param date
	 * @return
	 */
	static final long getMillisOf(Date date) {
		return date.fastTime;
	}
	
	public int compareTo(Date other) {
		long thisTime = getMillisOf(this);
		long otherTime = getMillisOf(other);
		return thisTime > otherTime ? 1 : (thisTime == otherTime?0:-1) ;
	}
		
	public int hashCode() {
		long ht = this.getTime();
        return (int) ht ^ (int) (ht >> 32);
	}
	
	/**
	 * 这个克隆方法,为什么还要再判断下cdate这个是否为null,再克隆一次?
	 * 增加效率,如果为null,没必要在复制了
	 * Date这个克隆不可以直接把其属性和方法同时克隆么?
	 * 如果是基本类型,直接会复制一份,如果属性是引用类型,那么如果不实现clone方法,那样的复制是浅复制
	 */
	public Object clone() {
		Date d = null;
		try {
			d = (Date) super.clone();
			if (cdate != null) {
				d.cdate = (sun.util.calendar.BaseCalendar.Date) cdate.clone();
			}
		} catch (CloneNotSupportedException e) { }   //从来不会被执行到
		
		return d;
	}
}
分享到:
评论

相关推荐

    jdk-8u45-windows-x64

    对于源码软件标签,这意味着JDK不仅包含二进制版本,也可能包含源代码。开发者可以查看和学习源代码,这对于理解Java的工作原理,或者进行定制化修改和扩展非常有用。Oracle通常会提供源代码以遵循GNU General ...

    JDK8源码 jdk-1.8.0_221 jdk-8u221 src源码

    总之,JDK8的源码是一个宝贵的资源,它为我们提供了学习和探索Java核心技术的通道。通过研究“jdk1.8.0_221-src”的源码,开发者可以深入了解Java的运行机制,提升自己的编程水平,更好地应对复杂的软件开发挑战。

    jdk8源码(jdk-687fd7c7986d)

    《深入解析JDK8源码:探索...通过深入学习这些源码,我们可以更好地理解Java的运行机制,提升代码质量和性能,为日常开发带来极大的便利。对于每一个Java开发者来说,掌握JDK8的新特性和源码细节都是必不可少的技能。

    jdk-8u221-windows-x64(exe版本).zip

    总的来说,"jdk-8u221-windows-x64.exe"提供了Java 8的稳定版本,包含源码解析,有助于开发者深入理解Java 8的内部工作原理,对于学习、研究和实践都有极大的帮助。无论是初学者还是经验丰富的开发者,都能从中受益...

    jdk8u-jdk-master

    三、OpenJDK 8源码学习路径 深入学习OpenJDK 8源码,可以从以下几个方面入手: 1. JVM架构:理解JVM的内存模型、类加载机制、垃圾收集、线程调度等基础概念。 2. 字节码与编译器:研究JVM如何执行字节码,以及...

    jdk-8u221-windows-x64(exe版本).7z

    通过阅读源码,开发者可以深入理解Java平台的工作原理,学习最佳实践,以及解决遇到的问题。源码分析有助于提升编程技能,特别是在调试和优化代码时。 **企业级开发的应用** JDK8u221适用于个人技术开发和企业级...

    JDK-Concurrent:深入学习JDK Concurrent包,以及其他线程相关源码;

    JDK-并行深入学习 开始从原始二进制研究Concurrent包,以及其他并发相关的包,对于途中遇到的不明白的东西,也会作相应了解。 该项目的缘由是看CopyOnWriteArrayList二进制时,对Unsafe类一无所知,才有了好钻钻一番...

    jdk-8u201 windows和linux x64

    4. **日期和时间API**:通过java.time包提供了新的日期和时间API,替代了原有的Calendar和Date类,提供更强大的功能和更友好的API。 5. **新集合工厂方法**:在集合接口中添加了新的工厂方法,如List.of()、Set.of...

    jdk-18-windows-x64-bin.zip

    Java开发工具包(Java Development Kit,简称JDK)是学习和开发Java应用程序的基础。这个"jdk-18-windows-x64-bin.zip"文件是Oracle公司提供的JDK的一个版本,特别针对Windows 64位操作系统。Java 1.8,也被称为Java...

    json-lib-2.4-jdk15-sources.jar

    源码中的关键类如`JSONArray`、`JSONObject`、`JSONSerializer`和`JSON怡化器`等提供了丰富的API,是学习JSON处理的好材料。 此外,了解`json-lib`的源码也有助于开发者在遇到问题时快速定位原因,比如解析错误、...

    jdk-8u271-linux64 版本

    **正文** 《深入理解JDK 1.8 u271 Linux 64位版本》 JDK(Java Development Kit)是Oracle公司发布的用于...通过深入学习和实践,我们可以充分利用JDK 1.8的新特性,提升开发效率,编写出更加优雅、高效的Java代码。

    openjdk8u-jdk8u92-b14的源码

    通过深入研究openjdk8u-jdk8u92-b14的源码,开发者不仅可以掌握Java 1.8的关键特性,还能学习到虚拟机优化、编译器技术、垃圾收集策略等核心知识,这对于提升编程技能、解决实际问题具有极大的帮助。同时,源码阅读...

    JDK8u112源码

    - Date和Time API的改进:JDK 8提供了全新的日期和时间API(`java.time`包),替代了原来的`java.util.Date`和`java.util.Calendar`,提供了更加友好和强大的日期时间处理能力。 通过阅读和分析这些源码,开发者...

    jdk-8u291-windows-x64.zip

    新的`java.time`包替换了过时的`java.util.Date`和`java.util.Calendar`,提供了更直观、更易用的日期和时间处理类,如`LocalDate`、`LocalTime`和`LocalDateTime`。 6. **Optional类** `Optional`类用于表示可能...

    jdk源码(完整版)

    3. **深入源码学习的好处** - **理解底层机制**: 通过阅读源码,开发者可以了解Java运行时环境如何处理内存、线程、垃圾收集等问题。 - **优化代码**: 学习源码有助于提升编程技巧,找出更高效或更优雅的实现方式...

    jdk-8u241-windows-x64压缩版.zip

    这个文件包含了JavaFX的源代码,自JDK 8u261起,JavaFX已被移出JDK的核心,但在8u241中仍包含其源码。 5. **LICENSE、COPYRIGHT、README.html、release**: 这些文件提供了JDK的许可信息、版权声明以及版本详细信息...

    JDK8完整源码包

    总之,"JDK8完整源码包"是一个宝贵的学习资源,它涵盖了Java开发的核心技术和优化策略。通过深入研究,开发者不仅能提升自己的编程技巧,还能更好地理解Java平台的内部运作机制,从而在实际项目中做出更明智的设计...

    jdk1.8.0_181--.zip

    - **JDK源码**:安装JDK时,可以选择包含源码,这对于学习和理解Java的内部工作原理非常有帮助。 5. **兼容性和依赖**: - **操作系统支持**:JDK 1.8.0_181支持多种操作系统,包括Windows、Linux、macOS等。 - ...

    jdk1.7 jdk1.8源码包

    这两个版本的源码可以帮助开发者深入理解JDK的实现细节,比如垃圾收集算法、类加载机制、并发模型以及各种标准库类的实现。通过阅读源码,你可以学习到如何优化代码,如何设计高效的数据结构和算法,以及如何遵循...

    jdk1.8source源码

    源码分析是深入理解Java平台工作原理的关键,对于开发者来说,能够查看和学习JDK的源代码是提升技能的重要途径。在这个压缩包中,包含了一些主要的Java核心库的源代码,如`com`, `org`, `launcher`, `java`, 和 `...

Global site tag (gtag.js) - Google Analytics