今日内容:【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不是同一个对象");
}
}
}