博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java10新特性
阅读量:3965 次
发布时间:2019-05-24

本文共 3111 字,大约阅读时间需要 10 分钟。

一、局部变量类型推断

1.不适用以下的结构中:

  • 情况1:没有初始化的局部变量声明
  • 情况2:方法的返回类型
  • 情况3:方法的参数类型
  • 情况4:构造器的参数类型
  • 情况5:属性
  • 情况6:catch块

2.工作原理

在处理 var时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行 推断,作为左边变量的类型,然后将该类型写入字节码当中

注 意

  • var不是一个关键字
    你不需要担心变量名或方法名会与 var发生冲突,因为 var实际上并不是一个关键字, 而是一个类型名,只有在编译器需要知道类型的地方才需要用到它。除此之外,它 就是一个普通合法的标识符。也就是说,除了不能用它作为类名,其他的都可以, 但极少人会用它作为类名。
  • 这不是JavaScript
    首先我要说明的是,var并不会改变Java是一门静态类型语言的事实。编译器负责推 断出类型,并把结果写入字节码文件,就好像是开发人员自己敲入类型一样。 下面是使用 IntelliJ(实际上是 Fernflower的反编译器)反编译器反编译出的代码
    在这里插入图片描述
    从代码来看,就好像之前已经声明了这些类型一样。事实上,这一特性只发 生在编译阶段,与运行时无关,所以对运行时的性能不会产生任何影响。所 以请放心,这不是 JavaScript

3.举例:

public class Java10Test {
/* java10新特性一:局部变量的类型推断 */ @Test public void test1() {
//1.声明变量时,根据所附的值,推断变量的类型 var num = 10; var list = new ArrayList
(); list.add(133); //2.遍历操作 for (var l : list) {
System.out.println(l); System.out.println(l.getClass());//class java.lang.Integer } //3.普通的遍历操作 for (var i = 0; i < 100; i++) {
System.out.println(i); } } @Test public void test2() {
//1.局部变量不赋值,就不能实现类型推断// var num ; //2.lambda表示式中,左边的函数式接口不能声明为var Supplier
sup = () -> Math.random(); System.out.println(sup.get());// var sup = () -> Math.random(); //3.方法引用中,左边的函数式接口不能声明为var Consumer
con = System.out::println; con.accept("朴灿烈");// var con = System.out::println; //4.数组的静态初始化中,注意如下的情况也不可以 int[] arr = {
1, 2, 3, 4};// var arr = {1,2,3,4}; } //不适用以下情况 @Test public void test3() {
//  情况1:没初始化的局部变量声明// var num; } //  情况2:方法的返回类型// public var method1(){
// return 0;// } //  情况3:方法的参数类型// public void method2(var num){
// System.out.println(num);// } //  情况4:构造器的参数类型// public Java10Test(var i){
// this.i = i;// } //  情况5:属性// var num; // 情况6:catch /* public void test4(){// try{//// }catch (var e){// e.printStackTrace();// } }*/ @Test public void test4() {
try {
var url = new URL("http://www.atguigu.com"); var connection = url.openConnection(); var reader = new BufferedReader( new InputStreamReader(connection.getInputStream())); } catch (IOException e) {
e.printStackTrace(); } }

二、集合新增创建不可变集合的方法

自 Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了 of (jdk9新增)和 copyOf (jdk10新增)方法,它们两个都用来创建不可变的集合,来看下它们的 使用和区别。

@Test    public void test5 () {
//示例1: var list1 = List.of("Java", "Python", "C"); var copy1 = List.copyOf(list1); System.out.println(list1 == copy1); // true //示例2: var list2 = new ArrayList
(); list2.add("aaa"); var copy2 = List.copyOf(list2); System.out.println(list2 == copy2); // false //示例1和2代码基本一致,为什么一个为true,一个为false? //结论:copyOf(Xxx coll):如果参数coll本身就是一个只读集合,则copyOf()返回值即为当前的coll //如果参数coll不是一个只读集合,则copyOf()返回一个新的集合,这个集合是只读的。 }

在这里插入图片描述

转载地址:http://vtuki.baihongyu.com/

你可能感兴趣的文章
kafaka用例&市上最全总结
查看>>
神器 PySimpleGUI 初体验
查看>>
编程 学习视频教程大全
查看>>
查找最快的docker镜像
查看>>
AssignProcessToJobObject 错误码5 的解决办法
查看>>
windows LibreOffice 6.3.5 安装出错1355 问题解决
查看>>
libreoffice/openoffice c/c++转换office格式为pdf
查看>>
Tomcat 7.0 64位免安装解压版 安装及配置
查看>>
Android 网络编程 初级入门(一)
查看>>
No enclosing instance of type Demo06 is accessible.
查看>>
计算机发展中的两大“杀手”
查看>>
《奔跑吧,兄弟》之王祖蓝的"钥匙配箱子"概率统计问题--->>回眸
查看>>
MDK5(Keil for ARM) 工程建立时遇到的问题集锦
查看>>
(正则表达式)邮件地址爬虫
查看>>
c 编译器及#define和typedef
查看>>
Ubuntu下安装GTK+及Glade开发C应用界面
查看>>
Linux下安装eclipse并配置环境变量
查看>>
assertion 'GTK_IS_WIDGET (widget)' failed的解决办法
查看>>
Ubuntu登录管理员账户时,输入密码后一直在登录界面循环
查看>>
Linux下的定时器以及POSIX定时器:timer_settime()
查看>>