在null对象上调用静态方法

时间:2016-04-03 07:25:55

标签: java null

我很想知道您如何解释我在quiz中找到的这项任务? 即使getFoo方法返回null,输出仍为Getting Object JavaQuiz。我认为它应该是NullPointerException

   public class Foo {

        static String name = " JavaQuiz";

        static Foo getFoo() {
            System.out.print("Getting Object");
            return null;
        }

        public static void main(String[] args) {
            System.out.println(getFoo().name);
        }

   }

3 个答案:

答案 0 :(得分:11)

访问静态方法或变量可以通过包含该静态方法/变量的类的空引用来完成。

由于name是静态的,getFoo().nameFoo.namename的结果相同,无论getFoo()是否返回null }。

但是,在访问静态方法/变量时使用类名总是更好,因为它清楚表明您打算访问静态成员。

答案 1 :(得分:2)

static class成员的class成员是static级成员,这意味着无需使用Object来访问这些classloader成员。

jvm static String name = " JavaQuiz"; //load when class get loaded by JVM class loader. 加载课程时会自动加载。所以在这种情况下

static

这个Foo变量将在课程jvm加载到static Foo getFoo() { //method is also a static Member automatically loaded at Class Loading. System.out.print("Getting Object"); return null; } 之后存在于内存中。

getFoo()

同样适用于此静态方法System.out.println(getFoo().name);

所以这里class StaticExample { static String abc ="India"; public static void main (String[] args) throws java.lang.Exception { StaticExample obj = null; System.out.println("Value is ==>" + obj.abc + StaticExample.abc + abc); } } 。 这是一个支持我的答案的例子

 Value is ==>IndiaIndiaIndia

输出: -

     System.out.println(((Ideone)null).abc); // this will also print India.

这里这行代码也会产生输出。

 Value is ==>India

输出: -

getFoo()
  

注意: - 我认为.name方法存在混淆,但如果name造成歧义。 className是静态成员,因此可以使用null或任何name引用进行访问。因此,在这里您可以假设这种情况,使用任何空引用访问此bootstrap.js变量。

希望你明白了。

答案 2 :(得分:0)

反汇编(javap -c Foo) Foo.java文件的字节代码,揭示了当namestatic时,为什么您没有看到NullPointerException的信息。< / p>

使用上面的代码,当反汇编它产生以下输出。

With Static field

如果我们查看黄色框,我们会看到编译器确定我们正在尝试访问静态字段,因此它会放置 getstatic 指令以获取字段name。因此,这实际上并没有使用从getFoo方法返回的实例来获取name字段的值,因此不会引发NPE。

如果我们在static之前移除了String name = " JavaQuiz";关键字,则会产生以下反汇编代码。

Without static keyword

这里我们可以看到java编译器指示使用getfield指令,这将在实例上调用,即从getFoo方法返回。因此,如果getFoo方法返回null,则会引发NPE。

如此有效,在这种情况下,java编译器在编译期间发挥了作用,即,如果代码调用静态字段,它会放置getstatic指令而不会导致使用对象引用

我们可以找到有关指令集here的更多信息。