Java 11 新特性:var 局部变量类型推断

犬小哈 2024-04-27 约 659 字 大约 3 分钟 共 4 张图 485

友情提示

推荐您使用 Chrome 浏览器来阅读本实战专栏,其他浏览器可能存在兼容性问题。

Java 11 中引入了 var 关键字,它可以简化局部变量的定义。本小节中,我们就来通过相关代码示例,来学习一下这个新特性。

1. 使用限制

var 关键字并不能被随意使用,需满足下面两点:

  • 必须定义在局部,也就是方法内;
  • 必须是能够被推导出来的类型;

2. 使用示例

2.1 基本使用

通过下面这段代码示例,来看下它的基本使用方式:

    public static void main(String[] args) {
        // 主动声明类型
        String str1 = "犬小哈教程";

        // var 类型推导
        var str2 = "犬小哈教程";
        var num = 1;

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(num);
    }

main() 方法中,我们比较了显示的类型定义与 var 类型推导。使用 var 关键字后,编译器会在编译阶段,根据对应的值,推导出对应的类型,效果与显示的类型定义效果相同。

控制台输出如下:

2.2 对象推导

另外,对于自定义的对象,同样能够使用 var 关键字。首先,我们定义一个 Person 对象:

public class Person {
    // 姓名
    private String name;
    // 年龄
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

看下面的使用示例,同样是适用的:

    public static void main(String[] args) {
        // 自定义对象, 同样适用
        Person person1 = new Person("犬小哈", 18);
        var person2 = new Person("犬小哈", 18);

        System.out.println(person1);
        System.out.println(person2);
    }

控制台输出如下:

打开编译后的 class 文件,可以看到,编译器已经帮助我们自动推导出了具体的类型:

2.3 非法使用

var 关键字被使用在方法外部,或者无法够推导它的具体类型时,无法被使用。参考下面的代码示例:

public class Main {
    
    // 不允许非局部使用
    var str = "犬小哈教程";
    var person = new Person();

    public static void main(String[] args) {
    	// 无法推导出具体类型
        var test = null;
        var test2;
    }

}

值为 null ,或者未定义具体的值时,编译器无法推导对应的类型。

在 IDEA 中,上面这段代码,也是爆红状态,如下图所示:

最后编辑于 2024-04-27 21:34:58