一、java新特性玩转JDK8之default关键字
首先创建一个java基础的项目
①、在jdk1.8以前接口里面是只能有抽象 方法,不能有任何方法的实现的,默认是public修饰的。
package com.weizhaoyang;
public interface Animal {
void run();
void eat();
}
②、jdk1.8里面打破了这个规定,引入了新的关键字default,使用default修饰的方法,可以在接口里面定义具体的方法实现
③、默认方法:
接口里面定义一个默认的方法,这个接口的实现类实现了这个接口之后,不管这个default修饰的方法就可以直接调用,即接口方法的默认实现
代码如下:
package com.weizhaoyang;
public interface Animal {
void run();
void eat();
default void breath(){
System.out.println("使用氧气呼吸");
}
}
package com.weizhaoyang;
public class Dog implements Animal {
@Override
public void run() {
System.out.println("跑步");
}
@Override
public void eat() {
System.out.println("吃");
}
}
package com.weizhaoyang;
public class Main {
public static void main(String[] args) {
Dog dog=new Dog();
dog.breath();
dog.eat();
dog.run();
}
}
运行的结果如下:
④、静态方法:接口名 .静态方法来访问接口中的的静态方法
package com.weizhaoyang;
public interface Animal {
void run();
void eat();
default void breath(){
System.out.println("使用氧气呼吸");
}
static void test(){
System.out.println("这是个静态方法");
}
}
package com.weizhaoyang;
public class Main {
public static void main(String[] args) {
Dog dog=new Dog();
dog.breath();
dog.eat();
dog.run();
Animal.test();
}
}
运行的结果如下:
使用场景:接口里面定义公用的业务逻辑,抽取出来,每个子类都是必须具备的
二、java新特性玩转JDK8之base64加解密API
①、什么是Base64编码
Base64是网络上最常见的用于传输 8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法
②、基于64个字符A-Z,a-z,0-9,+,/的编码方式,是一种能将任意二进制数据用64种字元组合成字符串的方法,而这个二进制数据和字符串之间是可以相互转换的,在实际应用 上,Base64除了能将二进制数据可视化之外,也常用来表示字符串加密过后的内容
比如:图片可以用字符串也可以用二进制来存储,中小型的网站是用密码的解密也可以用Base64。
早期的java要使用Base64怎么做?
使用JDK里sun.misc套件下的BASE64Encoder和BASE64Decoder这两个类
代码如下:
package com.weizhaoyang;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BASE64Encoder encoder =new BASE64Encoder();
BASE64Decoder decoder=new BASE64Decoder();
String text="weizhaoyang";
byte[] textBytes = text.getBytes("UTF-8");
String encode = encoder.encode(textBytes);
System.out.println(encode);
System.out.println(new String(decoder.decodeBuffer(encode), "UTF-8"));
}
}
运行的结果如下 :
缺点:编码和解码的效率比较差,需要做转换 公开信息说以后的版本会取消这个方法
③、Apache Commons Codec有提供Base64的编码和解码。缺点:是需要引用Apache Commons Codec
④、jdk1.8之后怎么玩?(首选推荐) A:jdk1.8的java.util包中,新增了Base64的类
好处:不用引包,编解码效率远大于sun.misc和apache Commons Codec
代码如下:
Base64.Encoder encoder=Base64.getEncoder();
Base64.Decoder decoder=Base64.getDecoder();
String text="weizhaoyang";
byte[] textBytes = text.getBytes("UTF-8");
//编码
String encodeText= encoder.encodeToString(textBytes);
System.out.println(encodeText);
//解码
String s = new String(decoder.decode(encodeText), "UTF-8");
System.out.println(s);
运行结果如下:
三、java新特性玩转JDK8之时间日期处理类上篇
①、时间处理再熟悉不过,SimplaDateFormat,Calendar,Date等类
旧版特点: java.util.Date是非线程安全的 API设计比较差,日期/时间对象比较,加减麻烦
②、java8通过发布新的Date-Time API(jsr 310) 来进一步加强对日期与时间的处理
新增了很多常见的api,如 日期/时间的比较,加减,格式化等
包所在的位置 java.time
核心类
LocalDate :不包含具体时间的日期:当地的日期
LocalTime:不包含日期的时间
LocalDateTime:包含了日期及时间。
LocalDate 常用API,代码如下:
package com.weizhaoyang;
import java.io.IOException;
import java.time.LocalDate;
public class Main {
public static void main(String[] args) throws IOException {
LocalDate date=LocalDate.now();
System.out.println("今天日期"+date);
//获取年月日,周几
System.out.println("现在是哪年"+date.getYear());
System.out.println("现在是哪月"+date.getMonth());
System.out.println("现在是哪月(数字)"+date.getMonthValue());
System.out.println("现在是几号"+date.getDayOfMonth());
System.out.println("现在是周几"+date.getDayOfWeek());
//加减年份,加后返回的对象才是修改过的,旧的依然是旧的
LocalDate date1 = date.plusYears(1);
System.out.println("加后是哪年"+date1.getYear());
System.out.println("旧的是哪年"+date.getYear());
//日期比较:true
System.out.println("isAfter:"+date1.isAfter(date));
}
}
运行的结果如下:
四、java新特性玩转JDK8之时间日期处理类下篇
日期时间格式化
jdk8之前:SimpleDateFormat来进行格式化,但SimpleDateFormat并不是线程安全的
jdk8之后,引入线程安全的日期和时间DateTimeFormatter
代码如下:
package com.weizhaoyang;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) throws IOException {
LocalDateTime ldt=LocalDateTime.now();
System.out.println(ldt);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(formatter.format(ldt));
}
}
运行的结果如下:
获取指定的日期时间对象
代码如下:
package com.weizhaoyang;
import java.io.IOException;
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) throws IOException {
LocalDateTime ldt = LocalDateTime.of(2020,11,11,8,20,30);
System.out.println(ldt);
}
}
运行的结果如下:
计算时间日期差java.time.Duration
代码如下:
package com.weizhaoyang;
import java.io.IOException;
import java.time.Duration;
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) throws IOException {
//LocalDateTime ldt = LocalDateTime.of(2020,11,11,8,20,30);
//System.out.println(ldt);
LocalDateTime today=LocalDateTime.now();
System.out.println(today);
LocalDateTime ldt1 = LocalDateTime.of(2020,11,11,8,20,30);
System.out.println(ldt1);
Duration between = Duration.between(today, ldt1);
//相差多些天
System.out.println(between.toDays());
//相差多少小时
System.out.println(between.toHours());
//相差的毫秒数
System.out.println(between.toMillis());
//相差纳秒数
System.out.println(between.toNanos());
}
}
运行的结果如下:
五、java新特性玩转JDK8之Optional类
①、Optional类有啥用
主要解决的问题是空指针异常(NullPointException)
怎么解决?
本质上是一个包含有可选值的包装类,这意味着Optional类既可以包含对象也可以为空
②、创建Optional类
of()
null值作为参数传递进去,则会抛异常
ofNullable()
如果对象即可能是null也可能是非null,应该使用ofNullable方法
访问Optional对象的值
get()方法
代码如下:
package com.weizhaoyang;
import java.io.IOException;
import java.util.Optional;
public class Main {
public static void main(String[] args) throws IOException {
Student student=null;
Optional<Student> optional=Optional.ofNullable(student);
Student s=optional.get();
}
}
运行结果如下:因为对象为空,所以get方法的时候报错:
关于jdk8的一些新特性,下回讲解。