ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java10类型推导

2019-08-19 10:01:07  阅读:259  来源: 互联网

标签:itcast Java10 推导 局部变量 var 类型 public 定义


Java10类型推导

引言

​ 2018年3月20日,大家期待已久的Java 10发布了,Java 10推出很多新的特性,比如局部变量类型推导、应用类数据共享、并行全垃圾回收器 G1等等,其中和我们开发者息息相关的就是局部变量类型推导,今天我们就来聊一聊Java 10的局部变量类型推导。

概念

​ 所谓的局部变量类型推导其实就是通过增强java语言特性将类型推断扩展到局部变量,它引入了其他语言中很常见的“var”,其表现形式也类似于JavaScript的中的"var",只要编译器可以推断此种类型,你就不再需要专门声明一个局部变量的类型。

应用场景

java 10的局部变量类型推导不是在所有的地方都可以使用的,java10规定:

  • 局部变量类型仅限于如下使用场景:
    • 局部变量初始化
    • for循环内部索引变量
    • 传统的for循环声明变量
  • 局部变量类型推导它不能用于以下几个地方:
    • 方法参数
    • 构造函数参数
    • 方法返回类型
    • ​类的字段

示例代码

1.在定义局部变量的时候使用

在定义局部变量时,使用var来定义。

package cn.itcast.demo;

public class Demo1 {

    public static void main(String[] args) {
        var number = 1;
        var message ="Hello itcast";
        System.out.println("这是第"+number+"个消息:"+message);
    }
}

运行效果如下:

Java10类型推导

分析

​ 由上面的代码我们发现,在定义局部变量的时候我们使用了var来定义变量,并不会出现编译错误,并且执行也没有任何的问题。查看.class文件我们会发现:

package cn.itcast.demo;

import java.io.PrintStream;

public class Demo1
{

    public Demo1()
    {
    }

    public static void main(String args[])
    {
        int number = 1;
        String message = "Hello itcast";
        System.out.println((new StringBuilder("\u8FD9\u662F\u7B2C"))
                           .append(number)
                           .append("\u4E2A\u6D88\u606F:")
                           .append(message).toString());
    }
}

虽然在定义局部变量的时候我们使用了var来定义,但是将java文件转化成.class文件的时候,会根据变量的值的具体类型推导出变量的类型,1是数字所以推导为了int类型,"Hello itcast"是字符串所以推导为了String类型。

小结

​ 通过上面的示例我们知道在定义局部变量的时候可以像javascript一样使用var来定义,在java文件转化成.class文件的时候会根据变量值的类型推导出变量的类型。

2.for循环内部索引变量和内部设置变量时使用

在进行for循环的时候,内部的索引变量可以使用var来定义。

package cn.itcast.demo;

public class Demo2 {

    public static void main(String[] args) {
        var msgs = new String[]{"itcast","itheima"};
        for (var i = 0; i < msgs.length; i++) {
            var str="你好!";
            System.out.println(str+msgs[i]);
        }
    }
}

运行效果如下:

Java10类型推导

小结

​ 通过上面的示例我们发现var也可以用在for循环内部定义索引变量时使用,通过也可以在for内部定义局部变量时使用。

3.var不能定义方法的参数的类型

在定义方法的时候,var是不能作为方法的参数类型来使用。

package cn.itcast.demo;

public class Demo3 {

    public void show(var message) {
        System.out.println(message);
    }

}

如上所示,在方法中使用var来定义参数的类型的时候,是直接会报编译错误。

4.var不能定义构造函数的参数的类型

package cn.itcast.demo;

public class Demo4 {

    public Demo4(var message) {

    }
}

如上所示,在方法中使用var来定义构造函数的参数的类型的时候,是直接会报编译错误。

5.var不能作为方法的返回值的类型

package cn.itcast.demo;

public class Demo5 {

    public var show() {
        return "Hello itcast";
    }

}

如上所示,当var作为方法的返回值的类型的时候,是直接会报编译错误。

5.var不能用来定义类的字段的类型

package cn.itcast.demo;

public class Demo6 {

    public var id;
    private var name="张三";
    private var password=123456;

}

如上所示,当使用var来定义类的字段的类型的时候,是直接会报编译错误。

小结

​ 通过上面的示例我们发现当使用var作为方法参数、方法返回值类型、声明定义字段等的时候直接会报出编译错误,也就表示var在定义变量的时候并不是万能的。

总结

​ 局部变量类型推导是java10推出的新特性之一,通过示例我们发现在处理var时,编译器先是查看表达式右边部分,并将它作为变量的类型,然后将该类型写入字节码当中,但是局部变量类型推导现在还不完善,只能在特定的场景下才能使用,不能兼容所有的场景,虽然如此,但是它避免了信息冗余,而且对齐了变量名,更容易阅读。

标签:itcast,Java10,推导,局部变量,var,类型,public,定义
来源: https://blog.51cto.com/14473726/2430607

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有