学习目标

  • 能够说出Object类的特点:
    它是一个类。所以的类都直接或间接的继承了此类。祖宗类。
  • 能够重写Object类的toString方法
    Alt+insert
  • 能够重写Object类的equals方法
    Alt+insert
  • 能够使用日期类输出当前日期
    Date date = new Date();
    System.out.print(date);
  • 能够使用将日期格式化为字符串的方法:
  • DateFormat --> SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
  • 能够使用将字符串转换成日期的方法:
    String format(Date);
    Date parse(String);
  • 能够使用Calendar类的get、set、add方法计算日期
  • 能够使用System类获取当前系统毫秒值
    long System.currentTimeMillis();
    System.arraycopy(Object src,int s,Object dest,int s,int length);
    exit(0);
  • 退出JVM 能够使用Arrays类的sort方法
    Arrays.sort(数组对象) 给数组进行升序排序
  • 能够使用Arrays类的toString方法
    Arrays.toString(数组对象); 把数组转换为字符串返回

一.Object类

1.Object类介绍(了解)

Object是类层次结构的根类。每个类都使用 Object 作为超类。(所有的类都继承自此类,它是所有类的祖宗类)。

所有对象(包括数组)都实现这个类的方法。

方法

说明

String toString()

返回该对象的字符串表示。

boolean equals(Object obj)

表示其他某个对象是否与此对象“相等”。

2.Object类的toString方法(重点)

需求:输出Student:{name = 迪丽热巴 , age = 18}

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

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.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;
    }


    //Ctrl + Alt + L 格式化代码
    /*public String toString() {
        return "Student:{name=" + name + ",age=" + age + "}";
    }*/

    //Alt + insert 生成toString的快捷键
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

重点记忆

1.直接打印对象的名字,会默认调用对象的toString方法

2.Object类的toString方法,默认打印对象的地址值

3.重写toString方法快捷键 alt+insert 选择 toString方法

3.Object类中的equals方法(重点)

==和equals的用法:

基本数据类型比较: == (基本类型变量比较值。引用类型比地址值。)

字符串比较使用: equals () (比较字符串的内容。)

/*
       ==:
            基本类型变量比较值。 int a=10,b=10; a==b  true
            引用类型比地址值。  "abc"=="abc"
       equals:
            比较字符串的内容。
            注意:字符串比较要使用equals
 */
public class TestEuqals {
    public static void main(String[] args) {

        int a = 10,b = 10;
        System.out.println(a==b);//true

        String s1 = "abc";
        String s2 = "abc"; // s2 = s1;
        //对于字符串类型数据,有个常量池概念
        System.out.println(s1==s2); //true

        String s3 = new String("abc");
        String s4 = new String("abc");

        //因为强制创建了2个对象,所以没有常量池的使用,所以比较的是地址值,结果为false
        // System.out.println(s3==s4); //false

        //String类的equals方法是把2个字符串的每个字符进行比较,所以比较的是内容。
        System.out.println(s3.equals(s4)); //true
        System.out.println(s1.equals(s3)); //true
    }
}

重写equals方法

需求:比较2个学生对象是否相等(对比之前需要重写equals方法)

代码实现:

import java.util.Random;

public class TestEquals2 {
    public static void main(String[] args) {
        //创建2个学生对象
        Student stu1 = new Student("古力娜扎", 18);
        Student stu2 = new Student("古力娜扎", 18);

        //引用类型:==比较的是地址值,所以结果为false
        // System.out.println(stu1==stu2); //false
        /*
            public boolean equals(Object obj) {
                return (this == obj);
            }
            this:代表本类对象的引用。
            obj:代表参数对象的引用。
        */
        //Random r = new Random();
        //System.out.println(stu1.equals(r)); //false

        //重写Object对象的equals方法后
        System.out.println(stu1.equals(stu2)); //true

       /* String s1 = null; // "" null
        String s2 = "abc";
        System.out.println(s1.equals(s2)); //会抛异常  NullPointerException空指向异常*/
    }
}

重点记忆

1.没有重写Object类的equals方法,默认比较两个对象的地址值

2.会使用快捷键 alt+insert equals() and hashCode()重写equals方法,比较两个对象的属性

4.native本地方法

native修饰的方法: 表示这个方法不是java语言实现的
调用的是其他语言编写的代码或者操作系统底层的代码,看不到具体的方法
也就意味着Java可以和其它的编程语言进行交互。

Object类:
public native int hashCode();
public final native Class<?>getClass();

二.Date类

为什么要使用Date类?

String date1 = “2020-10-18”;
String date2 = “2020-10-28”;
date2 - date1 不行。
所以我们要学习Date类。

Date 类表示特定的瞬间,精确到毫秒。

它允许把日期解释为年、月、日、时、分和秒值。

年:正常年份值

月: 0 至 11 整数表示;0 是一月、1 是二月等等;因此 11 是十二月。

日:1 至 31 表示。(一月中的某天)。

时:0至23

分:0至59

秒:0至59

周:0至6 0周日

1.毫秒值的概念和作用(了解-扩展)

1秒=1000毫秒 1 天 = 24 × 60 × 60 = 86400 秒 = 86400 * 1000 = 86400000毫秒
时间原点:0毫秒的时间点
1970 年 1 月 1 日 00:00:00 英国格林威治的时间(世界标准时间)
中国:东八区标准时间+8个小时的时差
1970 年 1 月 1 日 08:00:00
把当前日期和时间转换为毫秒值:就是当前时间和时间原点的一个差值
当前时间(2020年8月10日 11:21:33)-时间原点(1970 年 1 月 1 日 00:00:00) =1597029762998

2.Date类的构造方法和成员方法(重点)

构造方法摘要

说明

Date()

分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。

Date(long date)

1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。

long getTime()

返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

代码展示:

import java.util.Date;

/*
    Date类:是一个日期类

    构造方法:
        Date();
        Date(long l);

     long getTime(); 得到1970-1-1 00:00:00 到当前系统时间的时间毫秒值
 */
public class TestDate {
    public static void main(String[] args) {
       method2();
    }

    /*
        long getTime(); 得到1970-1-1 00:00:00 到当前系统时间的时间毫秒值
     */
    private static void method3() {
        Date date = new Date();
        System.out.println(date.getTime());  //1602990270976
    }

    /*
        Date(long l); 有参构造 参数是毫秒值
        CST: 中国标准时间
     */
    public static void method2(){
        //创建Date日期对象
        Date date = new Date(1602990270976L);
        System.out.println(date); //Sun Oct 18 10:59:40 CST 2020
    }

    /*
        Date(); 无参构造
        CST: 中国标准时间
     */
    public static void method1(){
        //创建Date日期对象
        Date date = new Date();
        System.out.println(date); //Sun Oct 18 10:59:40 CST 2020
    }
}

三.DateFormat类

1.DateFormat类介绍(了解)

DateFormat作用:

  • 格式化(也就是日期 -> 文本)
  • 解析(文本-> 日期)

方法

说明

String format(Date date)

参数传递Date日期,把日期格式化为符合模式的字符串

Date parse(String source)

参数传递字符串,把符合模式的字符串解析为Date日期

DateFormat类本身还是一个抽象类,无法直接创建对象使用,需要使用DateFormat类的子类创建对象使用
java.text.SimpleDateFormat extends DateFormat类
SimpleDateFormat类的构造方法:
SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
参数:
String pattern:传递日期和时间的模式 在模式中写y代表年
在模式中写M代表月
在模式中写d代表日
在模式中写H代表时
在模式中写m代表分
在模式中写s代表秒
“yyyy-MM-dd HH:mm:ss” “2020-08-10 11:56:03”
“yyyy年MM月dd日 HH时mm分ss秒”
“yyyy/MM/dd HH:mm:ss”
注意:
1.表示模式的字母不能随便写(y代表年,M代表月…),表示年月日时分秒的连接符号可以随意写(-,/…)
2.表示模式的字母严格区分大小写

2.SimpleDateFormat类的常用方法(重点)

代码展示:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/*
    DateFormat类:它是一个抽象类。不能new
        String format(Date date)  将日期转成字符串格式。
        Date parse(String source) 将字符串转成日期格式。

    SimpleDateFormat是DateFormat的子类。
 */
public class TestDateFormat {
    
    public static void main(String[] args) throws ParseException {
        method2();
    }

    /*
        Date parse(String source) 将字符串转成日期格式。
     */
    public static void method2() throws ParseException {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入日期(yyyy-MM-dd):");
        String d = sc.next(); // 2020-10-18

        //创建SimpleDateFormat对象,把字符串转换为日期类型
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(d);

        System.out.println(date); //Sun Oct 18 00:00:00 CST 2020

    }

    /*
        SimpleDateFormat(String pattern)
          用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。

        new SimpleDateFormat(pattern);
        参数:
            String pattern:传递日期和时间的模式
            在模式中写y代表年
            在模式中写M代表月
            在模式中写d代表日
            在模式中写H代表时
            在模式中写m代表分
            在模式中写s代表秒
     */
    public static void method1(){
        //创建日期对象
        Date date = new Date();
        System.out.println(date);

        //使用SimpleDateFormat对象,把日期转换为字符串格式输出
        // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
        String d = sdf.format(date);// 将日期转成字符串格式。

        System.out.println(d); //2020年10月18日 11:20:21
    }
}

四.Calendar类

1.Calendar类介绍&创建对象的方式(重点)

  • 概述:
    Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR 等 日历字段之间的转换提供了一些方法。
  • 创建对象:

对象表示的是系统当前时间 :
Calendar c = Calendar.getInstance();

示例:

import java.util.Calendar;

public class TestCalender {
    public static void main(String[] args) {
        //创建日历对象
        Calendar c = Calendar.getInstance();
        System.out.println(c);
    }
}

输出结果:

java.util.GregorianCalendar[time=1603003120822,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=“Asia/Shanghai”,offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH=9,WEEK_OF_YEAR=43,WEEK_OF_MONTH=4,DAY_OF_MONTH=18,DAY_OF_YEAR=292,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=38,SECOND=40,MILLISECOND=822,ZONE_OFFSET=28800000,DST_OFFSET=0]

  • 常用方法:

方法

说明

int get(int field)

获取某个字段的值

void set(int field,int value)

设置某个字段的值

void add(int field,int amount)

偏移某个字段的值(在原有的基础上加减)

2.Calendar类中的常用成员方法(重点)

/*
    Calendar类中的常用成员方法(重点)
        int get(int field)  获取指定日历字段的值
        void set(int field, int value) 将给定的日历字段设置为给定值
        void add(int field, int amount) 把指定的日历字段,增加|减少指定的值
        
    以上这些方法的参数(int field),传递指定的日历字段,这些字段在Calendar类中被定义为了常量
        年:public final static int YEAR = 1;
        月:public final static int MONTH = 2;
        日:public final static int DATE = 5;
        日:public final static int DAY_OF_MONTH = 5;
        时:public final static int HOUR = 10;
        分:public final static int MINUTE = 12;
        秒:public final static int SECOND = 13;
        星期:public final static int DAY_OF_WEEK = 7;
 */
package com.itheima.demo6Calendar;

import java.util.Calendar;

public class TestCalender {
    public static void main(String[] args) {
        show4();
    }

    //void add(int field,int amount) 在原有的基础上加/减
    private static void show4() {
        Calendar c = Calendar.getInstance();
        //处理年
        c.add(Calendar.YEAR,-1);
        //处理月份
        c.add(Calendar.MONTH,2);
        //处理日
        c.add(Calendar.DATE,25);

        //得到年
        int year = c.get(Calendar.YEAR);
        System.out.println(year+"年");

        //得到月
        int month = c.get(Calendar .MONTH);
        System.out.println((month+1)+"月");

        //得到日
        int date = c.get(Calendar.DATE);
        System.out.println(date+"日");
    }

    //void set(int field,int value)设置某个字段的值
    private static void show3() {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR,8888);
        c.set(Calendar.MONTH,11);
        c.set(Calendar.DATE,35);

        System.out.println(c.get(Calendar.YEAR)+"年");
        System.out.println((c.get(Calendar.MONTH)+1)+"月");
        System.out.println(c.get(Calendar.DATE)+"日");
    }

    //get方法获取日历字段的数据
    /*
        get方法的参数:
            public final static int YEAR = 1; 年
            public final static int MONTH = 2; 月
            public final static int DATE = 5; 日
            public final static int DAY_OF_MONTH = 5;
            public final static int DAY_OF_WEEK = 7; 星期  0~6
            public final static int DAY_OF_WEEK_IN_MONTH = 8; 本月的第几周
            public final static int HOUR = 10;
            public final static int MINUTE = 12;
            public final static int SECOND = 13;
     */
    private static void show2() {
        //创建日历对象
        Calendar c = Calendar.getInstance();
        //得到年
        int year = c.get(Calendar.YEAR);
        System.out.println(year+"年");

        //得到月
        int month = c.get(Calendar .MONTH);
        System.out.println((month+1)+"月");

        //得到日
        int date = c.get(Calendar.DATE);
        System.out.println(date+"日");

        //得到时分秒
        //System.out.println(c.get(Calendar.HOUR)+"时"+c.get(Calendar.MINUTE)+"分"+c.get(Calendar.SECOND)+"秒");
        System.out.println(c.get(Calendar.HOUR_OF_DAY)+"时"+c.get(Calendar.MINUTE)+"分"+c.get(Calendar.SECOND)+"秒");

        System.out.println("星期:"+(c.get(Calendar.DAY_OF_WEEK)-1));

        System.out.println(c.get(Calendar.DAY_OF_WEEK_IN_MONTH));
    }

    //创建日历对象
    public static void show1(){
        //创建日历对象
        Calendar c = Calendar.getInstance();
        System.out.println(c);
    }
}

五.Arrays类(重点)

  • 概述:
  • Arrays是数组的工具类,里面有一些和数组相关的方法,工具类是为了当做工具给程序员使用的,所以工具类中的方法全都是静态方法。
  • 常用方法:

方法

说明

static void sort(数组)

排序

static String toString(数组)

把数组转成字符串

  • 示例代码
import java.util.Arrays;

/*
	java.util.Arrays类:操作数组的工具类
        里边的方法都是静态的,通过类名.方法名可以直接使用
    常用方法:
        static void sort(Object[] a) 根据元素的自然顺序对指定对象数组按升序进行排序。 升序:12345  降序:54321
        static String toString(Object[] a) 遍历数组,把数组中的元素,按照格式拼接为字符串返回
 */
public class TestArrays {
    public static void main(String[] args) {
        int[] arr = {1,3,5,4,2};
        //要求输出的结果为: [1,3,5,4,2]
        String s = Arrays.toString(arr);
        System.out.println(s);

        String[] str = {"aa","dd","ac","bb","哈","AA","12","df"}; //根据ASCII码表进行排序的。
        System.out.println(Arrays.toString(str));

        //sort方法
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));

        Arrays.sort(str);
        System.out.println(Arrays.toString(str)); // ["12","AA","aa","ac","bb","dd","df"]

    }
}

六.System类(重点)

  • 概述:
    System也是一个工具类,类中的所有方法都是静态方法,方便调用。
  • 常用方法:

方法

说明

static void exit(int status)

退出虚拟机

static long currentTimeMillis()

获取当前时间毫秒值

static void arraycopy(五个参数)

数组内容拷贝

  • 示例代码:
import java.util.Arrays;

/*
    System 类包含一些有用的类字段和方法。它不能被实例化。 提供了静态方法,所以我们称之为工具类。
        static void exit(int status) 终止当前正在运行的 Java 虚拟机。
            参数0:正常停止虚拟机
            非0:异常退出。
            
        static long currentTimeMillis() 返回以毫秒为单位的当前时间。
            等价: new Date().getTime();返回1970-1-1 00:00:00到当前时间的毫秒值
            
        static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
            从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
            参数:
                src - 源数组。
                srcPos - 源数组中的起始位置。
                dest - 目标数组。
                destPos - 目标数据中的起始位置。
                length - 要复制的数组元素的数量。

 */
public class TestSystem {
    public static void main(String[] args) {
        show3();
    }

    //static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    //把src数组中的前3个值,复制到dest数组的前3个。
    private static void show3() {
        int[] src = {1,2,3,4,5,6,7}; //源数组

        //int[] dest = {6,7,8,9,0}; //目标数组

        int[] dest = new int[src.length];

        // System.out.println("复制前:"+Arrays.toString(dest)); //[6,7,8,9,0]
        // System.arraycopy(src,0,dest,0,3);
        // System.out.println("复制后:"+Arrays.toString(dest)); //[1,2,3,9,0]

        System.out.println("复制前:"+Arrays.toString(dest)); //[6,7,8,9,0]
        System.arraycopy(src,0,dest,0,dest.length);
        System.out.println("复制后:"+Arrays.toString(dest));
    }

    //static long currentTimeMillis() 返回以毫秒为单位的当前时间。
    //统计当前方法执行的时间
    private static void show2() {
        long s = System.currentTimeMillis();
        System.out.println("执行前:"+s);
        for (int i = 0; i < 100000; i++) {

        }
        long e = System.currentTimeMillis();
        System.out.println("执行后:"+e);

        System.out.println("使用了:"+(e-s));
    }

    //static void exit(int status) 终止当前正在运行的 Java 虚拟机。
    public static void show1(){
        while (true){
            System.out.println("我想找一个漂亮的女朋友");
            System.exit(0);
        }
        //System.out.println("其实并不难~");
    }
}