我遇到了以下代码:
public class TradingSystem {
private static String category = "electronic trading system";
public static void main(String[] args) {
TradingSystem system = null;
System.out.println(system.category);
}
Output: 电子交易系统
我很惊讶没有找到NullPointerException!
Q1。为什么它没有抛出NullPointerException
?
Q2。或者在编译时,由于具有static
的类别声明使得用TradingSystem
替换系统(即对象引用),因此基本上调用了TradingSystem.category
?
答案 0 :(得分:7)
Java允许使用实例语法访问类变量(即static
个)。换句话说,编译器允许您编写system.category
,但它将其解析为TradingSystem.category
,它独立于访问它的实例。
这就是为什么你没有得到NullPointerException
。但是,这种语法不易读取和混淆。这就是为什么您应该收到警告并建议使用TradingSystem.category
代替system.category
。
答案 1 :(得分:3)
您的代码在概念上与以下代码没有区别。
public class TradingSystem {
private static String category = "electronic trading system";
public static void main(String[] args) {
System.out.println(TradingSystem.category);
}
}
即使您似乎使用系统对象引用,您实际上也在使用静态值。 Java允许在使用静态时使用实例,但您应该更喜欢上面的语法,以便明确使用静态的。
答案 2 :(得分:1)
您永远不应该使用类实例调用静态方法,也不需要它。由于静态方法是在类级别执行的,因此不使用该实例,因此不会抛出空指针异常。
答案 3 :(得分:1)
静态被称为“OF CLASS”不是为了类的对象。所以这里
的System.out.println(system.category); “系统充当TradingSystem”
哪个是对的。因为您不需要实例化对象来唤起静态标记的字段或方法。