java - 请问下,这里为何会引发空指针异常?
黄舟
黄舟 2017-04-18 10:50:14
0
3
569

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(3)
伊谢尔伦

Le constructeur de la classe parent est exécuté avant le constructeur de la sous-classe, Base()->test()-->name.length() est équivalent à null.length().
Si vous écrivez name comme statique, bien sûr, c'est OK, car les membres statiques sont initialisés avant que les membres de l'instance ne soient initialisés.

L'ordre est à peu près le suivant :

  • Classe Parentstatic{...}

  • Membres statiques de la classe parent

  • Méthode de construction de la classe parent

  • Sous-classestatic{...}

  • Membres statiques de la sous-classe

  • Méthode de construction de sous-classe

巴扎黑

Tout d'abord, jetez un concept, le processus d'initialisation d'un objet :
静态变量 > 静态初始化块 > 实例变量 > 构造器
Et pour les objets ayant une relation de classe parent-enfant, il existe un processus d'initialisation imbriqué
父类初始化流程 > 子类初始化流程

Ainsi, lors de votre processus d'instanciation, lorsque vous appelez le constructeur de la classe parent et appelez la méthode test(), le name de la sous-classe n'a pas encore reçu de valeur et est toujours null, donc un pointeur nul sera naturellement signalé.

小葫芦

Vous n'obtiendrez pas d'erreur si vous définissez name dans la classe parent Base. Parce que lorsque vous instanciez Sub, le constructeur par défaut sera appelé, et le constructeur par défaut appellera le constructeur de la classe parent, vous utilisez la méthode test(), et vous êtes dans la sous-classe. Cette méthode a été réécrite et test est utilisée dans la méthode name de la sous-classe, mais à ce moment name n'a pas encore terminé l'initialisation. Je ferai donc rapport NullPointerException.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal