为什么没有这个代码抛出的NullPointerException(why doesn't t

2019-07-04 16:35发布

我只是在讨论有关调用使用类的名字和我的朋友静态方法和尝试了这种代码,并预计其在runtime.but抛出NPE,因为它变成它力。 我只是想了解的执行顺序。

public class One {

    public static void method() {
        System.out.println("in static one");
    }
}

public class Two {

    static One o;

    public static void main(String[] args) {
        o.method(); // expected NPE here, as o is null
    }
}

我知道,静态方法应与类名来调用,我甚至知道IDE的将给予一个编译器警告,当我们要求有一个实例的静态方法 。 但我们也可以通过创建一个实例调用它们,但是,我从来没有创建一个实例在这里, o应该得到它的默认值零,从而调用o.method()应在运行时抛出一个NPE,但事实并非如此。 你们可以请洒在执行顺序是如何在这段代码的一些情况。

Answer 1:

它的工作原理是因为什么重要的是在编译时类型 o场。 编译器将编译o.method()成相同的字节代码作为One.method()

特别是,如果你有一个类Two扩展One ,并且两个声明static void method()然后

One x = new Two();
x.method(); // calls One.method(), not Two.method()

适合混淆的目的,可维护性好少...



Answer 2:

method所以也没有在意是静态的One实例。

One o = null;
o.method();

是相同的:

One.method();


Answer 3:

static方法或变量与类定义本身 ,而不是与类实例相关联 。 因此,你的method()可以用o ,但理想的情况下,你应该使用类名本身调用它:

     One.method();//static way of calling static methods


Answer 4:

因为你声明static One o; 外部main功能。 您可以尝试声明它里面main功能,它甚至不能编译...

或者你可以将它声明为One o = nullmain ,那么它会被编译,但它一样One.method()



Answer 5:

如果你想在你的开发环境如(Eclipse中)打开了代码,而不是用在这里展示的代码,它确实提供了斜体样式的静态方法的代码格式化愚弄的人,那么你会看到关于“不要说的CheckStyle索赔呼吁的实例”的静态方法。

所以它应该是

One.method()

代替

o.method()

那么很显然,为什么它不会崩溃!



文章来源: why doesn't this code throw NullPointerException