Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java 10 实战第 1 篇:局部变量类型推断

Java 10 实战第 1 篇:局部变量类型推断

作者头像
Java技术栈
发布于 2018-07-31 03:01:10
发布于 2018-07-31 03:01:10
75500
代码可运行
举报
文章被收录于专栏:Java技术栈Java技术栈
运行总次数:0
代码可运行

现在 Java 9 被遗弃了直接升级到了 Java 10,之前也发过 Java 10 新特性的文章,现在是开始实战 Java 10 的时候了。

今天要实战的是 Java 10 中最重要的特性:局部变量类型推断,大家都知道是 var 关键字,但具体怎么使用,及要注意什么要点呢?

我们通过几个例子来讲解局部变量类型推断这个新特性!

什么是局部变量类型推断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var javastack = "javastack";
System.out.println(javastack);

大家看出来了,局部变量类型推断就是左边的类型直接使用 var 定义,而不用写具体的类型,编译器能根据右边的表达式自动推断类型,如上面的 String

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var javastack = "javastack";

就等于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String javastack = "javastack";

局部变量类型推断使用示例

既然叫局部变量类型推断,以只能用在局部变量中,下面给出更多使用示例。

1、字面量定义局部变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static void testVar() {
    var javastack = "javastack";
    System.out.println(javastack);
}

2、接收方法返回值定义局部变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static void testMethod() {
    var javastack = getJavastack();
    System.out.println(javastack);
}

public static String getJavastack() {
    return "javastack";
}

3、循环中定义局部变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static void testLoop() {
    for (var i = 0; i < 3; i++) {
        for (var m = 10; m < 15; m++) {
            System.out.println(i + m);
        }
    }
}

4、泛型结合局部变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static void testGeneric() {
    // 表达式1
    List<String> list1 = new ArrayList<>();
    list1.add("javastack");

    // 表达式2
    var list2 = new ArrayList<>();
    list2.add(2018);

    // 表达式3
    var list3 = new ArrayList<String>();
    list3.add("javastack");
}

表达式1后面 <> 里面 jdk 1.7+开始是不用带具体类型的,在接口中指明就行了。

表达式2中如果使用 var 的话, <> 里面默认会是 Object 的,所以可以添加任意类型。

表达式3中在 <> 强制使用了 String 来指定泛型。

局部变量类型推断不能用在以下场景

1、类成员变量类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 编译报错
private var javastack = "Java技术栈";

2、方法返回类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 编译报错
 * @return
 */
public static var getJavastack(){
     return "Java技术栈";
}

3、Lambda 表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static void testLambda() {
    Runnable runnable = () -> System.out.println("javastack");

    // 编译报错
    // var runnable = () -> System.out.println("javastack");
}

以上 3 种场景是肯定不能使用 var 的,其他场合有待验证。

局部变量类型推断优缺点

优点:简化代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CopyOnWriteArrayList list1 = new CopyOnWriteArrayList();
ConcurrentModificationException cme1 = new ConcurrentModificationException();
DefaultServiceUnavailableRetryStrategy strategy1 = new
        DefaultServiceUnavailableRetryStrategy();

var list2 = new CopyOnWriteArrayList<>();
var cme2 = new ConcurrentModificationException();
var strategy2 = new DefaultServiceUnavailableRetryStrategy();

从以上代码可以看出,很长的定义类型会显得代码很冗长,使用 var 大大简化了代码编写,同时类型统一显得代码很对齐。

缺点:掩盖类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var token = new JsonParserDelegate(parser).currentToken();

看以上代码,不进去看返回结果类型,谁知道返回的类型是什么?所以这种情况最好别使用 var,而使用具体的抽象类、接口或者实例类型。

var关键字原理

var其实就是 Java 10 增加的一种语法糖而已,在编译期间会自动推断实际类型,其编译后的字节码和实际类型一致,如以下例子所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static void testByteCode() {
    String javastack1 = "javastack";
    var javastack2 = "javastack";
}

编译成字节码后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static testByteCode()V
L0
LINENUMBER 22 L0
LDC "javastack"
ASTORE 0
L1
LINENUMBER 23 L1
LDC "javastack"
ASTORE 1
L2
LINENUMBER 24 L2
RETURN
L3
LOCALVARIABLE javastack1 Ljava/lang/String; L1 L3 0
LOCALVARIABLE javastack2 Ljava/lang/String; L2 L3 1
MAXSTACK = 1
MAXLOCALS = 2

可以看出 javastack1javastack2 都是虚拟机所认识的的本地变量类型: java.lang.String,虚拟机并不认识 var, 所以 var 并不神奇。

OK,本次 Java 10 局部变量类型推断实战文章就到这里了,后续带来更多的 Java 10 的实战方面的文章。

往期干货推荐

1. 5月份值得一看的 Java 技术干货

2. 图解 https 单向认证和双向认证!

3. 最新后端架构师技术图谱!附学习资料~

4. 京东购物车的 Java 架构实现及原理

5. Java 中的伪共享详解及解决方案

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码
美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。
用户5224393
2019/08/13
3820
Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码
使用Java 10的var类型推断的几个注意点!
不加选择地应用var可能会让代码不容易理解,因为模糊了类型这个概念,而人类是依据类型分类进行逻辑思考的,这样就使事情变得更糟,如果使用得当,var可以帮助改进良好的代码,使其更短更清晰,同时不会影响可理解性。
本人秃顶程序员
2019/05/16
1.3K0
使用Java 10的var类型推断的几个注意点!
35. Groovy 语法 类型知识详解-第二篇 类型推断
接着上篇介绍的类型相关的知识内容,继续了解Groovy中关于类型Typing的相关知识内容。
zinyan.com
2023/02/23
6240
35. Groovy 语法 类型知识详解-第二篇 类型推断
Java 11新特性
Java 11,作为长期支持(LTS)版本,自2018年发布以来,已经成为许多企业的首选。它不仅提供了稳定性,还引入了一系列令人兴奋的新特性。在这篇文章中,我们将深入探讨Java 11的几大亮点,并提供相应的代码示例。让我们一起来探索这些新特性如何改变我们的编程实践,并在文章末尾留下你的点赞和评论,分享你的看法!
疯狂的KK
2024/03/05
8410
Java 11新特性
【小家java】java10新特性(简述十大新特性) 小步迭代
需要注意的是,本次Java10并不是Oracle的官方LTS版本,所以咱们可以先了解新特性。然后坐等java11的发布再考虑在生产中使用吧
YourBatman
2019/09/03
9380
Java 10 新特性解读
开发者经常抱怨Java中引用代码的程度。局部变量的显示类型声明,常常被认为 是不必须的,给一个好听的名字经常可以很清楚的表达出下面应该怎样继续。
一个风轻云淡
2023/10/15
2020
Java 10 新特性解读
面试题:Java中this和super关键字的底层实现原理
今天,我们就一起来讨论一个这个网友遇到的面试题,Java 中 this 和 super 关键字的底层实现原理!
业余草
2020/06/16
1.1K0
面试题:Java中this和super关键字的底层实现原理
JAVA9-17特性梳理
增加方法takeWhile dropWhile ofNullable iterate
路过君
2022/04/13
1980
Java Lambda表达式
Java Lambda表达式是Java8中的新特性。Java lambda表达式是Java进入函数式编程的第一步。因此,Java lambda表达式是可以单独创建的函数,而无需属于任何类。Java lambda 表达式可以像对象一样传递并按需执行。
三分恶
2020/07/20
1.2K0
JDK10新特性
G1 是设计来作为一种低延时的垃圾回收器。G1收集器还可以进行非常精确地对停顿进行控制。从JDK7开始启用G1 垃圾回收器,在JDK9中G1成为默认垃圾回收策略。截止到ava 9,G1的Full GC采用的是单线程算法。也就是说G1在 发生Full GC时会严重影响性能。
大忽悠爱学习
2022/06/01
3280
JDK10新特性
Java 11正式发布,这几个逆天新特性教你写出更牛逼的代码
就在前段时间,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用! 这无疑对我们来说是一大好的消息。作为一名java开发者来说,虽然又要去学习和了解java11,但内心还是欣慰的。我想至少你和我一样的心情:Java在手,天下我有!
格姗知识圈
2019/07/19
5510
Java 11正式发布,这几个逆天新特性教你写出更牛逼的代码
JDK8-JDK17中的新特性(var类型推断、模式匹配、Record、密封类)
新的语法结构,勾勒出了 Java 语法进化的一个趋势,将开发者从复杂、繁琐的低层次抽象中逐渐解放出来,以更高层次、更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。
鱼找水需要时间
2023/06/01
3.2K0
JDK8-JDK17中的新特性(var类型推断、模式匹配、Record、密封类)
《Kotlin 程序设计》第四章 Kotlin 语法基础
Kotlin 可以省略变量定义的类型声明,但是在定义参数列表和定义返回值类型时则必须明确指定类型(这个类型推断Kotlin居然没做,这地方用起来比Scala,Groovy要繁琐点)。
一个会写诗的程序员
2018/08/17
1.5K0
翻译 – Java局部变量类型推断的代码风格规范
原作者:Stuart W. Marks/2018-03-22 原文链接:http://openjdk.java.net/projects/amber/LVTIstyle.html
KAAAsS
2022/01/14
4970
Java中的类型推断和lambda表达式
java是强类型的编程语言,每个java中使用到的变量都需要定义它的类型,否则会编译失败。强类型语言的好处就是可以尽可能的在编译期间就发现代码中可能出现的问题,从而减少在运行时出现问题的可能性。
程序那些事
2020/07/08
1.1K0
Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码
美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。
JAVA高级架构开发
2018/09/27
5230
Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码
不能用 + 拼接字符串? 这次我要吊打面试官!
好久没维护《吊打面试官》系列了,今天再来一篇,这次真的要吊打了,哈哈!(看往期吊打系列请在后台回复:吊打,我会陆续更新……)
Java技术栈
2019/12/23
7010
不能用 + 拼接字符串? 这次我要吊打面试官!
JDK10改变你对Java的原有认知
我们昨天说了关于 JDK9 的相关内容,但是 JDK9 相对于 JDK8 来说,没有做出太大的改变,但是从 JDK11 之后,我们就可以看出,JDK 的变更迭代是确确实实的有点厉害了,更别说现在 JDK 都已经更新到20了,但是该学习的还是得学习呀,今天我们就来讲讲这个关于 JDK10 中发生了哪些变化,我们应该怎么使用。
Java极客技术
2023/09/14
1670
JDK10改变你对Java的原有认知
Java 8 - 04 类型检查、类型推断以及限制
当我们第一次提到Lambda表达式时,说它可以为函数式接口生成一个实例。然而,Lambda 表达式本身并不包含它在实现哪个函数式接口的信息。为了全面了解Lambda表达式,women 应该知道Lambda的实际类型是什么 .
小小工匠
2021/08/17
8890
JDK10的新特性:本地变量类型var
java以面向对象的特性显著于世并得到了蓬勃的发展。在语言的发展过程中,为了让java语言更加简洁和方便使用,JDK也在不断的进行改进。
程序那些事
2020/07/08
3970
推荐阅读
相关推荐
Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验