Maison > Questions et réponses > le corps du texte
有人跟我讲,将name进行静态赋值即可,但实例变量不也是属于成员变量吗,也是在整个类实例化的时候产生的啊,跟静态赋值有何区别吗?
伊谢尔伦2017-04-18 10:52:14
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
巴扎黑2017-04-18 10:52:14
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é.
高洛峰2017-04-18 10:52:14
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
.