1、Object类

  • java.lang.Object类是java语言中的根类,即所有类的父类(超类),它描述的方法,其子类均可用。
toString方法
  • public String toString() :返回该对象的字符串表示,该字符串内容为对象的类型+@+内存地址。
  • 直接打印对象的名字时,其实就是在调用对象的toString方法,若输出为地址值,则说明该对象没有重写toString方法。
  • 在IDEA中定义类时,可用快捷键覆盖重写toString方法:alt+insert—>toString()。
public static void main(String[] args) {
        //直接打印对象,来判断一个类是否重写了toString方法
        Scanner sc =new Scanner(System.in);
        System.out.println(sc); // 非地址,重写了toString方法

        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        System.out.println(list); //[1, 2, 3],重写了toString方法
    }
public class Person {
    private String name;
    private int age;

    @Override
    public String toString() {  // alt+insert—>toString()
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
equals方法
  • public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
  • 如果没有覆盖重写equals方法,那么Object类中默认进行“==”运算符的对象地址比较,只要不是同一对象,结果必然为false。
  • 如果希望进行对象的内容的比较,即所有或指定的部分成员变量相同,就判定两个对象相同,则可以覆盖重写equals方法。
  • IDEA中的覆盖重写equals方法的快捷键:alt+insert—>equals() and hashCode()—>next—>next
import java.util.Objects;

public class Person {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {  // alt+insert—>equals() and hashCode()
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);  // Objects类的equals方法是空指针安全的
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
Objects类
  • java.util.Objects类是JDK7添加的Objects工具类,提供一些方法来操作对象,由一些静态方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashCode、返回对象的字符串式形式、比较两个对象。
  • 在比较两个对象时,Object类的equals方法容易抛出空指针异常,而Objects类的equals方法优化了这个问题
public static boolean equals(Object a, Object b){
        return (a==b)||(a!=null&&a.equals(b));  //就算a,b有空,也不会出现异常。
    }

2、日期时间类

Date类
  • java.util.Date类 表示特定的瞬间,精确到毫秒。(1000毫秒=1秒)
  • 毫秒值的作用:对时间和日期进行计算
  • 构造方法:
    public Date():分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)
    public Date(long date):分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。(中国处于东八区,所以我们的基准时间为1970年1月1日8时0分0秒。)
  • 成员方法:
    public long getTime() 把日期对象转换成对应的时间毫秒值。
import java.util.Date;

public class DateDemo {
    public static void main(String[] args) {
        // 创建日期对象,把当前的时间
        System.out.println(new Date()); // Wed Apr 01 20:06:49 CST 2020
        // 创建日期对象,把当前的毫秒值转成日期对象
        System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
    }
}
DateFormat类
  • java.text.DateFormat 是日期/时间格式化子类的抽象类,通过这个类可以完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
  • 格式化:按照指定的格式,从Date对象转换为String对象。解析:按照指定的格式,从String对象转换为Date对象。
  • 构造方法:
  • public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
  • 由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat。
  • 这个类需要一个**模式(格式)**来指定格式化或解析的标准。
  • 参数pattern是一个字符串,代表日期时间的自定义格式。(y年,M月,d日,H时,m分,s秒)
  • 成员方法:
    public String format(Date date):将Date对象格式化为字符串。
    public Date parse(String source):将字符串解析为Date对象。
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo {
    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //DateFormat是抽象类不能直接创建,使用SimpleDateFormat(String pattern)构造方法
        Date date = new Date();  //创建一个Date对象
        System.out.println(date); // Wed Apr 01 20:18:24 CST 2020
        String d = sdf.format(date);  //格式化
        System.out.println(d);  // 2020-04-01 20:18:24
    }
}
  • 解析方法的注意事项:
  • public Date parse(String source) throws ParseException
  • parse方法声明了一个异常叫ParseException,如果字符串和构造方法的模式不一样,则程序会抛出异常,调用了一个抛出异常的方法,就必须处理这个异常,要么throws继续抛出异常,要么try catch自己处理。
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo2 {
    public static void main(String[] args) throws ParseException {  // 需要抛出异常
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //多态写法
        String s = "2030-10-14 00:00:00";  //格式与构造方法中格式相同,否则有ParseException
        Date date = df.parse(s);  //解析
        System.out.println(date); // Mon Oct 14 00:00:00 CST 2030
    }
}
练习
  • 使用日期时间相关的API,计算出一个人已经出生了多少天。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class DateExcise {
    public static void main(String[] args) throws ParseException {  //有parse就要抛出异常
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入出生日期,格式为:yyyy-MM-dd");
        String s = sc.next();  //输入字符串日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //模式不要忘记
        Date date = sdf.parse(s);  //字符串解析为Date
        long birthdayTime = date.getTime();  //将Date转换为毫秒值。用于计算
        long todayTime = new Date().getTime();  //获取当前时间的毫秒值
        long time = todayTime - birthdayTime;  //相减
        System.out.println(time/1000/60/60/24);  //单位转换为天
    }
}
Calendar类
  • java.util.Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。
  • Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:
    Calendar静态方法
  • public static Calendar getInstance():使用默认时区和语言环境获得一个日历
  • 常用成员方法:
  • public int get(int field):返回给定日历字段的值。
    (YEAR 年 , MONTH 月(从0开始,可以+1使用)
    ,DAY_OF_MONTH 月中的天(几号)
    ,HOUR 时(12小时制)
    , HOUR_OF_DAY 时(24小时制)
    , MINUTE 分
    ,SECOND 秒
    ,DAY_OF_WEEK 周中的天(周几,周日为1,可以-1使用)
  • public void set(int field, int value):将给定的日历字段设置为给定值。
  • public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  • public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
import java.util.Calendar;
import java.util.Date;

public class CalendarDemo {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();  //使用getInstance方法创建calendar对象
        //set方法
        c.set(Calendar.YEAR, 2030);

        //add方法
        c.add(Calendar.DAY_OF_MONTH, 2); // 加2天
        c.add(Calendar.YEAR, -3); // 减3年
        // c.set(2030,11,22); //set的重载方法

        //get方法
        int year = c.get(Calendar.YEAR); // 设置年
        int month = c.get(Calendar.MONTH) + 1; // 设置月(国外月份为0——11)
        int dayOfMonth = c.get(Calendar.DAY_OF_MONTH);// 设置日
        System.out.println(year + "年" + month + "月" + dayOfMonth + "日"); // 2027年4月3日

        //getTime方法
        Date date = c.getTime();
        System.out.println(date); //Sat Apr 03 21:15:10 CST 2027
    }
}