谢谢空指针 https://stackoverflow.com/users/1746118/nullpointer提供一个link https://tio.run/#java-jdk通过在线 Java 10 编译器,我得到了以下有趣的结果:
public class Main {
static class A {
public void someMethod() { System.out.println(this.getClass().getName()); }
}
static class B extends A{
@Override
public void someMethod() { System.out.println("Derived: " + this.getClass().getName()); }
}
public static void main(String[] args) {
var myA = new A();
myA.someMethod();
myA = new B(); // does not fail to compile!
myA.someMethod();
}
}
和输出:
Main$A // As expected
Derived: Main$B // As expected in inheritance
结论 - var 是语法糖:var myA = new A()
相当于A myA = new A()
,以及与之相关的所有 OOP。
PS:我试着用一个持有匿名类的 var 玩了一下,并想出了这个有趣的行为 - 感谢(再次)空指针 https://stackoverflow.com/users/1746118/nullpointer提及它作为重复项为什么我们不能将两个推断变量作为匿名类互相分配 https://stackoverflow.com/questions/49580431/why-cant-assign-2-inferred-var-as-anonymous-class-to-each-other:
static interface Inter {
public void method();
}
public static void main(String[] args) {
var inter = new Inter() {
@Override
public void method() {System.out.println("popo");}
};
inter.method();
inter = new Inter() {
@Override
public void method() {System.out.println("koko");}
};
inter.method();
}
和输出:
Main.java:11: error: incompatible types: <anonymous Inter> cannot be converted to <anonymous Inter>
inter = new Inter() {
^
由于第二个匿名类类型与第一个匿名类类型不同,对 var 的第二次赋值失败 - 强制执行 的语法糖角色var
关键词。
令人惊讶的是,错误消息并没有更加精确 - 目前它没有什么意义,因为错误中显示的类型名称是相同的!