打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java9-17新特性一览,为将来快速适应打下基础!
userphoto

2023.11.01 天津

关注

开发环境

建议安装idea2023版本,新版占用资源少,增加了些新功能。

新特性

1、接口private

在接口中申明private方法,不会被外部实现。

1.1、接口类:

public interface LoginInterface {
    private void login(){
        System.out.println("登录方法");
    }
    private void register(){
        System.out.println("注册方法");
    }
   default void interfaceMethod(){
        login();
        register();
    }
}

1.2、实现类:

public class LoginImpl implements LoginInterface{
    @Override
    public void interfaceMethod() {
        LoginInterface.super.interfaceMethod();
    }
    public static void main(String[] args) {
        LoginImpl loginImpl = new LoginImpl();

        loginImpl.interfaceMethod();

    }
}

实现接口,只能看到default方法,无法实现private方法

2、类型推断

java11特性中,方法内使用var申明变量,可以被编译器自动判断类型。

2.1、代码示例

   var list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        var set = new LinkedHashMap<>();
        set.put("1",1);
        set.put("2",2);
        for (var l : list) {
            System.out.println(l);
        }
        for (var s : set.entrySet()){
            System.out.println(s);
        }

    }

输出结果

1
2
3
1=1
2=2

2.2、不适用场景

1)只能在方法内部使用(局部变量);

2)必须有初始化值且不能为null;

3)不能定义为方法的返回类型。

4)  方法的返回值类型

5)方法的参数类型

3、文本块

三引号取代了双引号,因为双引号的内容会夹带一堆换行符,而三引号里面就单纯是内容,很清晰。

3.1、代码示例

  String text1 = "The Sound of silence\n" +
                "Hello darkness, my old friend\n" +
                "I've come to talk with you again\n" +
                "Because a vision softly creeping\n" +
                "Left its seeds while I was sleeping\n" +
                "And the vision that was planted in my brain\n" +
                "Still remains\n" +
                "Within the sound of silence";
//       文本块
        String str= """
                The Sound of silence
                Hello darkness, my old friend
                I've come to talk with you again
                Because a vision softly creeping
                Left its seeds while I was sleeping
                And the vision that was planted in my brain
                Still remains
                Within the sound of silence
                """;
        System.out.println(text1);
        System.out.println(str);

4、智能转换

java16新特性,对instanceof做了增强。

4.1、代码示例

    @Test
    void testInstanceOf(){
        test1("hello world");
        test2("字符串内容");
    }
    static void test1(Object obj){
        if(obj instanceof String){
            String s = (String) obj;
            System.out.println(s);
        }
    }
    static void test2(Object obj){
        if(obj instanceof String){
            System.out.println(obj);
        }
    }

如果,idea安装了阿里巴巴代码规范插件,鼠标悬浮在test1方法s变量有替换代码提示。

 注意:instanceof 如果需要判断必须用&&,不能使用||,因为instanceof本来就匹配判断,java确保&&后面变量一定存在,但无法保证||后面变量存在,会报错!

5、record类

record实现了一个简单的数据载体类,避免了编写:构造函数,访问器,equals()、hasCode()、toString()等等。 当你使用record声明类时,该类具有public get、hashcode、equals、toString、构造器等结构,减少了代码编写量。

代码示例

public record Person(String name,int age,String say) {
    public static String  hobby = "zhangsan";
    public String upName(){
        return name.toUpperCase();
    }
    public static String getHobby(){
        return hobby;
    }
    //不可以声明非静态的属性
//    private int id;//报错

//不可以将record定义的类声明为abstract的
//abstract record Order(){
//
//}

//不可以给record定义的类声明显式的父类(非Record类)
//record Order() extends Thread{
//
//}
}

 @Test
    void recordClass(){
        Person person = new Person("wjx",18,"hi");
        Person.hobby="eat";
        System.out.println(person.name());
        System.out.println(person.upName());
        System.out.println(Person.getHobby());
    }

record不适合场景

它不是 JavaBeans 的直接替代品,因为record的方法不符合 JavaBeans 的 get 标准。另外 JavaBeans通常是可变的,而记录是不可变的。尽管它们的用途有点像,但并不会这样取代javaBeans。

6、switch增强

1)、支持箭头语法

2)、支持表达式

3)、支持case null

6.1、箭头语法

private static void fruits(int i) {
      switch (i) {
         case 1 -> System.err.println("香蕉");
         case 2 -> System.err.println("猕猴桃");
         default -> System.err.println("苹果");
      }
   }

6.2、表达式

/**
    * 单表达式
    */
   private static String fruits(int i) {
      return switch (i) {
         case 1 -> "香蕉";
         case 2 -> "猕猴桃";
         default -> "苹果";
      };
   }

   /**
    * 多表达式
    */
   private static String fruitsNew(int i) {
      return switch (i) {
         case 1, 2 -> {
            System.err.println("来一个香蕉");
            yield "香蕉来咯";
         }
         case 3, 4 -> {  
            System.err.println("来一个猕猴桃");
            yield"猕猴桃来咯";
         }
         default -> {
            System.err.println("没的选就来个苹果吧");
            yield "苹果来咯";
         }
      };
   }

6.3、支持null,传入null值不会报错

private static void fruits(String s) {
      switch (s) {
         case "1" -> System.err.println("香蕉");
         case null -> System.err.println("null");
         default -> System.err.println("苹果");
      }
   }

注意:

  • 箭头语法,冒号和箭头不能同时存在;

  • 多表达式要使用花括号,并通过yield关键字返回;

  • case null是预览功能,在IDEA - Project Structure - Modules中选择Language Level为17(Preview)才能编译通过。

总结

jdk新特性不仅仅以上几点,比如不可变集合、模块化、String和Stream增强等等,之所以没列出来,估计大概率用不到。

通过这些特性,发现java语言有python、go语言的影子,说明它在不断进步。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
try
JDK 6 探秘之三:Java.lang包的新特性
Java 字符终端上获取输入三种方式
反射
JSON用法
在java中如何遍历某个路径下的所有文件夹和文件
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服