day03-多态 ,内部类,常用API

今日目标

  • 多态
  • 内部类
  • 常用API

    1 多态

    1.1 面向对象三大特征 ?

  • 封装 , 继承 , 多态

    1.2 什么是多态 ?

  • 一个对象在不同时刻体现出来的不同形态

  • 举例 : 一只猫对象

    • 我们可以说猫就是猫 : Cat cat = new Cat();
    • 我们也可以说猫是动物 : Animal cat = new Cat();
    • 这里对象在不同时刻,体现出来的不同形态 , 我们就可以理解为多态

      1.3 多态的前提

  • 有继承/实现关系

  • 有方法重写
  • 父类的引用指向子类的对象

    1. package com.itheima.polymorphism_demo;
    2. /*
    3. 多态的三个前提条件
    4. 1 需要有继承/实现关系
    5. 2 需要有方法重写
    6. 3 父类的引用指向子类的对象
    7. */
    8. public class AnimalTest {
    9. public static void main(String[] args) {
    10. // 3 父类的引用指向子类的对象
    11. Animal a = new Cat();
    12. }
    13. }
    14. class Animal{
    15. public void eat(){
    16. System.out.println("吃东西");
    17. }
    18. }
    19. class Cat extends Animal{
    20. @Override
    21. public void eat() {
    22. System.out.println("猫吃鱼....");
    23. }
    24. }

    1.4 多态的成员访问特点

  • 构造方法 : 和继承一样 , 子类通过super()访问父类的构造方法

  • 成员变量 : 编译看左边(父类) , 执行看左边(父类)
  • 成员方法 : 编译看左边(父类) , 执行看右边(子类)

    1. package com.itheima.polymorphism_demo;
    2. /*
    3. 多态的成员访问特点 :
    4. 1 构造方法 : 和继承一样 , 都是通过super()访问父类的构造方法
    5. 2 成员变量 : 编译看左边(父类) , 执行看左边(父类)
    6. 3 成员方法 : 编译看左边(父类) , 执行看右边(子类) , 注意 , 如果执行时
    7. 1) 子类没有回动态去找父类中的方法
    8. 2) 子类的特有方法无法进行调用(多态的缺点)
    9. */
    10. public class MemberTest {
    11. public static void main(String[] args) {
    12. // 父类的引用指向子类的对象
    13. Fu f = new Zi();
    14. // 多态对象调用成员变量
    15. System.out.println(f.num);
    16. // 多态对新乡调用调用成员方法
    17. f.show();
    18. // 多态对象不能调用子类特有的方法
    19. // f.show2();
    20. }
    21. }
    22. class Fu {
    23. int num = 100;
    24. public void show() {
    25. System.out.println("父类的show方法");
    26. }
    27. }
    28. class Zi extends Fu {
    29. int num = 10;
    30. public void show() {
    31. System.out.println("子类的show方法");
    32. }
    33. public void show2(){
    34. System.out.println("子类特有的方法");
    35. }
    36. }

    1.5 多态的优缺点

  • 优点 : 提高代码的扩展性

  • 缺点 : 不能调用子类特有的功能

    1. package com.itheima.polymorphism_test;
    2. public abstract class Animal {
    3. private String breed;
    4. private String color;
    5. public Animal() {
    6. }
    7. public Animal(String breed, String color) {
    8. this.breed = breed;
    9. this.color = color;
    10. }
    11. public String getBreed() {
    12. return breed;
    13. }
    14. public void setBreed(String breed) {
    15. this.breed = breed;
    16. }
    17. public String getColor() {
    18. return color;
    19. }
    20. public void setColor(String color) {
    21. this.color = color;
    22. }
    23. public abstract void eat();
    24. }
    1. package com.itheima.polymorphism_test;
    2. public class Cat extends Animal {
    3. public Cat() {
    4. }
    5. public Cat(String breed, String color) {
    6. super(breed, color);
    7. }
    8. @Override
    9. public void eat() {
    10. System.out.println("猫吃鱼...");
    11. }
    12. public void catchMouse() {
    13. System.out.println("抓老鼠...");
    14. }
    15. }
    1. package com.itheima.polymorphism_test;
    2. public class Dog extends Animal {
    3. public Dog() {
    4. }
    5. public Dog(String breed, String color) {
    6. super(breed, color);
    7. }
    8. @Override
    9. public void eat() {
    10. System.out.println("狗吃骨头!");
    11. }
    12. public void lookDoor(){
    13. System.out.println("狗看门...");
    14. }
    15. }
    1. package com.itheima.polymorphism_test;
    2. public class Pig extends Animal {
    3. public Pig() {
    4. }
    5. public Pig(String breed, String color) {
    6. super(breed, color);
    7. }
    8. @Override
    9. public void eat() {
    10. System.out.println("猪拱白菜...");
    11. }
    12. public void sleep() {
    13. System.out.println("一直再睡...");
    14. }
    15. }
    1. package com.itheima.polymorphism_test;
    2. /*
    3. 如果方法的参数是一个类的话 , 那么调用此方法需要传入此类的对象 , 或者子类对象
    4. 多态的好处 :
    5. 提高代码的扩展性 , 灵活性
    6. 多态的缺点:
    7. 不能调用子类的特有功能
    8. */
    9. public class AnimalTest {
    10. public static void main(String[] args) {
    11. useAnimal(new Cat());
    12. System.out.println("---------");
    13. useAnimal(new Dog());
    14. System.out.println("---------");
    15. useAnimal(new Pig());
    16. }
    17. public static void useAnimal(Animal a){// Animal a = new Dog()
    18. a.eat();
    19. // 多态不能访问子类特有的功能
    20. // 如果解决 ?
    21. // 向下转型
    22. if(a instanceof Cat) {
    23. Cat cat = (Cat) a;
    24. cat.catchMouse();
    25. }
    26. if(a instanceof Dog) {
    27. Dog dog = (Dog) a;
    28. dog.lookDoor();
    29. }
    30. if(a instanceof Pig) {
    31. ((Pig) a).sleep();
    32. }
    33. }
    34. // // 定义一个使用猫类的方法
    35. // public static void useAnimal(Cat c) {// Cat c = new Cat();
    36. // c.eat();
    37. // c.catchMouse();
    38. // }
    39. //
    40. // // 定义一个使用狗类的方法
    41. // public static void useAnimal(Dog d) {// Dog d = new Dog();
    42. // d.eat();
    43. // d.lookDoor();
    44. // }
    45. //
    46. // // 定义一个使用猪类的方法
    47. // public static void useAnimal(Pig pig) {
    48. // pig.eat();
    49. // pig.sleep();
    50. // }
    51. }

    1.6 多态的转型

  • 向上转型 : 把子类类型数据转成父类类型数据 Animal a = new Cat();

  • 向下转型 : 把父类类型数据转成子类类型数据 Cat cat = (Cat)a;

    1.7 多态的转型注意

  • 如果被转的对象 , 对应的实际类型和目标类型不是同一种数据类型 , 那么转换时会出现ClassCastException异常

    1. 异常代码如下
    2. public static void main(String[] args) {
    3. Animal a = new Cat();
    4. useAnimal(a);
    5. }
    6. public static void useAnimal(Animal a) {
    7. Dog d = (Dog) a;
    8. d.eat();
    9. }

    1.8 解决转型安全隐患

  • 使用关键字 instanceof

  • 作用 : 判断一个对象是否属于一种引用数据类型
  • 格式 : 对象名 instanceof 引用数据类型

    • 通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果

      2 内部类

      2.1 内部类的分类

  • 什么是内部类 ?

    • 一个A类 中 定义一个B类 , 那么B类就属于A类的内部类 , A类就属于B类的外部类
      1. public class A{ //外部类
      2. public class B{ //内部类
      3. }
      4. }
  • 什么时候使用内部类 ?

    • 多个事物之间有包含关系, 可以使用内部类

  • 内部类分类 ?

    • 成员内部类
    • 局部内部类
    • 匿名内部类

      2.2 成员内部类

  • 定义的位置 : 类中方法外

  • 创建成员内部类对象格式 : 外部类名.内部类名 对象名 = new 外部类名().new 内部类名(参数);

    1. package com.itheima.innerclass_demo.member_innerclass;
    2. // 外部类
    3. public class Person {
    4. // 成员内部类
    5. public class Heart {
    6. // 频率变量
    7. private int rate;
    8. // 跳动方法
    9. public void beats() {
    10. System.out.println("咚咚咚!");
    11. }
    12. }
    13. }
    14. class Test {
    15. public static void main(String[] args) {
    16. // 创建内部类对象
    17. Person.Heart heart = new Person().new Heart();
    18. // 调用内部类中的方法
    19. heart.beats();
    20. }
    21. }
  • 成员内部类访问外部类的成员

    • 在内部类中有代表外部类对象的格式 : 外部类名的.this , 私有的也可以访问
    • 外部类要想访问内部类成员 , 需要创建内部类对象

      1. package com.itheima.innerclass_demo.member_innerclass;
      2. public class Person {
      3. private String name = "张三";
      4. private int num = 10;
      5. // 成员内部类
      6. public class Heart {
      7. int num = 100;
      8. // 频率
      9. private int rate;
      10. // 跳动
      11. public void beats() {
      12. System.out.println("咚咚咚!");
      13. }
      14. // 调用外部类的成员
      15. public void show(){
      16. int num = 1000;
      17. System.out.println(Person.this.name);
      18. System.out.println(num);// 1000 就近原则
      19. System.out.println(this.num);// 100
      20. System.out.println(Person.this.num);// 10
      21. }
      22. }
      23. }
      24. class Test {
      25. public static void main(String[] args) {
      26. Person.Heart heart = new Person().new Heart();
      27. heart.beats();
      28. heart.show();
      29. }
      30. }

      2.3 匿名内部类

  • 匿名内部类 : 没有名字的类 , 一次性产品

  • 使用场景 : 直接调用方法 , 作为方法的传参 , 返回值类型
  • 好处 : 简化代码 , 快速实现接口或者抽象的抽象方法
  • 格式 :
    • new 类名/接口名(){ 重写抽象方法 } 注意 : 此处创建的是子类对象!!!
  • 使用方式 :

    • 直接调用方法
    • 作为方法的参数传递
    • 作为方法的返回值类型
      1. //接口
      2. interface Flyable {
      3. void fly();
      4. }
      1. // 直接调用方法
      2. Flyable f1 = new Flyable() {
      3. @Override
      4. public void fly() {
      5. System.out.println("不知道什么在飞.....");
      6. }
      7. };
      8. f1.fly();
      1. // 作为方法的参数传递
      2. showFlyable(
      3. new Flyable() {
      4. @Override
      5. public void fly() {
      6. System.out.println("不知道什么在飞3333");
      7. }
      8. }
      9. );
      10. public static void showFlyable(Flyable flyable) {
      11. flyable.fly();
      12. }
      1. // 作为方法的返回值类型
      2. public static Flyable getFlyable() {
      3. return new Flyable() {
      4. @Override
      5. public void fly() {
      6. System.out.println("3333333333333");
      7. }
      8. };
      9. }
      1. package com.itheima.innerclass_demo.anonymous_innerclass;
      2. /*
      3. 1 如果方法的参数是一个类的话 , 调用此方法需要传入此类的对象或者此类的子类对象
      4. 2 如果方法的返回值类型是一个类的话 , 需要返回此类的对象 , 或者此类的子类对象
      5. 3 如果方法的参数是一个接口的话 , 调用此方法需要传入此接口的实现类对象
      6. 4 如果方法的返回值类型是一个接口的话 , 需要返回此接口的实现类对象
      7. 匿名内部类 : 代表的就是子类对象!!!
      8. new 类名/接口名(){
      9. 重写抽象类或者接口中的抽象方法
      10. };
      11. 使用方向 :
      12. 1 调用方法
      13. 2 作为方法参数传递
      14. 3 作为方法的返回值
      15. */
      16. public interface Swim {
      17. public abstract void swimming();
      18. }
      19. class Test {
      20. public static void main(String[] args) {
      21. // // 子类对象!!!
      22. // 1 调用方法
      23. // new Swim() {
      24. // @Override
      25. // public void swimming() {
      26. // System.out.println("匿名内部类 , 重写了接口中的抽象方法...");
      27. // }
      28. // }.swimming();
      29. // // 2 作为方法参数传递
      30. // useSwim(new Swim() {
      31. // @Override
      32. // public void swimming() {
      33. // System.out.println("匿名内部类 , 重写了接口中的抽象方法...");
      34. // }
      35. // });
      36. // // 3 作为方法的返回值
      37. // Swim s = getSwim();
      38. // s.swimming();
      39. }
      40. public static Swim getSwim() {
      41. return new Swim() {
      42. @Override
      43. public void swimming() {
      44. System.out.println("匿名内部类 , 重写了接口中的抽象方法...");
      45. }
      46. };
      47. }
      48. /*
      49. Swim swim = new Swim() {
      50. @Override
      51. public void swimming() {
      52. System.out.println("匿名内部类 , 重写了接口中的抽象方法...");
      53. }
      54. };
      55. */
      56. public static void useSwim(Swim swim) {
      57. swim.swimming();
      58. }
      59. }

      3 API

      3.1 Object类

  • 概述 : 类Object是类层次结构的根,每个类都把Object作为超类。 所有对象(包括数组)都实现了这个类的方法

  • 方法 : public String toString()
    • 如果一个类没有重写toString方法 , 那么打印此类的对象 , 打印的是此对象的地址值
    • 如果一个类重写了toString方法 , 那么打印此类的对象 , 打印的是此对象的属性值
    • 好处 : 把对象转成字符串 , 快速查看一个对象的属性值
    • 执行时机 : 打印对象时会默认调用toString方法
  • 方法 : public boolean equals()

    • 如果一个类没有重写equals方法 , 那么比较此类的对象 . 比较的是地址值
    • 如果一个类重写了equals方法 . 那么比较此类的对象 , 比较的是属性值是否相等
    • 好处 : 可以比较对象的内容

      3.2 Objects类

  • Objects是JDK1.7新增的一个对象工具类,里面都是静态方法可以用来操作对象。比如对象的比较,计算对象的hash值,判断对手是否为空….比如里面的equals方法,可以避免空指针异常 ```java public static boolean equals(Object a, Object b):判断两个对象是否相等

public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } a.equals(b) :如果a是null值,肯定会空指针 Objects.equals(a,b);:如果a是null,不会导致空指针异常

  1. <a name="y7FFy"></a>
  2. ### 3.2 Date类
  3. - 概述 : java.util.Date 表示特定的瞬间,精确到毫秒
  4. - 构造方法 :
  5. - public Date(): 创建的对象,表示的是当前计算机系统的时间
  6. - public Date(long time): Date对象 = 1970/1/1 0:0:0 + time毫秒值
  7. - 成员方法 :
  8. - public long getTime(): 返回毫秒值 = 当前Date代表的时间 - 1970/1/1 0:0:0
  9. - public void setTime(long t): Date对象 = 1970/1/1 0:0:0 + time毫秒值
  10. ```java
  11. package com.itheima.api_demo.date_demo;
  12. import java.util.Date;
  13. /*
  14. Date类 : 代表的是一个瞬间 , 精确到毫秒
  15. 构造方法 :
  16. public Date() : 代表的是当前系统时间
  17. public Date(long date) : Date对象 = 1970/1/1 0:0:0 + long类型的毫秒值
  18. 成员方法 :
  19. public void setTime(long date) : Date对象 = 1970/1/1 0:0:0 + long类型的毫秒值
  20. public long getTime() : 返回的是毫秒值 = Date代表的时间 - 1970/1/1 0:0:0
  21. */
  22. public class DateDemo {
  23. public static void main(String[] args) {
  24. // public Date() : 代表的是当前系统时间
  25. // Date d = new Date();
  26. // System.out.println(d);
  27. // public Date(long date) : Date对象 = 1970/1/1 0:0:0 + long类型的毫秒值
  28. // Date d2 = new Date(1000L * 60 * 60 * 24); // 1970/1/1 0:0:0 + 一天的毫秒值
  29. // System.out.println(d2);
  30. Date d = new Date();
  31. // public void setTime(long date) : Date对象 = 1970/1/1 0:0:0 + long类型的毫秒值
  32. // d.setTime(1000L * 60 * 60 * 24);
  33. System.out.println(d);
  34. // public long getTime() : 返回的是毫秒值 = Date代表的时间 - 1970/1/1 0:0:0
  35. // System.out.println(d.getTime());
  36. }
  37. }

3.3 DateFormat类

  • 概述 : 主要用于操作日期格式的一个类
  • 作用 :
    • 格式化 : Date —> String
    • 解析 : String —> Date
  • 构造方法 :
    • SimpleDateFormat(String pattern) 给定日期模板创建日期格式化对象
      image.png
  • 成员方法 :

    • public String format ( Date d ):格式化,将日期对象格式化为字符串
    • public Date parse ( String s ):解析,将字符串解析为日期对象
      package com.itheima.api_demo.dateformat_demo;
      import java.text.ParseException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      /*
      SimpleDateFormat类 :
         "2021年04月03日 16:48:10"  ---> Date
         Date(Sat Apr 03 16:41:38 CST 2021) --> "2021年04月03日 16:48:10"
         作用 :
             格式化 : Date --> String
             解析   : String --> Date
         构造方法 :
             public SimpleDateFormat(String pattern) : pattern : 字符串类型的日期模板
         成员方法 ;
             public final String format(Date date) : 接收一个Date对象返回指定模式的字符串
             public Date parse(String source) : 接收一个字符串  , 返回一个Date对象
         1 获取当前的日期对象,使用格式:yyyy-MM-dd HH:mm:ss 来表示,例如:2020-10-31 17:00:00【格式化】
         2 将字符串的 2020年10月31日  17:00:00,转换为日期Date对象。【解析】
      */
      public class SimpleDateFormatDemo {
      public static void main(String[] args) throws ParseException {
         // 解析   : String --> Date
         String strDate = "2020年10月31日 17:00:00";
         // 注意 : 解析时 , SimpleDateFormat的参数(日期模板) , 必须和要解析字符串的模式匹配
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
         //  public Date parse(String source) : 接收一个字符串  , 返回一个Date对象
         Date date = sdf.parse(strDate);
         System.out.println(date); // Sat Oct 31 17:00:00 CST 2020
      }
      private static void method() {
         // 格式化 : Date --> String
         // 获取当前系统时间
         Date date = new Date();
         // System.out.println(date);// Sat Apr 03 16:53:35 CST 2021
         // public SimpleDateFormat(String pattern) : pattern : 字符串类型的日期模板
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         // public final String format(Date date) : 接收一个Date对象返回指定模式的字符串
         String strDate = sdf.format(date);
         System.out.println(strDate);
      }
      }
      

      3.4 Calendar类

  • 概述 :

    • java.util.Calendar类表示日历,内含有各种时间信息,以及获取,计算时间的方法。
    • Calendar本身是一个抽象类,可以通过Calendar提供的静态方法getInstance日历子类对象
  • Calendar常用方法 : | 方法名 | 说明 | | —- | —- | | public static Calendar getInstance() | 获取一个它的子类GregorianCalendar对象。 | | public int get(int field) | 获取指定日历字段的时间值。 | | public void set(int field,int value) | 设置指定字段的时间值 | | public void add(int field,int amount) | 为某个字段增加/减少指定的值 |

  • get,set,add方法参数中都有一个整数类型的参数field,field用来区分当前要获取或者操作的日期时间数据的。field数据的值使用Calender中定义的整数常量来表示

    • Calendar.YEAR : 年
    • Calendar.MONTH :月
    • Calendar.DAY_OF_MONTH:月中的周
    • Calendar.HOUR:小时
    • Calendar.MINUTE:分钟,
    • Calendar.SECOND:秒
    • Calendar.DAY_OF_WEEK:星期
  • 星期对应的关系
    字段时间值 : 1 2 3 … 7
    真正的时间 : SUNDAY MONDAY TUESDAY … SATURDAY
  • 月份对应的关系
    字段时间值 : 0 1 …. 11
    正真的时间 : JANUARY FEBRUARY …. DECEMBER

    package com.itheima.api_demo.calendar_demo;
    /*
      月份对应的关系
      字段时间值     :       0           1           ....        11
      正真的时间     :     JANUARY     FEBRUARY      ....      DECEMBER
    */
    import java.util.Calendar;
    /*
      成员方法 :
          public int get(int field)    获取指定日历字段的时间值。
          public void set(int field,int value)    设置指定字段的时间值
          public void add(int field,int amount)    为某个字段增加/减少指定的值
    */
    public class CalendarDemo {
      public static void main(String[] args) {
          // 获取Calendar对象 , rightNow对象
          Calendar rightNow = Calendar.getInstance();
          // public void set(int field , int value)    设置指定字段的时间值
          // rightNow.set(Calendar.YEAR , 2024);
          // rightNow.set(Calendar.MONTH , 5);
          // rightNow.set(Calendar.DAY_OF_MONTH, 10);
          // public void add(int field,int amount)    为某个字段增加/减少指定的值
          // rightNow.add(Calendar.DAY_OF_MONTH , -3);
          //  public int get(int field)     : 获取指定日历字段的时间值。
          int year = rightNow.get(Calendar.YEAR);
          int month = rightNow.get(Calendar.MONTH);
          int day = rightNow.get(Calendar.DAY_OF_MONTH);
          System.out.println(year); // 2021
          System.out.println(month);// 3
          System.out.println(day);  // 3
      }
    }
    
    package com.itheima.api_demo.calendar_demo;
    import java.util.Calendar;
    /*
      1 写代码使用get方法,将年,月,日,时,分,秒,周获取出来
      特别注意获取月份,和星期有以下特点:
      直接获取的月份数据是从0开始的, 0表示1月,.....11表示12月
      周的获取,从周日开始计算,1就是周日,2就是周一 ......7就是周六
    星期对应的关系
       字段时间值  :   1           2            3          ...        7
       真正的时间  : SUNDAY        MONDAY      TUESDAY     ...        SATURDAY
    月份对应的关系
      字段时间值     :       0           1           ....        11
      正真的时间     :     JANUARY     FEBRUARY      ....      DECEMBER
    */
    public class Test1 {
      public static void main(String[] args) {
          // 拿到当前时间
          Calendar now = Calendar.getInstance();
          System.out.println(now.get(Calendar.YEAR));
          System.out.println(now.get(Calendar.MONTH));
          System.out.println(now.get(Calendar.DAY_OF_MONTH));
          System.out.println(now.get(Calendar.HOUR));
          System.out.println(now.get(Calendar.MINUTE));
          System.out.println(now.get(Calendar.SECOND));
          int week = now.get(Calendar.DAY_OF_WEEK);// 7
          System.out.println(getWeek(week));// 字段值
      }
      public static String getWeek(int field){
          String[] str = { "" , "SUNDAY" , "MONDAY" , "TUESDAY" , "WEDNESDAY" , "THURSDAY" , "FRIDAY" , "SATURDAY"};
          return str[field];
      }
    }
    
    package com.itheima.api_demo.calendar_demo;
    import java.util.Calendar;
    /*
      2 写代码实现,获取2022年10月1日是星期几?
      参考思路:
      直接获取日历对象,得到的是当前系统的日历时间信息。
      获取日历对象后,要重新设置日期
      再获取星期数据
    */
    public class Test2 {
      public static void main(String[] args) {
          Calendar cal = Calendar.getInstance();
          cal.set(Calendar.YEAR, 2022);
          cal.set(Calendar.MONTH, 9);
          cal.set(Calendar.DAY_OF_MONTH, 1);
          int week = cal.get(Calendar.DAY_OF_WEEK);
          System.out.println(getWeek(week));// 字段值
      }
      public static String getWeek(int field){
          String[] str = { "" , "SUNDAY" , "MONDAY" , "TUESDAY" , "WEDNESDAY" , "THURSDAY" , "FRIDAY" , "SATURDAY"};
          return str[field];
      }
    }
    
    package com.itheima.api_demo.calendar_demo;
    import java.util.Calendar;
    /*
      3 计算10000天之后的年月日
      参考思路:
      先获取当前日历对象
      再调用add方法,指定DATE或者DAY_OF_MONTH,添加10000天
      再获取日历的年,月,日
    */
    public class Test3 {
      public static void main(String[] args) {
          Calendar cal = Calendar.getInstance();
          cal.add(Calendar.DAY_OF_MONTH, 10000);
          System.out.println(cal.get(Calendar.YEAR));
          System.out.println(cal.get(Calendar.MONTH));
          System.out.println(cal.get(Calendar.DAY_OF_MONTH));
      }
    }
    

    3.5 Math类

  • 概述 : Math包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。所提供的都是静态方法,可以直接调用

  • 常用方法 : | public static int abs(int a) | 获取参数a的绝对值: | | —- | —- | | public static double ceil(double a) | 向上取整 | | public static double floor(double a) | 向下取整 | | public static double pow(double a, double b) | 获取a的b次幂 | | public static long round(double a) | 四舍五入取整 |

3.6 System类

  • System类包含几个有用的类字段和方法。 它不能被实例化
  • 常用方法 : | 方法名 | 说明 | | —- | —- | | public static void exit(int status) | 终止当前运行的 Java 虚拟机,非零表示异常终止 | | public static long currentTimeMillis() | 返回当前时间(以毫秒为单位) |

3.7 JDK8 日期时间类

JDK8新增日期类
LocalDate     表示日期(年月日)  2021年11月11日
LocalTime     表示时间(时分秒) 10:11:12
LocalDateTime   表示时间 + 日期 (年月日时分秒) 2021年11月11日 10:11:12

1 对象获取

LocalDateTime创建方法
public static LocalDateTime now()  
        获取当前系统时间
public static LocalDateTime of  (年, 月 , 日, 时, 分, 秒)
        使用指定年月日和时分秒初始化一个LocalDateTime对象

例如:
这里演示LocalDateTime的对象获取方式,LocalDate和LocalTime也一样

public class Demo01 {
    public static void main(String[] args) {
        //public static LocalDateTime now()
        //        获取当前系统时间
        LocalDateTime now = LocalDateTime.now();
        System.out.println("now = " + now);
        //public static LocalDateTime of  (年, 月 , 日, 时, 分, 秒)
        //        使用指定年月日和时分秒初始化一个LocalDateTime对象
        LocalDateTime dateTime = LocalDateTime.of(1990, 1, 1, 12, 12, 12);
        System.out.println("dateTime = " + dateTime);
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        System.out.println("localDate = " + localDate);
        System.out.println("localTime = " + localTime);
    }
}

2 LocalDateTime 获取时间信息

public int getYear()          获取年
public int getMonthValue()    获取月份(1-12)
public int getDayOfMonth()    获取月份中的第几天(1-31)
public int getDayOfYear()     获取一年中的第几天(1-366)
public DayOfWeek getDayOfWeek()    获取星期
public int getMinute()       获取分钟
public int getHour()         获取小时
public int getSecond()          获取秒

实例:

public class Demo02 {
    public static void main(String[] args) {
        //获取日期时间对象
        LocalDateTime now = LocalDateTime.now();
        //调用方法获取各种时间信息
        int year = now.getYear();
        int month = now.getMonthValue();
        int day = now.getDayOfMonth();
        int dayOfYear = now.getDayOfYear();
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();
        DayOfWeek dayOfWeek = now.getDayOfWeek();
        System.out.println(year + "-" + month + "-" + day + "  " + hour + ":" + minute + ":" + second);
        System.out.println("当前时间是一年中的第" + dayOfYear + "天");
        System.out.println("当前日期星期为:" + dayOfWeek);
        //2022-4-4  15:44:53
        //当前时间是一年中的第94天
        //当前日期星期为:MONDAY
    }
}

3 日期时间的修改

package com.itheima.api_demo.jdk8_date_time;
import java.time.LocalDateTime;
/*
LocalDateTime 基于原有日期时间进行增加 减少 修改得到新的日期时间
时间的增加或减少
public LocalDateTime plusYears (long years)    添加或者减去年
public LocalDateTime plusMonths(long months)   添加或者减去月
public LocalDateTime plusDays(long days)      添加或者减去日
public LocalDateTime plusHours(long hours) 添加或者减去时
public LocalDateTime plusMinutes(long minutes) 添加或者减去分
public LocalDateTime plusSeconds(long seconds) 添加或者减去秒
public LocalDateTime plusWeeks(long weeks) 添加或者减去周
时间的修改
public LocalDateTime withYear(int year)       直接修改年
public LocalDateTime withMonth(int month)     直接修改月
public LocalDateTime withDayOfMonth(int dayofmonth)    直接修改日期(一个月中的第几天)
public LocalDateTime withDayOfYear(int dayOfYear)  直接修改日期(一年中的第几天)
public LocalDateTime withHour(int hour)       直接修改小时
public LocalDateTime withMinute(int minute)    直接修改分钟
public LocalDateTime withSecond(int second)    直接修改秒
 */
public class Demo03 {
    public static void main(String[] args) {
        //当前时间
        LocalDateTime now = LocalDateTime.now();
        //当前时间基础上+10000天,是什么时候
        LocalDateTime localDateTime1 = now.plusDays(10000);
        System.out.println("localDateTime1 = " + localDateTime1);
        //2049-08-20T15:51:44.009592
        //把年份修改为1995年
        LocalDateTime localDateTime2 = now.withYear(1995);
        System.out.println("localDateTime2 = " + localDateTime2);
        //即使增加或者减少,修改now的数据,原来的now都不会变。
        //会返回信新的数据
        System.out.println("now = " + now);
    }
}

4 格式化及解析

package com.itheima.api_demo.jdk8_date_time;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.TemporalAccessor;
/*
LocalDateTime格式化和解析
1 先获取日期时间解析器 DateTimeFormatter 对象。
  DateTimeFormatter 如下静态方法可以获取指定日期模板格式化器
  public static DateTimeFormatter ofPattern(String pattern)
  日期时间模板:yyyy-MM-dd HH:mm:ss
  注意:日期模板要把年月日时分秒包含,否则解析会失败
2 格式化:把一个LocalDateTime对象格式化成为一个日期字符串
  使用LocalDateTime的format传入第一步的格式化对象可以完成格式化
  public String format(DateTimeFormatter formatter) 把一个LocalDateTime格式化成为一个字符串
3 解析: 把一个日期字符串解析成为一个LocalDateTime对象
  使用LocalDateTime的parse方法传入要解析的字符串和第一步的格式化对象可以完成解析了
  public static LocalDateTime parse (准备解析的字符串, 日期格式化器对象)
 */
public class Demo04 {
    public static void main(String[] args) {
        //日期时间格式化器
        //DateTimeFormatter dfm = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        DateTimeFormatter dfm = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        //获取当前日期时间
        LocalDateTime now = LocalDateTime.now();
        //把now对象,格式化为字符串
        String nowStr = now.format(dfm);
        System.out.println("nowStr = " + nowStr);//2022年04月04日 16:01:59
        //将字符串转换为LocalDateTime对象
        String dateTimeStr = "2030年04月04日 16:00:00";
        LocalDateTime localDateTime = LocalDateTime.parse(dateTimeStr, dfm);
        System.out.println("localDateTime = " + localDateTime);
        //2030-04-04T16:00
    }
}

5 日期间隔

/*
Period日期隔类
       public static Period between(LocalDate star, LocalDate end)计算两个“时间"的间隔
       public int getYears()    获得这段时间的年数
       public int getMonths()   获得此期间的总月数
       public int getDays()       获得此期间的天数
 */
public class Demo05Period {
    public static void main(String[] args) {
        LocalDate start = LocalDate.of(2022, 11, 11);
        LocalDate end = LocalDate.of(2032, 10, 11);
        Period between = Period.between(start, end);
        System.out.println(between.getYears());//9
        System.out.println(between.getMonths());//11
        System.out.println(between.getDays());//0
    }
}

6 时间间隔

package com.itheima.api_demo.jdk8_date_time;
import java.time.*;
/*
Duration时间间隔类
开始时间和结束时间要精确到时分秒:因此可以使用LocalDateTime,或者LocalTime
public static Duration between(开始时间,结束时间)  计算两个“时间"的间隔
public long toDays()    两个时间差的天数
public long toHours()  两个时间差的小时数
public long toMinutes()    两个时间差的分钟数
public long toMillis() 两个时间差的毫秒数
 */
public class Demo06Duration {
    public static void main(String[] args) {
        //开始时间
        LocalDateTime start = LocalDateTime.of(2022, 4, 4,4,4,4);
        //结束时间
        LocalDateTime end = LocalDateTime.of(2022, 4, 4,8,4,4);
        //获取两个时间差对象
        Duration b = Duration.between(start, end);
        //获取具体单位时间之差
        System.out.println(b.toDays());//0
        System.out.println(b.toHours());//4
        System.out.println(b.toMinutes());//240
        System.out.println(b.toSeconds());//14400
        System.out.println(b.toMillis());//14400000
    }
}