当前位置:首页 > 开发 > 编程语言 > JDK JVM > 正文

JDK-Date类源码学习

发表于: 2014-03-09   作者:无量   来源:转载   浏览:
摘要: 这里模仿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 如
这里模仿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-Date类源码学习

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
redis 学习 查看 别人的类图 引用别人的链接:http://yychao.iteye.com/blog/1751583 可以对比一下
redis 学习 查看 别人的类图 引用别人的链接:http://yychao.iteye.com/blog/1751583 可以对比一下
redis 学习 查看 别人的类图 引用别人的链接:http://yychao.iteye.com/blog/1751583 可以对比一下
反编译工具查看基础库源码,绘制简单的UML图 1.Stream抽象类 派生出①FileStream、②BufferedStream
Hadoop源码学习笔记(5) ——回顾DataNode和NameNode的类结构 之前我们简要的看过了DataNode的main函
欢迎阅读原文:JDK并发工具类源码学习系列目录 上一篇文章介绍了JDK java.util.concurrent包下很重
更多文章请阅读:JDK并发工具类源码学习系列目录。 ConcurrentSkipListMap在JDK并发工具类使用范围
欢迎阅读本系列更多文章:JDK并发工具类源码学习系列目录 作为JDK并发工具类源码学习系列的第一个被
说来惭愧,接触Android快一年了,都没有去看它的源码,之前一直想看Acitivity的源码, 由于项目事情
主要包括Java类库中提供的几个具体的类: LinkedList ArrayList HashMap HashSet TreeMap TreeSet P
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号