JavaSE学习笔记 - Object类、日期类
Object
- Object 类是 Java 中所有类的超类,Java 中每个类都是由 Object 这个类拓展而来的。可以使用 Object 类型的变量引用任何类型的对象。
- Object是类层次结构的根类,每个类都是使用 Object 类作为超类。Object 可以对 toString() 和 equals() 方法。我们在打印对象的时候打印是对象调用 toString() 的结果。
toString() 的重写:toString() 源码 :toString() 方法默认返回结果是地址值,但是在开发中,我们常常需要查看对象属性的字符串形式,所以我们可以重写 toString() 以字符串的形式来输出对象的属性。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
//hashCode,这个方法针对不同的对象返回不同的对象,每一个对象都有一个唯一的哈希值
//Integer.toHexString,获取哈希值的16进制
//getClass().getName,获取类名
//getClass(),获得一个类的类对象
}
package cn.edu.zut;
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
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;
}
}
package cn.edu.zut;
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setAge(18);
person.setName("aaa");
System.out.println(person.toString());//未重写toString:cn.edu.zut.Person@1b6d3586
System.out.println(person.toString());//重写toString:Person{name='aaa', age=18}
}
}
finalize(): 用于垃圾回收,不需要手动调用,要有 JVM 来调用,垃圾回收器确定不存在这个对象的引用的时候,对象的垃圾回收期调用这个方法。Java 中的垃圾回收器不是轻易启动的,垃圾太少或者时间没有到,有可能启动,有可能不启动。垃圾回收器在回收某一个对象的时候就会调用这个对象的 finalize 方法。\(System.gc\) 可以告知 JVM 尽量回收资源,但是也不一定启动。
equals(): 在Object 中是用于检测一个对象是否等于另外一个对象。Object 类中实现的 equals 方法是比较两个对象的引用是否相同,如果我们重写 equals 方法,就可以对对象的属性进行比较。
==: 基本数据类型比较的是值,引用类型比较的是地址。基本数据类型是在栈中,直接比较值,基本数据类型有自己的默认值;引用类型变量空间存储的是一个地址,在进行比较的时候比较的就是地址,引用数据类型默认值是 null。
public boolean equals(Object obj) {
return (this == obj);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
//判断传过来的是否是Person类型,相当于o instanceof Person
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;//如果是,则转换成真身
return age == person.age && Objects.equals(name, person.name);
}
Objects 类
- 在 JDK 7 中,新添加了一个工具类 Objects 类,通过 equals 方法可以解决 Object 类中的空指针异常。
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
Date
package untitled;
import java.util.Date;
public class Main {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);//Thu Jul 23 18:22:54 CST 2020
long time = System.currentTimeMillis();
Date date1 = new Date(time);
System.out.println(date1.getTime());//1595499774478
System.out.println(time);//1595499774478
System.out.println(date1);//Thu Jul 23 18:22:54 CST 2020
Date date2 = new Date(time - 24 * 60 * 60 * 1000);
System.out.println(date2);//Thu Jul 23 18:22:54 CST 2020
}
}
SimpleDateFormat
package untitled;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(date);
System.out.println(str);//2020-07-23 18:25:07
Date date1 = sdf.parse(str);
System.out.println(date1);//Thu Jul 23 18:25:07 CST 2020
}
}
Calendar
package untitled;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException {
//Calendar calendar = new GregorianCalendar(2020, 7, 23);
//Calendar calendar = new GregorianCalendar();
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year + " " + month + " " + day);//2020 6 23
calendar.set(Calendar.MONTH, 7);
System.out.println(calendar);
calendar.add(Calendar.DAY_OF_MONTH, 1);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//1
Date date = calendar.getTime();
System.out.println(date);//Mon Aug 24 18:35:51 CST 2020
calendar.setTime(new Date());
System.out.println(calendar);//2020.6.23
}
}
LocalDate
import java.time.DayOfWeek;
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
System.out.println(date);//2020-07-30
date = LocalDate.of(2020, 1, 1);
int year = date.getYear();
int month = date.getMonthValue();
int day = date.getDayOfMonth();
DayOfWeek week = date.getDayOfWeek();
System.out.println(year + "-" + month + "-" + day + " 星期" + week.getValue());//2020-1-1 星期3
//在date基础上增加30天
LocalDate date1 = date.plusDays(31);
LocalDate date2 = date1.minusDays(31);//
System.out.println(date1);//2020-02-01 之后的31天
System.out.println(date2);//2020-01-01 之前的31天
}
}