请问下,这里为何会引发空指针异常?

图片描述

有人跟我讲,将name进行静态赋值即可,但实例变量不也是属于成员变量吗,也是在整个类实例化的时候产生的啊,跟静态赋值有何区别吗?

阅读 3.6k
3 个回答

父类的构造方法先于子类构造方法执行,Base()->test()-->name.length()相当于null.length()
name写成静态的话,当然可以了,因为静态成员的初始化先于实例成员的初始化。

顺序大概是这样的:

  • 父类static{...}

  • 父类静态成员

  • 父类构造方法

  • 子类static{...}

  • 子类静态成员

  • 子类构造方法

首先抛出一个概念,对象的初始化流程:
静态变量 > 静态初始化块 > 实例变量 > 构造器
而存在父子类关系的对象,又存在一个嵌套的初始化流程
父类初始化流程 > 子类初始化流程

所以在你实例化的过程中,调用父类构造器并调用test()方法时,子类的name还没有赋值,仍然是null,自然就会报空指针。

你把name放在父类Base中定义就不会报错。 因为你实例化Sub时,会调用默认的构造函数,默认的构造函数会调用父类的构造函数,在父类的构造函数中,你使用了test()方法,而你在子类中重写了该方法,子类的test方法内使用了name,但是这时候name还没有完成初始化。所以会报NullPointerException

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题