Pembina kelas induk dilaksanakan sebelum pembina subkelas, Base()->test()-->name.length() bersamaan dengan null.length(). Jika anda menulis name sebagai statik, sudah tentu ia OK, kerana ahli statik dimulakan sebelum ahli instance dimulakan.
Pertama sekali, buang konsep, proses pemulaan objek: 静态变量 > 静态初始化块 > 实例变量 > 构造器 Dan untuk objek dengan hubungan kelas ibu bapa-anak, terdapat proses pemulaan bersarang 父类初始化流程 > 子类初始化流程
Jadi semasa proses instantiasi anda, apabila anda memanggil pembina kelas induk dan memanggil kaedah test(), subkelas name belum lagi diberikan nilai dan masih null, jadi penunjuk nol secara semula jadi akan dilaporkan.
Anda tidak akan mendapat ralat jika anda mentakrifkan name dalam kelas induk Base. Kerana apabila anda membuat instantiate Sub, pembina lalai akan dipanggil, dan pembina lalai akan memanggil pembina kelas induk Dalam pembina kelas induk, anda menggunakan kaedah test(), dan anda berada dalam subkelas. Kaedah ini telah ditulis semula, dan test digunakan dalam kaedah name subkelas, tetapi pada masa ini name masih belum melengkapkan pemula. Jadi saya akan melaporkan NullPointerException.
Pembina kelas induk dilaksanakan sebelum pembina subkelas,
Base()->test()-->name.length()
bersamaan dengannull.length()
.Jika anda menulis
name
sebagai statik, sudah tentu ia OK, kerana ahli statik dimulakan sebelum ahli instance dimulakan.Tempahan adalah lebih kurang seperti berikut:
Kelas ibu bapa
static{...}
Ahli statik kelas induk
Kaedah pembinaan kelas ibu bapa
Subkelas
static{...}
Ahli statik subkelas
Kaedah pembinaan subkelas
Pertama sekali, buang konsep, proses pemulaan objek:
静态变量 > 静态初始化块 > 实例变量 > 构造器
Dan untuk objek dengan hubungan kelas ibu bapa-anak, terdapat proses pemulaan bersarang
父类初始化流程 > 子类初始化流程
Jadi semasa proses instantiasi anda, apabila anda memanggil pembina kelas induk dan memanggil kaedah
test()
, subkelasname
belum lagi diberikan nilai dan masihnull
, jadi penunjuk nol secara semula jadi akan dilaporkan.Anda tidak akan mendapat ralat jika anda mentakrifkan
name
dalam kelas indukBase
. Kerana apabila anda membuat instantiateSub
, pembina lalai akan dipanggil, dan pembina lalai akan memanggil pembina kelas induk Dalam pembina kelas induk, anda menggunakan kaedahtest()
, dan anda berada dalam subkelas. Kaedah ini telah ditulis semula, dantest
digunakan dalam kaedahname
subkelas, tetapi pada masa ininame
masih belum melengkapkan pemula. Jadi saya akan melaporkanNullPointerException
.