Java initsialiseerimiskorralduse kontrollimine (mõtlemise käivitab Ei saa viidata XXX enne, kui supertüübi konstruktori kutsumine on tehtud)

Verification Java Initialization Order



1. Probleemi avastamine

Hiljuti andmebaasis kodeerides leidsin kogemata tõrketeate: 'Ei saa viidata XXX-le enne, kui supertüüpi konstruktorit on kutsutud'. Tähendus on ilmne, sellele muutujale ei saa enne vanema klassi konstruktori initsialiseerimist viidata. Kui sellele muutujale lisatakse algmuutuja, ei teatata veast.
pilt

2. Oletuste kontrollimine

Miks siis pärast staatilise muudatuse lisamist vead teatatakse? Ilmselt on see seotud Java initsialiseerimise järjekorraga. Seetõttu kirjutas Coder Java initsialiseerimise järjekorra kontrollimiseks kinnituskoodi

/** * father */ public class Base { static String sVar = getString('Parent class static variable initialization') public String var = getString('Parent class non-static variable initialization') static { System.out.println('The static initialization block of the parent class') } { System.out.println('Non-static initialization block of parent class') } public Base() { System.out.println('Parent class constructor start') draw('The parent class calls the draw method')//The method covered by the subclass will be called, here is null System.out.println('Parent class constructor end') } static String getString(String base) { System.out.println(base) return base } public void draw(String string) { System.out.println(string) } } /** * Subclass */ public class SubClass extends Base { public String var = getString('Subclass initializes non-static variables') private String subVar = getString('Subclass initializes private variables') static String superVar = getString('Subclass initializes static variables') static { System.out.println('Static initialization block for subclasses') } { System.out.println('Non-static initialization block for subclasses') } SubClass() { System.out.println('Subclass constructor start') draw('Subclass calls draw method') System.out.println('Subclass constructor end') } public void draw(String string) { System.out.println(string + subVar) } public static void main(String[] args) { new SubClass() } } Parent class static variable initialization Static initialization block of the parent class Subclass initializes static variables Static initialization block of subclass Parent class non-static variable initialization Non-static initialization block of the parent class Parent class constructor start The parent class calls the draw method null Parent class constructor end Subclass initializes non-static variables Subclass initializes private variables Non-static initialization block of subclass Subclass constructor start The subclass calls the draw method and the subclass initializes private variables Subclass constructor end

3. Tulemuste analüüs

Sellest tulemusest näeme artikli alguses ilmnenud vea põhjust selgelt: algklassi konstruktori initsialiseerimine on varasem kui alamklassi mittestaatiliste muutujate initsialiseerimine ja hilisem kui alamklassi staatiliste muutujate initsialiseerimine . Seega, kui muudame muutuja staatiliseks muutmiseks, siis enam vigu ei teatata. Võite ise proovida Java initsialiseerimise protsessi, millest on tulevases programmeerimises palju kasu.