Day43 JDK1.8新特性 下 接口的类优先原则和接口冲突,日期时间组件,重复注解

本文主要是介绍Day43 JDK1.8新特性 下 接口的类优先原则和接口冲突,日期时间组件,重复注解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Day43 JDK1.8新特性

1.接口的默认方法与静态方法

从JDK1.8开始,接口中可以有默认方法,既default修饰的方法,此方法可以让接口的实现类所调用,而接

口中的静态方法直接用接口名调用即可

public class Test1 {@Testpublic void test01() {MyClass myClass = new MyClass();myClass.defaultMethod();I1.staticMethod();}
}
interface I1{default void defaultMethod(){System.out.println("接口中的默认方法");}public static void staticMethod(){System.out.println("接口中的静态方法");}
}
class MyClass implements I1{}

接口默认方法的”类优先”原则:

  • 如果一个接口中定义了一个默认方法,而接口实现类的父类定义了一个同名的方法时,选择父类中的方法

  • 接口冲突:如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突

public class Test01 {public static void main(String[] args) {B b = new B();b.method();}
}interface I1{default void method(){System.out.println("I1接口中的method方法");}
}class A{public void method(){System.out.println("A类中的method方法");}
}class B extends A implements I1{}
public class Test01 {public static void main(String[] args) {}
}interface I1{default void method(){}
}interface I2 extends I1{public void method();
}class A implements I2{@Overridepublic void method() {}
}

2.日期组件

JDK1.8提供的新日期类都是不可变的,既不管怎么样的改变,都会产生一个新的实例,他们都是线程安全的

日期组件遵循与IOS-8601世界时间标准

2.1 组件简介

包路径类名描述
java.time针对日期和时间操作的包
LocalDate用于表示日期的类
LocalTime用于表示时间的类
LocalDateTime用于表示日期时间的类
Instant时间戳类(1970.1.1 0:0:0 到现在的毫秒数)
Period两个日期间隔类
Duration两个时间间隔类
java.time.chrono针对日期时间特殊格式操作的包
JapaneseChronology日本帝国历法系统类
ThaiBuddhistChronology泰国佛教日历系统类
java.time.format针对时间日期时间格式化操作的包
DateTimeFormatter格式化日期时间类
java.time.temporal针对时间矫正操作的包
java.time.zone针对时区操作的包

2.2 日期时间类、时间戳、间隔类

public class Test1 {@Testpublic void test01() {//LocalDate LocalTime LocalDateTime//这三个日期类的使用大致一样//获取当前日期时间对象LocalDateTime ldt1 = LocalDateTime.now();System.out.println(ldt1);//获取指定日期时间对象LocalDateTime ldt2 = LocalDateTime.of(2020, 1, 23, 8, 30, 10, 10);System.out.println(ldt2);//获取ldt1推后的时间日期对象LocalDateTime ldt3 = ldt1.plusYears(2);System.out.println(ldt3);//获取ldt1提前的时间日期对象LocalDateTime ldt4 = ldt3.minusMonths(2);System.out.println(ldt4.getYear());System.out.println(ldt4.getMonthValue());System.out.println(ldt4.getDayOfMonth());System.out.println(ldt4.getHour());System.out.println(ldt4.getMinute());System.out.println(ldt4.getSecond());}@Testpublic void test02() {//使用时间戳(从1970年1月1日0:0:0到现在的毫秒值)//默认创建UTC(世界标准时间)时区的时间戳对象Instant now1 = Instant.now();System.out.println(now1);//获取偏移8小时的偏移日期时间对象OffsetDateTime odt = now1.atOffset(ZoneOffset.ofHours(8));System.out.println(odt);//获取时间戳的毫秒值形式System.out.println(now1.toEpochMilli());//获取一个1970年1月1日0:0:0 往后退1秒的时间戳对象Instant now2 = Instant.ofEpochSecond(1);System.out.println(now2);}@Testpublic void test03() throws InterruptedException {//Duration:时间间隔类Instant now1 = Instant.now();Thread.sleep(1000);Instant now2 = Instant.now();//获取时间间隔类对象Duration duration1 = Duration.between(now1, now2);System.out.println(duration1.toMillis());System.out.println("-----------------------------");LocalTime lt1 = LocalTime.now();Thread.sleep(1000);LocalTime lt2 = LocalTime.now();//获取时间间隔类对象Duration duration2 = Duration.between(lt1, lt2);System.out.println(duration2.toMillis());}@Testpublic void test04() throws InterruptedException {//Period:日期间隔类LocalDate ld1 = LocalDate.now();Thread.sleep(1000);LocalDate ld2 = LocalDate.of(2020, 12, 31);Period period = Period.between(ld1, ld2);System.out.println(period.getYears());System.out.println(period.getMonths());System.out.println(period.getDays());}
}

2.3 日期时间格式化类-DateTimeFormatter

public class Test1 {@Testpublic void test01() {//格式化日期时间类LocalDateTime ldt1 = LocalDateTime.now();//获取本地标准的日期时间格式化对象DateTimeFormatter dtf1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;String strDateTime1 = ldt1.format(dtf1);//格式化时间日期System.out.println(strDateTime1);//自定义日期时间格式化对象DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");String strDateTime2 = ldt1.format(dtf2);//格式化时间日期System.out.println(strDateTime2);//将指定格式的字符串解析成LocalDateTime对象LocalDateTime parse = LocalDateTime.parse("2020年03月12日 11:04:14", dtf2);System.out.println(parse);}
}

2.4 时间矫正器类-TemporalAdjuster

public class Test1 {@Testpublic void test01() {//时间矫正器LocalDateTime ldt1 = LocalDateTime.now();//设置指定月份LocalDateTime ldt2 = ldt1.withMonth(10);System.out.println(ldt2);//设置下一个周末LocalDateTime ldt3 = ldt1.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));System.out.println(ldt3);//自定义时间矫正器:设置下一个工作LocalDateTime ldt4 = ldt1.with((temporal)->{LocalDateTime ldt = (LocalDateTime) temporal;DayOfWeek week = ldt.getDayOfWeek();if(week.equals(DayOfWeek.FRIDAY)){//周五return ldt.plusDays(3);}else if(week.equals(DayOfWeek.SATURDAY)){//周六return ldt.plusDays(2);}else{return ldt.plusDays(1);}});System.out.println(ldt4);}
}

2.5 时区类

public class Test1 {@Testpublic void test01() {//时区类 //获取所有时区字符串Set<String> set = ZoneId.getAvailableZoneIds();for (String str : set) {System.out.println(str);}//获取指定时区的日期时间对象LocalDateTime ldt1 = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));System.out.println(ldt1);//获取指定时区的日期时间对象 + 偏移量LocalDateTime ldt2 = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));ZonedDateTime zonedDateTime = ldt2.atZone(ZoneId.of("Asia/Tokyo"));System.out.println(zonedDateTime);}
}

2.6 重复注解及类型注解

jdk1.8开始可以重复注解

ps:一个类可有多个同样的注解

@Author(name="何老师")
@Author(name="波多老师")
public class Test01 {public static void main(String[] args) throws NoSuchMethodException, SecurityException {Class<?> clazz = Test01.class;//获取类上的注解Author[] as = clazz.getDeclaredAnnotationsByType(Author.class);for (Author author : as) {System.out.println(author.name());}//获取参数上的注解Method method = clazz.getMethod("method", String.class);Parameter[] parameters = method.getParameters();for (Parameter parameter : parameters) {Author annotation = parameter.getAnnotation(Author.class);System.out.println(annotation.name());}}public void method(@Author(name="何老师") String str){}
}

作者注解

@Repeatable(Authors.class)//使用重复注解,就必须加上该注解
@Target({ElementType.TYPE,ElementType.PARAMETER})//TYPE_PARAMETER-类型注解:作用在参数
@Retention(RetentionPolicy.RUNTIME)
public @interface Author {String name();
}

作者注解的容器

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Authors {Author[] value();
}

总结

1.接口的类优先原则 和 接口冲突

2.日期时间组件

3.重复注解

经验:JDK1.8新特性
Lambda - 重要
函数式接口 - 重要
方法的引用 - 重要
Stream - 重要
日期时间组件(LocalDate、LocalTime、LocalDateTime、Instant、DateTimeFormatter) – 重要

这篇关于Day43 JDK1.8新特性 下 接口的类优先原则和接口冲突,日期时间组件,重复注解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946843

相关文章

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor