可能重复:
Static fields on a null reference in Java
我知道静态方法是在类级别上的。所以我意识到我不需要创建实例来调用静态方法。但我也意识到我可以像调用实例方法一样调用静态方法。这就是我感到困惑的地方,因为在从空对象调用静态方法时(就像调用实例方法一样),我需要一个NullPointerException
。如果能解释一下为什么我在这里期望一个NullPointerException
是错误的,我会非常感激。
以下是示例代码:
public class SampleClass {
public static int getSumStatic(int x, int y){
return x+y;
}
public int getDifferenceInstance(int x, int y){
return x-y;
}
}
public class TestClass {
public static void main (String[] args){
SampleClass sc=null;
System.out.println(SampleClass.getSumStatic(2, 2)); //as expected
//I was expecting NullPointerException in the next line, since I am accessing null object
System.out.println(sc.getSumStatic(4,5)); //static method , executes perfectly
System.out.println(sc.getDifferenceInstance(6,4));//throws NullPointerException
}
}
发布于 2012-10-01 05:58:34
通过实例调用静态方法不需要实例在那里。只要编译器能够确定变量的类型,它就会在计算sc
表达式并丢弃结果后静态地进行等效调用:
System.out.println(SampleClass.getSumStatic(4,5));
第15.12.1节
如果表单为Primary.NonWildTypeArgumentsopt Identifier
,则方法的名称为❖。设T是主表达式的类型。如果T是类或接口类型,则要搜索的类或接口是T,如果T是类型变量,则是T的上界。
第15.12.4.1节:
❖如果调用模式是静态的,则没有目标引用。将对表达式Primary求值,但随后会丢弃结果。
发布于 2012-10-01 06:06:30
这是java设计者的某种设计错误。您应该在类上调用静态方法,因为它属于类而不是对象。
您可以在why-isnt-calling-a-static-method-by-way-of-an-instance-an-error-for-the-java-co上看到有关此问题的一些信息
有趣的是,在未初始化的对象变量上调用静态方法是不可能的。但是如果对象被初始化为null,那么一切都是正常的。
我认为这是可行的,因为用这个变量存储的对象通过赋值提供了类型信息。
SampleClass sampleObject;
sampleObject.getSumStatic(2, 2)
不会编译,因为对象未初始化,因此在java编译器的语法树中没有设置任何类型信息。
发布于 2012-10-01 05:59:46
Java将允许您简单地基于引用来访问静态方法,即使引用是null
。只有引用的类型是重要的。
通常应该使用类名来调用静态方法:
SampleClass.getSumStatic(2, 2);
https://stackoverflow.com/questions/12665474
复制相似问题