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.
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.
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 Parent
static{...}
Membres statiques de la classe parent
Méthode de construction de la classe parent
Sous-classe
static{...}
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()
, lename
de la sous-classe n'a pas encore reçu de valeur et est toujoursnull
, donc un pointeur nul sera naturellement signalé.Vous n'obtiendrez pas d'erreur si vous définissez
name
dans la classe parentBase
. Parce que lorsque vous instanciezSub
, le constructeur par défaut sera appelé, et le constructeur par défaut appellera le constructeur de la classe parent, vous utilisez la méthodetest()
, et vous êtes dans la sous-classe. Cette méthode a été réécrite ettest
est utilisée dans la méthodename
de la sous-classe, mais à ce momentname
n'a pas encore terminé l'initialisation. Je ferai donc rapportNullPointerException
.