2021-03-11:java第14天:Object类、DateFormat类介绍及使用

1.Object类里的toString方法

package Part2;

public class Person {
    private String name;
    private int 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;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
    //直接打印对象的地址值没有意义,需要重写Object类的toString方法


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

package Part2;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/*
 java.lang.Object 类
 类 Object 是类层次结构的根(最顶层)类。每个类都使用Object 作为父类
 所有对象包括数组都实现这个方法
 */
public class demo01ToString {
    public static void main(String[] args) {
        /*
        Person 类默认继承Object类,所以可以使用Object类中的ToString
        String toString() 返回该对象的字符串表示
         */
        Person p = new Person("张三",18);
        String s = p.toString();
        System.out.println(s);//Part2.Person@6d03e736
        //直接打印对象的名字,就是调用对象的toString方法
        System.out.println(p);
        //获取对象的地址值

        /*
        看一个类是否重写了toString方法,直接打印这个类对应对象的名字即可
        如果没有重写toString,那么打印的就是对象的地址值
        如果重写了toString,那么就按照重写的方式打印
         */
        Random r = new Random();
        System.out.println(r);
        //java.util.Random@7291c18f

        Scanner sc =new Scanner(System.in);
        System.out.println(sc);
        //java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\x{2c}][decimal separator=\x{2e}][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\QNaN\E][infinity string=\Q∞\E]

        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        System.out.println(list);
        //[1, 2]
    }
}



 

2.Object类的equals方法

package Part2.Day_1;

public class demo02Equals {
    public static void main(String[] args) {
        /*
        Person类默认继承了Object类,所以可以使用Object的equals方法
        boolean equals(Object obj) 指示其他某个对象是否与此对象相等

        public boolean equals(Object obj) {
        return (this == obj);
    }
        方法体:
        == : 比较运算符,返回的就是一个布尔值 true false
        基本数据类型比较的是值
        引用数据类型比较的是两个对象的地址值
        this是谁?那个对象调用的方法,方法中的this就是那个对象;

         */
        Person p1 = new Person("迪丽热巴",18);
        Person p2 = new Person("古力娜扎",18);
        boolean b = p1.equals(p2);//这里比较的是两个对象的地址值是否相等
        System.out.println(b);
    }
}

3.Objects类的equals方法

package Part2.Day_1;

import java.util.Objects;

public class demo03Objects {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        boolean b = s1.equals(s2);
        System.out.println(b);//true

        String s3 = null;
        boolean c = s1.equals(s3);
        //false

        //boolean d = s3.equals(s1);
        //NullPointerException null是不能调用方法的,会抛出空指针异常

        System.out.println(c);

        boolean e = Objects.equals(s1,s3);
        System.out.println(e);
        /*
        Objects类的equals方法,对两个对象进行比较,防止空指针异常
        public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
        }
         */
    }
}

4.重写Object类的equals方法

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

    Object类的equals方法默认比较两个对象地址值没有意义,
    所以我们需要重写equals方法,比较两个对象的属性值,name age
    一样返回true,不一样返回false
    问题:
    隐含多态
    Object obj = p2 = new Person("古力娜扎",18)
    多态弊端,无法使用子类特有的内容(属性,方法)
    解决办法:向下转型(强转) Object类型变成Person类型
     */

    @Override
    public boolean equals(Object o) {
        /*
        增加一个判断,是Person类型再转换,防止类型转换异常
         */
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        boolean b = false;
        if(o instanceof Person){
            Person person = (Person) o;
             b = age == person.age && Objects.equals(name, person.name);
        }
        return b;
    }


    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

 

5.Date类

package Part2.Day_1.demo02;
/*
    java.util.Date:表示日期和时间的类
    类 Date 表示特定的瞬间,精确到毫秒
    毫秒:千分之一秒

    毫秒值的作用,可以对时间和日期进行计算
    2099-01-03 到 2088-01-01 中间有多少天
    日前转换成毫秒,计算完毕再转换成日期

    把日期转换成毫秒:
        当前的日期:2088-01-01
        时间原点(0毫秒) 1970年1月1日 00:00:00(英国格林威治时间)
        中国是东八区,时间增加8个小时
        1970年1月1日 08:00;00

        毫秒转化成日期
 */
public class demo01Date {
    public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());
        //获取当前系统一共到1970年1月1日 00:00:00经历了多少毫秒 long类型

    }
}

 

Date类的构造方法和成员方法

package Part2.Day_1.demo02;

import java.util.Date;

public class demo02Date {
    public static void main(String[] args) {
        demo01();
        demo02();
        demo03();
    }
    /*
        Date类的成员方法
        long gettime()把日期转换为毫秒,相当于System.currentTimeMillis()

     */
    private static void demo03(){
        Date date = new Date();
        long time = date.getTime();
        System.out.println(time);
    }
    /*
        Date类的带参数构造方法
            Date(long date):传递毫秒值,把毫秒转换为Date日期

     */
    private static void demo02(){
        Date d1 = new Date(0L);
        System.out.println(d1);//Thu Jan 01 08:00:00 CST 1970
    }
    /*
        Date类的空参数构造方法
            Date() 获取的就是当前系统的日期和时间
     */
    private static void demo01(){
        Date date = new Date();
        System.out.println(date);
        //Fri Mar 12 00:13:34 CST 2021
    }
}

6.DateFormat类的format方法和parse方法

package Part2.Day_1.demo02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
    java.text.DateFormat:是日期/时间格式化子类的抽象类
    作用:
        格式化(日期->文本)、解析(文本->日期)
    成员方法;
        String format(Date date) 按照指定的模式,把Date日期,格式化为符合模式的字符串
        Date parse(String source) 把复合模式的字符串,解析为Date日期
        DateFormat是抽象类,只能用它的子类

        java.text.SimpleDateFormat extends DateFormat

        构造方法:
        SimpleDateFormat(String pattern)
        String pattern:传递对应指定的模式
        区分大小写:
        y 年
        M 月
        d 日
        H 时
        m 分
        s 秒
        “yyyy-MM-dd HH:mm:ss”
        “yyyy年MM月dd日 HH时mm分ss秒”

        注意:
        模式中的字母是不能更改的,连接模式的符号可以改变
 */
public class demo03DateFormat {
    public static void main(String[] args) throws ParseException {
        demo01();
        demo02();
    }
    public static void demo01(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date();
        String text = sdf.format(date);
        System.out.println(text); //2021-03-12 00:32:58
        System.out.println(date); //Fri Mar 12 00:32:58 CST 2021
    }
    // Date parse(String source)把符合模式的字符串,解析为Date日期
    public static void demo02() throws ParseException {
        SimpleDateFormat sdf =new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        /*
        public Date parse (String source) throws ParseException
        注意:parse方法声明了一个异常叫ParseException解析异常
        如果字符串和构造方法种的模式不一样,那么程序就会抛出此异常
        调用一个抛出了异常的方法,就必须处理这个异常,要么throws继续声明抛出这个异常,要么try...catch,自己处理这个异常

         */
        Date date = sdf.parse("2088年08月08日 17时01分10秒");
    }

}

练习:计算一个人出生了多少天

package Part2.Day_1.demo02;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/*
练习:使用时间相关的API,计算出一个人已经出生了多少天
分析:
1.使用Scanner类中的方法next,获取出生日期
2.使用DateFormat类中的方法parse,把字符串的出生日期解析为Date格式
3.把Date格式的出生日期变成毫秒
4.获取当前日期
5.减去
6转换成天
 */
public class Demo02Test {
    public static void main(String[] args) throws ParseException {
        Scanner sc = new Scanner(System.in);
        System.out.println("出生日期格式: yyyy-MM-dd");
        String birth = sc.next();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date birthDate = sdf.parse(birth);
        long birthtime = birthDate.getTime();
        long todaytime = new Date().getTime();
        long daytime = todaytime-birthtime;
        System.out.println(daytime/1000/60/60/24);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤实现: 1. 将时间段字符串转换为日期型,并设置起始时间为当的0点,结束时间为当的23点59分59秒。 ```java DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String timeStr = "【2020-11-20 09:09:09,2021-10-09 10:10:10】"; String startTimeStr = timeStr.substring(1, 20) + "00:00:00"; String endTimeStr = timeStr.substring(23, 43) + "59:59:59"; Date startDate = dateFormat.parse(startTimeStr); Date endDate = dateFormat.parse(endTimeStr); ``` 2. 利用起始时间和结束时间获取时间段中每一的起始时间和结束时间。 ```java Calendar startCalendar = Calendar.getInstance(); startCalendar.setTime(startDate); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endDate); List<String> dayList = new ArrayList<>(); while (startCalendar.before(endCalendar)) { String dayStartStr = dateFormat.format(startCalendar.getTime()); String dayEndStr = dayStartStr.substring(0, 11) + "23:59:59"; dayList.add(dayStartStr); dayList.add(dayEndStr); startCalendar.add(Calendar.DAY_OF_MONTH, 1); } dayList.add(dateFormat.format(endCalendar.getTime())); ``` 3. 最后得到的dayList列表中,依次存放的是时间段中每一的起始时间和结束时间。 完整代码如下: ```java import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; public class Main { public static void main(String[] args) throws Exception { DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String timeStr = "【2020-11-20 09:09:09,2021-10-09 10:10:10】"; String startTimeStr = timeStr.substring(1, 20) + "00:00:00"; String endTimeStr = timeStr.substring(23, 43) + "59:59:59"; Date startDate = dateFormat.parse(startTimeStr); Date endDate = dateFormat.parse(endTimeStr); Calendar startCalendar = Calendar.getInstance(); startCalendar.setTime(startDate); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endDate); List<String> dayList = new ArrayList<>(); while (startCalendar.before(endCalendar)) { String dayStartStr = dateFormat.format(startCalendar.getTime()); String dayEndStr = dayStartStr.substring(0, 11) + "23:59:59"; dayList.add(dayStartStr); dayList.add(dayEndStr); startCalendar.add(Calendar.DAY_OF_MONTH, 1); } dayList.add(dateFormat.format(endCalendar.getTime())); for (String day : dayList) { System.out.println(day); } } } ``` 输出结果如下: ``` 2020-11-20 00:00:00 2020-11-20 23:59:59 2020-11-21 00:00:00 2020-11-21 23:59:59 2020-11-22 00:00:00 2020-11-22 23:59:59 ... 2021-10-08 00:00:00 2021-10-08 23:59:59 2021-10-09 00:00:00 2021-10-09 23:59:59 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值