Java 10的var是什么?与JavaScript的var有哪些异同?
Java 10的
var是什么?和JavaScript的var有可比性吗? 嘿,这个问题问得相当关键!很多人刚看到Java 10里的var都会联想到JavaScript的同名关键字,但其实二者本质上差得十万八千里。让我一步步给你拆解清楚:
一、Java 10的var到底是什么?
Java 10引入var作为保留类型名称(注意不是关键字,这点很重要),核心目的是减少代码冗余,实现局部变量类型推断。简单说就是:当你声明局部变量时,只要初始化语句能让编译器明确推断出类型,就可以用var代替具体的类型名。
举个例子:
// 原来的写法 List<String> userNames = new ArrayList<>(); // 用var简化后 var userNames = new ArrayList<String>();
编译器会自动推断userNames的类型是ArrayList<String>,编译后生成的字节码和原来的写法完全一致——var只是编译期的语法糖,运行时根本看不到它的存在。
关于它的使用限制:
- 只能用于局部变量:包括方法内部、代码块(比如
if/for块)、for循环的变量声明,不能用来声明类的成员变量、方法参数或返回值 - 不能用作类/接口的名称,但可以用作方法名、包名(不过实际开发中没人会这么干)
- 必须在声明时立即初始化:
var num;这种写法会直接编译报错,因为编译器没法推断类型
二、和JavaScript的var的异同点
相同点
说真的,唯一的相同点就是名字一样,除此之外几乎没有共性。
不同点
这才是重点,二者的差异体现在方方面面:
类型系统本质不同
- Java是静态强类型语言:用
var声明的变量,类型在编译时就被确定,之后不能随意改变类型。比如var num = 10; num = "abc";会直接编译报错,因为num被推断为int类型,不能赋值字符串。 - JavaScript是动态弱类型语言:
var声明的变量没有固定类型,随时可以切换类型。比如var num = 10; num = "abc";完全合法,运行时不会有任何问题。
- Java是静态强类型语言:用
作用域规则不同
- Java的
var和普通局部变量一样,遵循块级作用域:在代码块(比如if块)内声明的var变量,块外无法访问。 - JavaScript的
var遵循函数作用域:在代码块内用var声明的变量,整个函数内都能访问,甚至块外如果在函数内的话也能拿到。比如:function test() { if (true) { var age = 25; } console.log(age); // 输出25,因为var是函数作用域 }
- Java的
变量提升特性不同
- Java没有变量提升:
var变量必须先声明初始化才能使用,否则编译报错。 - JavaScript的
var有变量提升:即使在声明前使用变量,也不会报错(只是值为undefined)。比如:console.log(x); // 输出undefined var x = 10;
- Java没有变量提升:
使用范围不同
- Java的
var只能用于局部变量,不能用于类成员、参数、返回值。 - JavaScript的
var可以在全局作用域、函数作用域、代码块内任意位置声明变量。
- Java的
本质角色不同
- Java的
var是语法糖,编译后会被替换成具体的类型,对运行时没有任何影响。 - JavaScript的
var是语言原生的变量声明关键字,和let/const属于同一类语法元素,直接影响变量的生命周期和行为。
- Java的
总结
Java 10的var和JavaScript的var只是名字撞了,本质上是为不同类型语言设计的完全不同的特性:前者是静态强类型语言里减少冗余的语法糖,后者是动态弱类型语言里的变量声明方式,几乎没有可比性。
内容的提问来源于stack exchange,提问作者Eshu
相关产品推荐
相关产品推荐

