目录
Object类
它是所有类的父类,共有有11个方法,重点3个
String toString()
将对象变成字符串格式
Object中默认toString的实现方式:
完整类名+@+哈希code值
getClass().getName() + “@” +Integer.toHexString(hashCode());
public native int hashCode(); – 获得的是地址, 哈希码
public static void main(String[] args) {
ZiToString zi = new ZiToString("张三", 28);
//直接打印对象时, 自动就会调用对象的toString方法
System.out.println(zi); // com.zzxx.api.Object.ZiToString@5fe5c6f
// 想要打印对象时, 显示对象的属性内容 -- 重写toString方法
@Override
public String toString() {
return "ZiToString{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
System.out.println(zi);//ZiToString{name='张三', age=28}
boolean equals(Object obj)
Object中默认equals的实现方式:
return (this == obj); – 比较对象的地址
当我们想要比较两个相同类型对象的属性值时, 需要重写equals
public class ZiEquals {
public boolean equals(Object obj) {
// this-ZiEquals 和 obj-Object
// 1.this == obj, 如果对象地址⼀样,指得就是同一个对象,肯定相等
if (this == obj) {
return true;
}
// 2.类型不一致,一定是不等
if (!(obj instanceof ZiEquals)) {
return false;
}
// 3.类型一致,不是同一个对象,才要比较属性内容
ZiEquals zi = (ZiEquals) obj; //转换为当前类型——子类型
return zi.age == this.age && this.name.equals(zi.name);//名字和年龄都相同
//直接生成的:return age == ziEquals.age &&Objects.equals(name, ziEquals.name);
}
hashCode()
获取对象的散列值,默认返回对象的堆内存地址
其余方法
Class getClass()
通过对象的该方法,可以获得对象对应的类的字节码对象
Class c1 = "haha".getClass();//String的字节码对象
Class c2 = "hi".getClass();//String的字节码对象
// 同种类型的对象, 对应的字节码对象都是同一个
System.out.println(c1 == c2);
补充:
类的加载: 将类的信息读取到方法区中,生成了一字节码对象Class
所有的Student对象共同拥有一个Student的字节码对象[包含了Student类中所有的信息]
Zi zi = new Zi(); -> zi = null;
Object clone():
克隆, 复制
复制一份全新的, 属性内容一致的对象, 深克隆
复制的是引用 -> 浅克隆
调用方法的对象, 需要类实现Cloneable接口
ZiClone zi = new ZiClone();
zi.setName("lucy");
ZiClone clone = (ZiClone)zi.clone();
ZiClone clone2 = zi; // 引用的赋值 -> 浅克隆
// 默认的clone方法, 是复制一份全新的, 属性内容一致的对象 -> 深克隆
System.out.println(clone.getName());
System.out.println(zi == clone);
wait() * 3(略)
wait()无限等待/wait(t)计时等待/wait(t+m)附加时间的毫秒范围
notify() / notifyAll()
这5个和线程有关
void finalize()
在GC垃圾回收器准备释放内存前,会先调用finalize()
GC: 垃圾回收机制, 定时清理内存中
栈:方法结束, 方法栈直接释放
堆:无效对象, 等待gc回收
手动调用: System.gc()
java.util.Date
日期, 时间
Date构造方法
new Date()
new Date(long time)
// 空参构造方法 -> 当前系统时间
Date date = new Date();
// Tue Jul 21 11:48:57 CST 2020
System.out.println(date);
//Date中的 toString() 重写过了:Tue Jul 21 11:48:57 CST 2020
// 参数是long类型的构造方法
Date date1 = new Date(0l + 30l*24*60*60*1000);
System.out.println(date1);
System.currentTimeMillis();
//new Date()所做的事情其实就是调用了System.currentTimeMillis()。如果仅仅是需要或者毫秒数,那么完全可以使用System.currentTimeMillis()去代替new Date(),效率上会高一点。
Date常用API
long getTime() -> 获得date对应的毫秒值
Date date = new Date();
// 将时间从date类型, 转换成了long类型所表示的毫秒值
long time = date.getTime();
System.out.println("time: " + time);
void setTime(long time) -> 将date设置为对应毫秒值表示的时间
time += 30l*24*60*60*1000;
date.setTime(time);
System.out.println(date);
判断前后
Date date1 = new Date(0l);
// date1 是否在 date 的后面
boolean b = date1.after(date);
System.out.println(b);
// date1 是否在 date 的前面
boolean b2 = date1.before(date);
System.out.println(b2);
Calendar
java.util.Calendar -> 复杂的时间推算
初始化: static Calendar getInstance();
// 1.获得万年历对象
Calendar cal = Calendar.getInstance();
System.out.println(cal);
get/set方法
int get(分量字段) -> 获得字段对应的值
void set(分量字段, 值)
注意: cal.set(Calendar.MONTH, 6),设置进去的是7月
// 1). 获得cal对应的月份, 月份从0开始
int month = cal.get(Calendar.MONTH);
System.out.println("month: " + month); // 6
// 2). 获得cal对应的年份
int year = cal.get(Calendar.YEAR);
System.out.println("year: " + year); // 2020
// 3) 今天时间是:2020-7-21 ->设置为2020-8-15
cal.set(Calendar.MONTH, Calendar.AUGUST);
cal.set(Calendar.DAY_OF_MONTH, 15);
System.out.println(cal);
add方法
void add(分量字段, 值) -> 向前计算, 加负数
// 1.获得万年历对象 2020-7-21
Calendar cal = Calendar.getInstance();
System.out.println(cal);
// 保质期48天, 求当天是几号 2020-9-7
cal.add(Calendar.DATE, 48);
// 到期日往前推两周
cal.add(Calendar.WEEK_OF_MONTH, -2);
// 要周四
cal.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
getTimeInMillis()
获得当前日历对象的毫秒值
三种时间类型的总结和转换
所有时间格式的打印都要转换成date才能打印
// 1.获得万年历对象 2020-7-21
Calendar cal = Calendar.getInstance();
System.out.println(cal);
// 入职10周年, 当月的第三周的周五
cal.add(Calendar.YEAR, 10);
cal.set(Calendar.WEEK_OF_MONTH, 3);
cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
// 2.将 Calendar 转换成 Date 类型, 再来打印
Date date = cal.getTime();
System.out.println(date);
转换
// 1.Date -> long
Date date = new Date();
long time = date.getTime();
// 2.long -> Date
date.setTime(time);
// 如果原先没有Date对象, 可以通过long创建一个新的Date对象
Date date2 = new Date(time);
// --------------------------
// 3.Calendar -> Date
Calendar cal = Calendar.getInstance();
Date date3 = cal.getTime();
// 4.Date -> Calendar
Date date4 = new Date(0);
cal.setTime(date4);
// --------------------
// 5.Calendar -> long (了解)
Calendar cal1 = Calendar.getInstance();
long time2 = cal1.getTimeInMillis();
// 6.long -> Calendar (了解)
cal1.setTimeInMillis(time2 + 1000);
时间展示、格式化
回顾:
- long: 简单时间计算, 7天之内
运行效率计算 - Date: 展示时间
2020-07-21 16:47:55
2020/07/21 16:47:55
2020年07月21日 16:47:55 - Calendar: 复杂计算
SimpleDateFormat格式化
自定义格式 java.text.DateFormat 的子类
// 为了显示时间 Date -> String
Date date = new Date();
System.out.println(date);//Fri Oct 23 09:41:31 CST 2020
// 构造SimpleDateFormat对象, 需要传参 - 格式
// 2020-07-21 16:47:55
// yyyy-MM-dd HH:mm:ss E
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
String str = sf.format(date);
System.out.println(str);//2020-10-23 09:41:31 周五
// ------------------------
// 自行输入日期(String) -> Date 19980228
String s = "19980228";
SimpleDateFormat sf1 = new
SimpleDateFormat("yyyyMMdd");
Date date1 = sf1.parse(s);
System.out.println(date1);//Sat Feb 28 00:00:00 CST 1998
System.out.println(sf.format(date1));//1998-02-28