Ordinea de execuție a constructorilor

În procesul de creare a unei clase de obiecte extins mașină virtuală alocă memorie pentru a stoca toate domeniile sale, inclusiv cele care sunt moștenite de la o clasă de bază, iar acesta din urmă primesc setările implicite inițiale care îndeplinesc tipurile lor (O (zero) - pentru toate tipurile numerice, false - pentru boolean, '\ uOOOO' pentru char și null pentru referințe de obiecte). Apoi procesul poate fi împărțit în trei etape:

1) sunați constructorul clasei de bază;

2) asignarea valorilor inițiale la câmpurile obiectului prin executarea expresiilor corespunzătoare și a blocurilor de inițializare;

3) punerea în aplicare a instrucțiunilor furnizate în organismul proiectantului.

Mai întâi, se face o trimitere explicită sau indirectă la constructorul clasei de bază. În cazul în care a efectuat un apel explicit pentru constructorul clasei derivate folosind această referință, un astfel de lanț de apeluri către constructorii din această clasă se execută în sus, până când instrucțiunea nu este găsită referire explicită sau implicită constructorului clasei de baza, atunci un astfel și numit. baza constructorului clasei este executat în conformitate cu aceeași secvență de pași - procesul continuă recursiv, care se încheie la atingerea constructorului clasei Object, deoarece nu este încă constructorii de clasă mai mare nivel ierarhic. In expresiile efectuate în timpul apelului constructorului clasei de baza nu este permis nici o referire la prezența membrilor obiectului curent.

În cele din urmă, corpul constructorului este executat. În cazul în care constructorul curent a fost numit în mod explicit, la finalizarea acestuia, se trece la organul de inițiere a constructorului, în cazul în care sunt executate instrucțiunile rămase. Procesul se repetă până la până la controlul este transferat înapoi la derivatul „original“ corp Class constructor al cărui nume a fost specificat în termeni noi.

În cazul în care, în timpul procesului de construcție a unei excepții este aruncată, mașina virtuală completează noua expresie, generând aceeași excepție, și nu returnează referința obiect de așteptat. Ca o expresie a unui apel explicit pentru constructorul curent sau de bază de clasă trebuie să fie primul în corpul de deschidere proiectantul, pentru a prinde o excepție aruncată apelează constructorul, este imposibil. (Dacă limba permite acest lucru, ar exista o probabilitate de a crea obiecte cu starea inițială greșită.)

Mai jos este un exemplu care ilustrează diferitele etape ale procesului de construire a unui obiect al unei clase derivate.

protejat int xMask = 0x00ff;

protejat int fullMask;

Dacă metodele sunt invocate în timpul construirii unui obiect, este important să înțelegeți ordinea operațiilor și să înțelegeți ce se întâmplă în fiecare etapă a procesului. În această situație, atunci când suntem apelați la o metodă, întotdeauna avem de-a face cu versiunea acestei metode pentru tipul obiectului real; Disponibilitatea datelor sursă furnizate în câmpurile obiectului nu este garantată în acest moment. De exemplu, dacă în etapa 5 X ar determina masca metoda constructor, pentru a utiliza curent fullMask câmp valoare, 0x00ff egală, dar nu 0xFFFF. Și pe bună dreptate, deși aceeași metodă masca, atunci când este solicitat mai târziu, după finalizarea procesului de proiectare și ar trebui să fi primit o valoare fullMask, egală cu 0xFFFF.

Să presupunem, de asemenea, că metoda mască din clasa U a fost redefinită - acum, de exemplu, ea este implementată în așa fel încât valoarea câmpului yMask să fie utilizată direct pentru calculele din ea. Dacă constructorul X apelează metoda mască, poate accesa de fapt versiunea de mască declarată în Y și, în acest moment, desigur, câmpul yMask va conține valoarea 0 în loc de 0xff00 așteptat.

Metodele proiectate pentru a fi numite în faza de proiectare a unui obiect trebuie să fie proiectate cu mare grijă, luând în considerare considerațiile pe care le-am numit. În constructori, ar trebui să evitați să apelați metode care să permită excluderea. În caz contrar, ar trebui să menționați în mod clar aceste metode în documentație pentru a avertiza pe oricine îndrăznește să le redefinească, despre eventualele probleme care pot apărea.

Exercitarea 3.2. Introduceți textul de mai sus în clasele X și Y și adăugați expresii care îi vor ajuta să urmați etapele de modificare a valorilor câmpului. Declarați metoda principală și executați-o pentru a examina rezultatele /

Exercitarea 3.3. Dacă în procesul de construire a unui obiect a fost dificil să setați valorile măștilor numerice folosind câmpurile clasei extinse, cum ați depăși astfel de probleme?

popular

Noul tag

informații

Articole similare