フェイス質問シェア
public class A {public static void fun1() {
System.out.println("fun1");
}
public void fun2() {
System.out.println("fun2");
}
public static void main(String[] args) {
((A) null).fun1();
((A) null).fun2();
}
}
タイトル:
上記のコードでコンパイルするのですか?
ことができるように、結果は何ですか?回答:
コードでコンパイルすることができ、ヌルはどのようなタイプに強制することができ、例外レポートではありませんそのクラスの静的メソッドを呼び出すクラス非静的メソッドを呼び出すと、nullポインタ例外を報告します
理解
执行下面代码打印结果为 null:
A a = (A) null;
System.out.println(a);
由于将 null 强转为 A 的对象,编译上可以通过,
但是实际值仍然为 null,非静态方法是属于对象的方法,
所以调用非静态方法会报空指针异常
执行以下代码不报异常:
A a2 = null;
a2.fun1();
由于 fun1 是静态方法,静态方法数随着类加载而加载的,
所以 java 编译器在编译的过程中对我们的代码进行的了优化,
我们通过查看 class 文件即可看出,这两行代码改变成为了下面的样式:
A a2 = null;
fun1();
理由
Javaコンパイラは、静的メソッドを呼び出すために、クラスオブジェクトで使用するために最適化されています。最適化FUN1にa2.fun1()については()
Javaが直接静的メソッドを呼び出すクラス名を使用することをお勧めします、これにより符号化効率を向上させるために、コンパイラの仕事を減らすこと、。
図示のように:左のJavaソースファイル、クラスファイルをコンパイルする権利