我很想知道您如何解释我在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);
}
}
答案 0 :(得分:11)
访问静态方法或变量可以通过包含该静态方法/变量的类的空引用来完成。
由于name
是静态的,getFoo().name
与Foo.name
或name
的结果相同,无论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文件的字节代码,揭示了当name
为static
时,为什么您没有看到NullPointerException的信息。< / p>
使用上面的代码,当反汇编它产生以下输出。
如果我们查看黄色框,我们会看到编译器确定我们正在尝试访问静态字段,因此它会放置 getstatic 指令以获取字段name
。因此,这实际上并没有使用从getFoo
方法返回的实例来获取name
字段的值,因此不会引发NPE。
如果我们在static
之前移除了String name = " JavaQuiz";
关键字,则会产生以下反汇编代码。
这里我们可以看到java编译器指示使用getfield
指令,这将在实例上调用,即从getFoo
方法返回。因此,如果getFoo
方法返回null
,则会引发NPE。
如此有效,在这种情况下,java编译器在编译期间发挥了作用,即,如果代码调用静态字段,它会放置getstatic
指令而不会导致使用对象引用
我们可以找到有关指令集here的更多信息。