Interviu pe java - oop (întrebări și răspunsuri)

A treia parte a răspunsurilor și întrebărilor pentru interviul pe POR în Java.

Întrebări. Partea 3

Răspunsuri. Partea 3

43. Cum pot accesa variabila metodei locale dintr-o clasă anonimă declarată în corpul acestei metode? Există restricții pentru o astfel de variabilă?

Pe lângă clasele locale, anonimul poate capta variabile, accesul la variabilele locale respectă aceleași reguli:







Clasele anonime pot conține și clase locale. Constructorul într-o clasă anonimă nu poate fi.

44. Cum este asociată o clasă particulară cu clasa Obiect?

Toate clasele sunt moștenitori ai obiectului Superclass. Nu este nevoie să specificați în mod explicit acest lucru. Ca urmare, obiectul o poate face referire la un obiect din orice altă clasă.

  • clasa finală publică nativă getClass () - returnează clasa acestui obiect în timpul rulării.
  • public native int hashCode () - returnează un cod hash
  • public boolean equals (Object obj) - compară obiecte.
  • (CloneNotSupportedException) - clonarea unui obiect
  • String public toString () - returnează o reprezentare șir a obiectului.
  • public void nativ finale notifica () - un thread care asteapta pe "monitor" de acest obiect se trezeste.
  • publice void native finale notifyAll () - toate firele care sunt în așteptare pe "monitor" a acestui obiect trezesc.
  • aruncă InterruptedException - firul intră în modul de așteptare pentru timpul specificat.
  • așteptați nule finală publică () aruncă InterruptedException - conduce firul să aștepte până când celelalte apeluri de filet notifică () sau notifyAll () metode de obiect.
  • așteptați publice nule final (timeout lung, int Nanos) aruncă InterruptedException - conduce firul să aștepte până când celelalte apeluri de fir notifică () sau notifyAll () pentru această metodă, sau până când intervalul de timp specificat.
  • protejat void finalize () aruncă Throwable - declanșat de colectorul de gunoi atunci când colectorul de gunoi determină că nu mai există nici o referință la obiect.

46. ​​Care este metoda equals (). Cum diferă de operație ==.
47. Dacă doriți să suprascrieți egal (), ce condiții trebuie îndeplinite pentru metoda suprascrisă?
47. Dacă egal () este suprascris, există alte metode care trebuie redefinite?
49. Care este specificitatea metodelor hashCode și egal? Cum sunt implementate metodele hashCode și equals în clasa Object? Ce reguli și acorduri există pentru punerea în aplicare a acestor metode? Când sunt aplicate?

  • Reflexivitate. pentru orice nonzero x, x.equals (x) returneaza true;
  • Tranzitivitate. pentru orice nenul x, y și z, dacă x.equals (y) și y.equals (z) returnează true, atunci x.equals (z) return true;
  • Simetria: pentru orice x și y nenul, x.equals (y) trebuie să returneze adevărat, dacă și numai dacă y.equals (x) returnează adevărat.
  • De asemenea, pentru orice nonzero x, x.equals (null) trebuie să returneze false

Când suprascrieți este egal (), trebuie să suprascrieți metoda hashCode (). Obiectele egale trebuie să returneze aceleași coduri hash.

Un cod hash este un număr. Mai precis, este un șir de lungimi de lungime fixă, obținut dintr-o serie de lungimi arbitrare. În termeni Java, un cod hash este un rezultat întreg al unei metode care este trecută ca obiect ca parametru de intrare.

Această metodă este implementată astfel încât, pentru același obiect de intrare, codul hash va fi întotdeauna același. Ar trebui înțeles că setul de coduri hash posibile este limitat la un tip int primitiv. iar setul de obiecte este limitat doar de imaginația noastră. De aici urmează declarația: "Setul de obiecte este mai puternic decât setul de coduri hash". Datorită acestei limitări, este foarte posibil ca codurile hash de diferite obiecte să coincidă.

Aici principalul lucru este să înțelegem că:

  • Dacă codurile hash sunt diferite, atunci obiectele de intrare sunt, de asemenea, garantate a fi diferite.
  • Dacă codurile hash sunt egale, atunci obiectele de intrare nu sunt întotdeauna egale.






Situația în care diferite obiecte au aceleași coduri hash se numește o coliziune. Probabilitatea unei coliziuni depinde de algoritmul utilizat pentru generarea codului hash.

50. Ce metodă returnează o reprezentare de șir a unui obiect?

51. Ce se întâmplă dacă am override egal fără hashCode suprascriere? Ce probleme pot apărea?

Contractul este rupt. Clasele și metodele care au folosit regulile acestui contract pot să nu funcționeze corect. Deci, pentru un obiect HashMap, acest lucru poate determina ca perechea care a fost plasată pe hartă să nu fie găsită în ea atunci când accesează harta dacă se folosește o nouă instanță a cheii.

52. Există vreo recomandare cu privire la ce domenii ar trebui să fie utilizate la contorizarea hashCode?

Acelea care sunt folosite la determinarea metodei sunt egale (). Codul hash trebuie să fie distribuit uniform pe intervalul de valori posibile care trebuie recepționate.

53. Credeți că vor exista probleme dacă obiectul care este folosit ca cheie în hashMap are un câmp care participă la definirea hashCode?

Will. Când accesăm o cheie, nu găsim o valoare.

54. Care este diferența dintre clasa abstractă și interfața, în ce cazuri veți folosi?

Clasele abstracte sunt folosite numai atunci când există un tip de relație "este un"; interfețele pot fi implementate de clase care nu sunt legate între ele.

O clasă abstractă poate implementa metode; interfața poate implementa metode statice și începând cu cea de-a opta versiune.

Interfața poate descrie constantele și metodele. Toate metodele de interfață în mod implicit sunt publice și abstracte, iar câmpurile sunt publice statice finale. Cu java 8, puteți implementa metode implicite și statice în interfețe.

În Java, o clasă poate fi moștenită din mai multe interfețe, dar numai dintr-o clasă abstractă.

Cu clase abstracte, pierzi individualitatea clasei care o moștenește; cu interfețe, extindeți pur și simplu funcționalitatea fiecărei clase.

55. Pot accesa variabilele de clasă privată și dacă da, în ce mod?

56. Ce este volatil și tranzitoriu? Pentru ce și în ce cazuri aș putea să utilizez implicit?

volatile - nu se utilizează nici o memorie cache (adică zona de memorie în care JVM poate stoca o copie locală a variabilei pentru a reduce timpul de accesare a variabilei) atunci când accesează câmpul. Pentru o variabilă volatilă, JVM garantează sincronizarea pentru operațiile de citire / scriere, dar nu garantează operațiile de modificare a valorii unei variabile.

tranzitorie - o indicație că atunci când serializarea / deserializarea acestui câmp nu are nevoie de serializare / deserializare.

57. Extinderea modificatorilor cu moștenire, suprascriere și ascundere a metodelor. Dacă clasa părinte are o metodă declarată privată, moștenitorul își poate extinde vizibilitatea? Și dacă este protejat? Și vizibilitate îngustă?

Există un principiu general: nu puteți extinde vizibilitatea, nu îl puteți restrânge. metodele private sunt vizibile numai în cadrul clasei, ele nu sunt vizibile descendenților. Prin urmare, ele nu pot fi extinse.

58. Are sens să se declare metoda finală privată?

Nu, această metodă nu este vizibilă pentru moștenitori, deci nu poate fi redefinită.

59. Care sunt caracteristicile inițializării variabilelor finale?

  • Pentru câmp. Un câmp marcat cu final nu își poate modifica valoarea după inițializare.
    Nu poate fi inițializat un câmp final static: în descriere, în constructor (în totalitate), într-un bloc static, într-un bloc dinamic.
    Un câmp final static este inițializat fie într-un bloc static, fie într-o descriere.
  • Valoarea variabilelor locale, precum și parametrii metodei marcate cu cuvântul final nu pot fi modificate după alocare.

60. Ce se întâmplă dacă un constructor de clasă unic este declarat final?

Cuvântul cheie final nu este aplicabil constructorului.

61. Ce se finalizează? De ce este nevoie? Ce ne puteți spune despre colectorul de gunoi și despre algoritmii muncii sale.

Metoda finalize () este apelată înainte ca obiectul să fie eliminat de colectorul de gunoi (colector de gunoi, apoi gc). Există multe implementări diferite ale gc. Baza lucrării este următoarea: gc marchează obiecte care nu mai sunt menționate de alte obiecte pentru a le șterge. Apoi, pe una dintre treceri, obiectele marcate sunt șterse.
Finalizați () nu este garantată; Aplicația poate fi terminată înainte de lansarea unei alte colecții de gunoi. Da, puteți dezasambla un obiect utilizând metoda finalize (). atribuind referința sa la o anumită metodă statistică.

62. De ce este declarat clona protejată? Ce este necesar pentru realizarea clonării?

Aceasta indică faptul că, deși metoda se află în clasa Obiect și dezvoltatorul dorește să o folosească, trebuie să fie redefinită. Pentru aceasta, trebuie să implementați interfața Clonable. pentru a se conforma contractului.

59. Care sunt caracteristicile inițializării variabilelor finale?
Pentru câmp. Câmpul marcat cu final nu își poate modifica valoarea după inițializare (este inițializat fie în descriere, fie în constructor / bloc static).
- Dacă ultimul este static atunci OR în blocul dinamic, SAU în TOATE constructorii, SAU când descrie.
-Dacă staticul final este ceva SAU într-un bloc static, SAU când descrie, SAU în mod implicit.

Am împărțit răspunsul la static \ nu static și adăugat despre toți constructorii. În mod implicit, este definit un static final int; nu este compilat la 0.

volatile - nu se utilizează nici o memorie cache (adică zona de memorie în care JVM poate stoca o copie locală a variabilei pentru a reduce timpul de accesare a variabilei) atunci când accesează câmpul
Este un răspuns incomplet

Pentru o variabilă volatilă, JVM garantează sincronizarea pentru operațiile de citire / scriere, dar nu garantează operațiile de modificare a valorii unei variabile

Și acest răspuns nu este de asemenea complet. Interiorul de lucru cu cache-ul proxy și java-ul, evident, nu se încadrează în această secțiune. Dar încă adăugați, mulțumesc.







Articole similare

Trimiteți-le prietenilor: