当前位置: 首页 > 面试题库 >

为什么在null引用上调用(静态)方法不会引发NullPointerException?

潘衡
2023-03-14
问题内容

我用Java编写了这个程序

public class Why {

  public static void test() {
    System.out.println("Passed");
  }

  public static void main(String[] args) {
    Why NULL = null;
    NULL.test();
  }

}

我读到在null对象上调用方法会导致NullPointerException,但是上面的程序不是吗?为什么是这样?我是否理解不正确?


问题答案:

test()是一种static方法。一个static成员所属的类型,并且不需要一个实例来访问。

static构件应该仅可以经由型表达访问。也就是说,你应该将其编写如下:

Why.test(); // always invoke static method on the type it belongs to!

Java确实允许你static通过对象引用表达式访问成员,但这非常容易引起误解,因为这不是static成员访问的实际语义。

Why aNull = null; 
aNull.test(); // DO NOT EVER DO THIS!
// invokes Why.test(), does NOT throw NullPointerException

static通过对象引用表达式访问成员时,仅声明的引用类型很重要。这意味着:

  • 引用是否实际都没有关系null,因为不需要实例
  • 如果引用不是null,则对象的运行时类型是什么都没有关系,就不会动态分配!
    如你所见,实例成员访问在两点上完全相反。这就是为什么永远不要以“非”方式访问static成员的原因,因为这样会在其实际操作中产生非常误导的外观。static


 类似资料:
  • 我真的对此感到困惑!我有2个班,俱乐部和会员。在Membership中,我有方法getMonth();在Club中,我有joinedMonth(),它接受参数'month'--所以用户输入一个月,然后我希望它返回在该特定月份加入的成员资格。 我试图从Club类调用getMonth()方法,这样我就可以继续比较月份的整数。但是,当我试图调用该方法时,我只得到提到的“非静态方法getMonth()不能

  • 问题内容: 是否有可能在Java 引用上创建方法引用的原因 ?这样做可能永远是不正确的,但是会导致错误,以后很难找到: 问题答案: 是否有可能在Java 引用上创建方法引用的原因 ? 不是 ,但是Eclipse在这方面显然存在一个错误(编辑:此问题已得到修复)。根据规范,当您使用JDK的工具时,它会失败,并且在线上会出现NPE 。 证明:http://ideone.com/APWXna(或编译和本

  • 据我所知,通常应该使用类的引用来调用静态方法,或者如果它位于静态方法或静态块中,则可以不引用直接调用它。 但当从子类静态块调用静态方法时,这是否适用? 为什么它允许这样的事情,因为静态方法不是继承的,所以应该只允许使用父类名对吗? 为什么我的子类静态块可以在没有引用或类名的情况下调用父类静态方法?

  • 问题内容: 我有一个非常简单的类,想用作另一个类的子类。但是,当我将其代码放入父类时,我得到: 非静态变量,不能从静态上下文中引用 另一方面,当我将sublass 的类代码放在“父母的”类代码之外时,我不会收到此错误。 为什么会这样呢? 问题答案: 嵌套类(顺便说一下,它 不是 子类)没有被标记为静态的,因此它是一个 内部 类,需要构造一个编码类(JavaApp1)的实例。 选项: 使嵌套类静态

  • 问题内容: java为什么无法从静态环境引用非静态? 问题答案: 要了解原因,你必须了解两者之间的区别。 实例(非静态)方法适用于特定类型(类)的对象。这些是使用新的创建的,如下所示: 要调用实例方法,请在实例(myObject)上调用它: 但是,只能直接在类型上调用静态方法/字段,如下所示: 前一条语句不正确。也可以使用诸如此类的对象引用来引用静态字段, myObject.staticMetho

  • 问题内容: 到目前为止,我有以下代码: } 当我尝试在末尾设置double 时,出现错误消息“无法对非静态方法进行静态引用”。它说解决方法是也使该方法静态化,但是我的教授告诉我不要将该字段静态化。有一个简单的解决方案我只是想念吗? 问题答案: 静态方法属于该类,非静态方法属于该类的 实例 。 当您从呼叫时,您会收到错误消息,因为它与任何实例都没有关联。 您需要创建该类的实例: 然后,您可以调用实例