JDK10特性

文章目录

  • JAVA10概述
  • 语法层次的变化
    • 局部变量的类型推断
    • 不能使用类型推断的场景
      • 变量的声明
      • 初始值null
      • lambda表达式
      • 方法引用
      • 为数组静态初始化
      • 成员变量不能使用
      • 其他不可以的场景
  • API层次的变化
    • 集合的copyOf方法
  • 总结

JAVA10概述

2018年3月21日,Oracle官方宣布JAVA10正式发布。

JAVA9和JAVA10都不是 LTS (Long-Term-Support)版本,和过去的JAVA大版本升级不同,这两个只有半年左右的开发和维护时间。

JAVA10 一共定义了109个新特性,其中包含JEP,对程序员来说真正的新特性也就一个,还有一些新的API和JVM规范以及JAVA语言规范上的改动。

JAVA10 的12个JEP (JDK Enhancement Proposal特性加强协议) ,可参阅官方文档http://openjdk.java.net/projects/jdk/10/

image.png

具体的新增特性:

286: 局部变量类型推断

296: JDK库合并

304: 统一的垃圾回收接口

307:为G1提供并行的Full GC

310:应用程序类数据共享

312: ThreadLocal握手交互

313: 移除JDK中附带的javah工具

314: 使用附加的Unicode语言标记拓展

316:能将对内存占用分配给用户指定的备用内存设备

317:使用基于JAVA的JIT编译器

319: 根证书

322:基于时间的发布版本

语法层次的变化

局部变量的类型推断

局部变量的显示类型声明,常常认为是不必须的,给一个好听的名字经常可以很清楚的表达出下面应该怎样继续,减少了啰嗦和形式的代码,避免了信息的冗余,而且对齐了变量名,容易阅读。

作为JAVA程序员,在声明一个变量时,我们一般都是书写两次变量类型,第一次用于声明变量类型,第二次用于构造器

List<String> list =new ArrayList<>();

变量的声明类型书写复杂且较长,尤其是加上泛型的使用

Iterator<Map.Entry<Integer,Student>> iterator=set.iterator();

我们也经常声明一种变量,它只被使用一次,并且是在下一行代码中:

URL url=new URL("http://www.boge.com");
URLConnection connection= url.openConnection();
Reader reader =new BufferedReader(new InputStreamReader(connection.getInputStream));

总之: 变量标识符(变量名)就可以让我清楚的知道变量如何使用,没必要前面加上一大串的类型声明

局部变量推断有点类似JavaScript中的弱变量类型的写法,通过后面的数据来推断前面的数据类型,数据类型的声明统一为var。

image.png

不能使用类型推断的场景

在有些情况下我们是不能使用类型推断的。具体有如下的场景

变量的声明

变量的声明不能使用类型推断,因为无法推断

// 根据右边的数据推断类型,不赋值压根没给推断的机会,这是错的
var userName;

在这里插入图片描述

初始值null

初始值为null的情况也是不行的。因为同样没有办法推断

// null值无法推断数据类型,这是不能使用类型推断
var userName=null;

在这里插入图片描述

lambda表达式

        // 这个是可以的Supplier<Double> supplier=()-> Math.random();// 这个是不行的 lambda表达式需要显式数据类型,不然无法明确是哪个接口var supplier2=()->Math.random();

方法引用

        // 这是可以的进行方法引用的Consumer<String> consumer=System.out::println;// 这是不可以的,无法明确接口类型var consumer2=System.out::println;

在这里插入图片描述

为数组静态初始化

        //动态初始化数据可以进行类型推断var arr =new String[10];//静态初始化数组不可以使用类型推断var arr2 = {"a12","222","333","444","555"};

成员变量不能使用

类型推断仅仅是局部变量,成员变量不可以使用类型推断

public class Demo07 {// 成员变量不能使用类型推断var name="小明";public void testMethod1(){// 局部变量可以使用类型推断var localname="小明";}
}

其他不可以的场景

// 情况1 没有初始化的局部变量声明
var s; var x=null;
// 情况2 方法的返回值类型
public var test1()
// 情况3 方法的参数类型
public void test2(var a,var b)
// 情况4 构造器的参数类型
public Person(var name,var age)
// 情况5 属性
class Person{var name;
}
// 情况6 catch块
try{
}catch(var e){
}

以下两点需要注意

  1. var不是一个关键字

我们无需担心变量名或者方法名会与var发生冲突,因为var实际上不是一个关键字,而是一个类型名,只有在编译器需要知道类型的地方法才会用到它.除此之外,他就是一个普通的合法标识符.也就是说,除了不能用它做类名,其他都可以.但是又有哪个傻瓜非要用var做类名呢?

  1. 这毕竟不是JavaScript

var并不会改变java是一门静态语言的事实,编译器负责推断出类型,并把结果写入字节码,也就是说,数据类型还是在字节码中的,java还是属于强类型的编程语言,开发人员没有明确写出来而已.而JavaScript是弱类型解释型的脚本语言,和这里的类型推断是两回事.

API层次的变化

集合的copyOf方法

在JDK10中给集合新增了一个copyOf方法。用来创建只读集合

        // JAVA9中新增创建只读的方法var strings1 = List.of("Python", "JAVA", "Golang");// JAVA10中新增的创建只读集合的方法var strings2 = List.copyOf(strings1);// 判断两个集合在内存上是否是同一个,结果为trueSystem.out.println(strings1==strings2);// 创建一个普通集合var strings3=new ArrayList<String>();// 通过copyOf方法创建一个只读集合var strings4 = List.copyOf(strings3);// 判断两个集合在内存上是否是同一个,结果为falseSystem.out.println(strings3==strings4);

结论:copyOf方法的作用通过一个集合返回的是一个只读集合,如果参数本来就是只读集合,那么返回的就是参数,如果参数不是只读集合,就再创造一个只读集合返回。

总结

JAVA10的特性及变动不是特别多,毕竟是开发时间只有半年。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/110396.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSI模型与数据的封装

1、OSI模型 上层|| 七层模型 四层模型|| 应用层| 表示层 应用层 http/ftp/ssh/ftps| 会话层 -----------------------------------------------------------------------| 传输层 传输层 tcp/udp ------------------------------…

解决:Loading class `com.mysql.jdbc.Driver‘. This is deprecated.

1.在连接MySQL数据库时候会出现这个报错 Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unneces…

gitlab操作

1. 配置ssh 点击访问 2. 创建新分支与切换新分支 git branch 新分支名 // 创建 git checkout 新分支名 // 切换到新分支3. 查看当前分支 git branch*所指的就是当前所在分支 4. 本地删除文件后与远程git同步 git add -A git commit -m "del" git push

C++项目实战——基于多设计模式下的同步异步日志系统-⑧-日志落地类设计

文章目录 专栏导读抽象基类StdoutSink类设计FileSink类设计RollBySizeSink类设计日志落地工厂类设计日志落地类整理日志落地拓展测试RollByTimeSink类设计测试代码测试完整代码 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领…

民用大中型无人直升机系统飞行性能飞行试验要求

声明 本文是学习GB-T 42856-2023 民用大中型无人直升机系统飞行性能飞行试验要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了民用大中型无人直升机系统飞行性能飞行试验的内容、目的、条件、实施、数据处理和 结果评定等要…

线性代数的本质(三)——线性方程组

文章目录 线性方程组高斯消元法初等行变换线性方程组的解向量方程齐次线性方程组的解非齐次线性方程组的解 线性方程组 高斯消元法 客观世界最简单的数量关系是均匀变化的关系。在均匀变化问题中&#xff0c;列出的方程组是一次方程组&#xff0c;我们称之为线性方程组(Linea…

第6章_瑞萨MCU零基础入门系列教程之串行通信接口(SCI)

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

稀土系储氢合金 吸放氢反应动力学性能测试方法

声明 本文是学习GB-T 42656-2023 稀土系储氢合金 吸放氢反应动力学性能测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了稀土系储氢合金吸/放氢反应动力学性能的测试方法。 本文件适用于采用体积法进行稀土系储氢合金的…

RabbitMQ基础概念-02

RabbitMQ是基于AMQP协议开发的一个MQ产品&#xff0c; 首先我们以Web管理页面为 入口&#xff0c;来了解下RabbitMQ的一些基础概念&#xff0c;这样我们后续才好针对这些基础概念 进行编程实战。 可以参照下图来理解RabbitMQ当中的基础概念&#xff1a; 虚拟主机 virtual hos…

关于老项目从JDK8升级到JDK17所需要注意的细节

文章目录 ☀️1.关于老项目从JDK8升级到JDK17所需要注意的细节&#x1f338;1.1.更新JDK&#x1f338;1.2.修改Idea中的JDK版本&#x1f338;1.3.关于修改过程中遇到的异常&#x1f338;1.4.IDEA工具栏操作Maven正常&#xff0c;但使用mvn命令运行就报错 ☀️1.关于老项目从JDK…

刚考过PMP想问一下怎样才能转行做PM

引言&#xff1a; 在当今竞争激烈的职场环境下&#xff0c;许多人考虑转行成为项目经理&#xff08;PM&#xff09;&#xff0c;这是一个充满挑战和机遇的职业。虽然转行可能会面临一些困难&#xff0c;但通过采取适当的策略和技巧&#xff0c;你可以成功地转型为一名优秀的项目…

微信开放平台第三方开发,实现代小程序备案申请

大家好&#xff0c;我是小悟 微信小程序备案整体流程总共分为五个环节&#xff1a;备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前&#xff0c;需要确保小程序基本信息已填写完成、小程序至少存在一个…