staticJava中的成员(static字段或static方法)与其各自的类相关联,而不是与此类的对象相关联.以下代码尝试访问null引用上的静态字段.
public class Main
{
private static final int value = 10;
public Main getNull()
{
return null;
}
public static void main(String[] args)
{
Main main=new Main();
System.out.println("value = "+main.getNull().value);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然main.getNull()返回null,但它可以工作和显示value = 10.这段代码是如何工作的?
我相信你们都知道我的意思 - 代码如下:
Thread thread = new Thread();
int activeCount = thread.activeCount();
Run Code Online (Sandbox Code Playgroud)
引发编译器警告.为什么不是错误?
编辑:
要明确:问题与Threads无关.我意识到在讨论这个问题时经常给出Thread示例,因为它们可能真的搞砸了它们.但问题确实是这样的使用总是无稽之谈,你不能(胜任地)写出这样的电话并且意味着它.这种类型的方法调用的任何例子都是barmy.这是另一个:
String hello = "hello";
String number123AsString = hello.valueOf(123);
Run Code Online (Sandbox Code Playgroud)
这使得它看起来好像每个String实例都带有"String valueOf(int i)"方法.
以下简单的代码片段工作正常,并使用null对象访问静态字段.
final class TestNull
{
public static int field=100;
public TestNull temp()
{
return(null);
}
}
public class Main
{
public static void main(String[] args)
{
System.out.println(new TestNull().temp().field);
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,System.out.println(new TestNull().temp().field);静态字段字段与NULL对象关联的语句new TestNull().temp()仍然返回正确的值100,而不是在Java中抛出空指针异常!为什么?