Object与日期

 

今日内容:【Object类、常用API】

  • Object类

  • Date类

  • DateFormat类

  • Calendar类

  • System类

  • StringBuilder类

  • 包装类

    学习目标

    • 能够理解Object类的特点

    • 能够重写Object类的toString方法

    • 能够重写Object类的equals方法

    • 能够使用日期类输出当前的日期

    • 能够使用将日期格式化为字符串的方法

    • 能够使用将字符串转化为日期的方法

    • 能够使用System类的数组复制方法

    • 能够说出使用StringBuilder类可以解决的问题

    • 能够使用StringBuilder类可以解决的问题

    • 能够说出8种基本数据类型对应的包装类

    • 能够说出自动装箱、自动拆箱的概念

    • 能够将字符串转化成对应的基本数据类型

    • 能够将基本数据类型转换成对应的字符串

定义一个日期测试类

java.util.Date 表示时间和日期的类,

Date可以获取精确到毫秒值得特定瞬间,

毫秒:千分之一秒 1秒=1000毫秒

2020-11-27 19:26:30:333

毫秒值的作用:可以对时间和日期做一个精确的计算,计算完毕再把毫秒值转换成日期

把日期转换成毫秒值
 *     当前的日期 2020-11-27
 *     时间起始值(原点)(0毫秒) 1970 年 1 月 1 日 00:00:00 英国的格林威治时间)以来的指定毫秒数。
 *     就是计算当前日期到时间起始值一共有多少毫秒?1606477080643L
 *     
 *     注意:
 *             中国是属于东八区 会在标准时间之上再增加八小时  上海或者北京
 *          1970 年 1 月 1 日  08:00:00 
 *          
 *     一天 = 24 * 60 * 60 * 1000 = 86400000 毫秒值
 *     把毫秒值再转换成日期
 *              1606477080643L / 86400000  天数

public class Demo01Date {

	public static void main(String[] args) {
		System.out.println(System.currentTimeMillis());//距1970年1月1日 00:00:00  1606477940666L
		Date date = new Date(0L);// 0毫秒
		System.out.println(date);// Thu Jan 01 08:00:00 CST 1970
		
		// 获取当前时间的毫秒值
		Date date2 = new Date();
		System.out.println(date2);// Fri Nov 27 19:50:14 CST 2020
		
		// 精确到毫秒值  getTime()
		long time = date2.getTime();
		System.out.println(time);//1606477940686L
		
		// 毫秒值再转换成日期
		// new Date(long date)
		Date date3 = new Date(1606477940686L);
		System.out.println(date3);// Fri Nov 27 19:52:20 CST 2020
		
		
		
	}
	
}

java.text.DateFormat: 进行日期/时间格式化子类的抽象类
 * 作用:
 *         格式化  日期----》文本
 *    解析    文本----》日期 
 * 成员方法:
 *         String  format(Date date):  按照指定的模式,把date日期,格式化为符合模式的字符串
 *      Date    parse(String source) 把符合模式的字符串,解析成Date日期
 *  Dateformat类是一个抽象类,无法直接创建对象,可以使用它的子类SimpleDateFormat     
 *  java.text.SimpleDateFormat extends DateFormat
 *  
 *  构造方法:
 *       public SimpleDateFormat(String pattern)
 *       用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat
 *    参数:
 *        String pattern  传递指定的模式
 *    Thu Jan 01 08:00:00 CST 1970
 *    调整为:  20:15 2020/11/27
 *    模式:严格区分大小写
 *        y  年
 *        M  月
 *        d  日
 *        H  二十四时
 *        m  分
 *        s  秒
 *        F  星期
 *    写对应的模式   会把模式转换成对应的日期和时间
 *       "HH:mm yyyy/MM/dd"
 *    使用format方法  把日期格式化为文本
 *    使用DateFormat类中的方法parse,把文本解析成日期
 *    使用的步骤:
 *            1. 创建SimpleDateFormat对象,构造方法中传递指定的模式
 *          2. 调用SimpleDateFormat类中的parse方法,把符合构造方法当中模式的字符串解析成日期
 *       注意:
 *            public Date parse(String source) throws ParseException     
 *           如果字符串和构造方法当中的模式不一样时,程序会抛出解析异常
 *           如果程序调用了一个携带解析异常的方法,那么就必须对这个异常进行处理,处理异常通常有两种解决方案:
 *              1.使用throws继续往上抛
 *              2.使用try catch语句块处理掉这个异常

public class Demo01DateFormat {

	public static void main(String[] args) throws ParseException {
		Date date = new Date();
		// 按照指定的模式 生成对应的字符串值
		// 使用DateFormat类的子类SimpleDateFormat
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm yyyy/MM/dd");
		// 把日期格式化为字符串
		String result = sdf.format(date);
		System.out.println(result);// 20:26 2020/11/27
		System.out.println("==============================================");
		
		String strDate = "2020年11月27日  20:31:30 星期5";
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss 星期F");
		Date date2 = sdf2.parse(strDate);
		// Unparseable date: "2020年11月27日  20:31:30  Fri"
		System.out.println("-------------------------------");
		System.out.println(date2);// Fri Nov 27 20:31:30 CST 2020
 
	
		
	}
	

}

 


// 定义一个学生类
public class Student {
	
	private String name;
	private int age;
	private int id;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Student() {
		super();
	}
	
	@Override
	public String toString() {
		
		return "Student [name=" + name + ", age=" + age + ", id=" + id + "]";
	}
	
	/*@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		// getClass() 反射用法    作用等同于  instanceof  
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}*/
	
	/*
	 * 重写toString方法
	 * 直接打印对象查看的是这个对象表示的内存地址值是没有意思,我们想查看的是该对象中的信息
	 * 应该打印对象中的成员信息(name,age)
	 * 
	 */
	/*@Override
	public String toString(){
		
		return "Student:{id = " + id + ",name = " + name +",age = "+ age + "}";
	}*/
	
	/*
	 * Object类中的equals方法,默认比较是两个对象的地址值,没有意义
	 * 所以我们需要重写equals方法,比较两个对象的成员变量(name,age)
	 * 问题:
	 * 		隐含着一个多态
	 *      多态的弊端:无法使用子类独有的内容(属性和方法)
	 * 		解决的办法:向下转型
	 *      伴随着转型失败  可能抛出类型转换异常  ClassCastException
	 *      解决的办法:使用Java提供的关键字 instanceof 类型判断
	 */
	// 重写Object类中的equals()方法
	
    @Override
	public boolean equals(Object object) {
		// 如果两个地址相等直接返回true
		if (this == object) {
			return true;
		}
		
		if (object == null) {
			return false;
		}
		
		// 比较的方法的调用者和方法的参数对象
		// == 此时比较的是地址值
		if (object instanceof Student) {
			// 使用向下转型
			Student student = (Student) object;
			// 比较两个对象成员变量值是否相等
			boolean result = this.name.equals(student.getName()) && this.age == student.getAge();
			return result;
		}
		// 如果object不属于Student类型,没有比较可言
		return false;
	}
 
	@Override
	public int hashCode(){
		// 通过Objects
	   int hash = Objects.hash(name,age);// name和age值相等
	   return hash;
	}
	
	
}

java.lang.Object
 *  类 Object 是类层次结构的根类(父类)
 *  每个类(Person,People,Student,Animal....String,....)都是Object类的子类
 *  所有对象(包括数组)都实现了Object类的方法

public class ObjectDemo01 {

	public static void main(String[] args) {
		 // ctrl + 1 ---》回车  快速获取方法的返回值
		 Student student = new Student("小刘", 20);
		 // 打印这个student对象
		 System.out.println(student.hashCode());// Object类中的toString()
		 //com.zhiyou100.api.object.Student@15db9742  逻辑地址值
		 // 简明但易于读懂的信息表达式
		 // 当重写之后,调用的就是重写之后方法toString
		 // Student:{ name = 小刘,age = 20}
		 // 当打印对象时,系统认为你是要查看该对象的成员信息,那必然是要调用toString()方法,
		 // 此时toString()可以选择省略不写,但是这个toString方法名不能改变
		 // 
		 Student s1 = new Student("小丽",20);
		 Student s2 = new Student("小丽",20);
		 // 让s1和s2作比较  调用重写之后的equals方法
		 boolean result = s1.equals(s1);
		 if (result) {
			System.out.println("s1 和s2是同一个对象");
			System.out.println(s1.hashCode());//23269767  799617
			System.out.println(s2.hashCode());//23269767  799617  
		 } else {
			System.out.println("s1 和s2不是同一个对象");
		}
		 
	}
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值