Programavimas

Paveldėjimas Java, 2 dalis. Objektas ir jo metodai

„Java“ pateikia standartinę klasių biblioteką, susidedančią iš tūkstančių klasių ir kitų nuorodų tipų. Nepaisant jų galimybių skirtumų, šie tipai sudaro vieną didžiulę paveldėjimo hierarchiją tiesiogiai ar netiesiogiai pratęsdami Objektas klasė. Tai pasakytina ir apie visas jūsų sukurtas klases ir kitus nuorodų tipus.

Pirmoji šios „Java“ paveldėjimo pamokos pusė parodė jums paveldėjimo pagrindus, konkrečiai, kaip naudotis „Java“tęsiasi ir super raktiniai žodžiai, norint gauti vaikų klasę iš tėvų klasės, pasinaudoti tėvų klasės kūrėjais ir metodais, nepaisyti metodų ir kt. Dabar mes sutelksime dėmesį į „Java“ klasės paveldėjimo hierarchijos motinystę, java.lang.Object.

Studijuoja Objektas ir jo metodai padės jums geriau suprasti paveldėjimą ir kaip tai veikia jūsų „Java“ programose. Susipažinę su šiais metodais, galėsite geriau suprasti „Java“ programas.

atsisiųsti Gauti kodą Atsisiųskite šaltinį, pvz., programas, šioje pamokoje. Sukūrė Jeffas Friesenas, skirtas „JavaWorld“.

Objektas: „Java“ superklasė

Objektas yra visų kitų „Java“ klasių šakninė klasė arba galutinis superklasė. Laikoma java.lang paketas, Objektas deklaruoja šiuos metodus, kuriuos paveldi visos kitos klasės:

  • saugomas objekto klonas ()
  • loginė lygi (Object obj)
  • apsaugotas negaliojantis baigti ()
  • Klasė „getClass“ ()
  • int hashCode ()
  • negaliojantis pranešimas ()
  • negalioja praneštiVisi ()
  • Stygos toString ()
  • tuščias laukimas ()
  • tuščias laukimas (ilgas skirtasis laikas)
  • tuščias laukimas (ilgas skirtasis laikas, int nanos)

„Java“ klasė paveldi šiuos metodus ir gali nepaisyti bet kurio nedeklaruoto metodo galutinis. Pavyzdžiui,galutinistoString () metodas gali būti nepaisomas, o galutinislaukti() metodai negali.

Mes apžvelgsime kiekvieną iš šių metodų ir tai, kaip jie leidžia jums atlikti specialias užduotis jūsų „Java“ klasių kontekste. Pirmiausia apsvarstykime pagrindines taisykles ir mechanizmus Objektas paveldėjimas.

Bendrieji tipai

Pirmiau pateiktame sąraše galbūt pastebėjote „getClass“ (), kurio Klasė grąžinimo tipas yra a pavyzdys bendrinis tipas. Aptarsiu bendruosius tipus būsimame straipsnyje.

Objekto išplėtimas: pavyzdys

Klasė gali aiškiai pratęsti Objektas, kaip parodyta 1 sąraše.

Sąrašas 1. Aiškiai išplėstas objektas

viešoji klasė Darbuotojas praplečia objektą {privatus eilutės pavadinimas; viešasis darbuotojas (eilutės pavadinimas) {this.name = vardas; } public String getName () {grąžinimo vardas; } public static void main (String [] args) {Darbuotojo emp = naujas darbuotojas ("John Doe"); System.out.println (emp.getName ()); }}

Kadangi galite išplėsti ne daugiau kaip vieną kitą klasę (priminkite iš 1 dalies, kad „Java“ nepalaiko daugelio klasių paveldėjimo), jūs neprivalote aiškiai pratęsti Objektas; kitaip negalėtumėte pratęsti jokios kitos klasės. Todėl jūs pratęstumėte Objektas netiesiogiai, kaip parodyta 2 sąraše.

Sąrašas 2. Netiesiogiai pratęsiantis objektas

viešoji klasė Darbuotojas {privatus Stygos vardas; viešasis darbuotojas (eilutės pavadinimas) {this.name = vardas; } public String getName () {grąžinimo vardas; } public static void main (String [] args) {Darbuotojo emp = naujas darbuotojas ("John Doe"); System.out.println (emp.getName ()); }}

Sudarykite 1 arba 2 sąrašus taip:

javac Employee.java

Paleiskite gautą programą:

java darbuotojas

Turėtumėte stebėti šį rezultatą:

Jonas Doe

Sužinokite apie klasę: getClass ()

„getClass“ () metodas grąžina bet kurio objekto, kuriame jis vadinamas, vykdymo laiką. vykdymo laikas yra atstovaujama a Klasė objektas, kuris yra java.lang pakuotė. Klasė yra įvesties taškas į „Java Reflection“ API, apie kurį sužinosite, kai pateksime į pažangesnes „Java“ programavimo temas. Kol kas žinokite, kad naudoja „Java“ programa Klasė ir likusią „Java Reflection“ API, kad sužinotumėte apie savo struktūrą.

Klasės objektai ir statiniai sinchronizuoti metodai

Grįžo Klasė objektas yra objektas, kurį užrakino statinis sinchronizuotas atstovaujamos klasės metodai; pavyzdžiui, statinis sinchronizuotas negaliojantis foo () {}. („Java“ sinchronizavimą pristatysiu būsimoje mokymo programoje.)

Objektų kopijavimas: klonas ()

klonas () metodas sukuria ir grąžina objekto, kuriuo jis vadinamas, kopiją. Nes klonas ()grąžinimo tipas yra Objektas, objekto nuoroda į tai klonas () Prieš priskiriant nuorodą objekto tipo kintamajam, grąžinimai turi būti perduoti tikram objekto tipui. 3 sąraše pateikiama programa, demonstruojanti klonavimą.

Sąrašas 3. Objekto klonavimas

klasė „CloneDemo“ įgyvendina „Cloneable“ {int x; public static void main (String [] args) meta CloneNotSupportedException {CloneDemo cd = new CloneDemo (); cdx = 5; System.out.println ("cd.x =" + cd.x); CloneDemo cd2 = (CloneDemo) cd. klonas (); System.out.println ("cd2.x =" + cd2.x); }}

3 sąrašas „CloneDemo“ klasė įgyvendina Klonuojamas sąsaja, kuri yra java.lang pakuotė. Klonuojamas yra įgyvendinama klasės (per padargai raktinis žodis), kad būtų išvengta Objektas's klonas () metodas išmeta CloneNotSupportedException klasė (taip pat rasta java.lang).

„CloneDemo“ deklaruoja vienintelį tarptpavadintas egzemplioriaus laukas x ir a pagrindinis () metodas, pratęsiantis šią klasę. pagrindinis () yra deklaruojamas su a metimai sąlyga, kuri praeina CloneNotSupportedException pakelti metodo skambučio kaminą.

pagrindinis () pirmiausia akimirksniu „CloneDemo“ ir inicijuoja gautos egzemplioriaus kopiją x į 5. Tada jis išleidžia egzempliorius x vertė ir skambučiai klonas () šiuo atveju grąžinamo objekto liejimas į „CloneDemo“ prieš saugodamas nuorodą. Galiausiai, jis išleidžia klono x lauko vertė.

Sudaryti 3 sąrašą (javac CloneDemo.java) ir paleiskite programą (java CloneDemo). Turėtumėte stebėti šį rezultatą:

cd.x = 5 cd2.x = 5

Pagrindinis klonas ()

Ankstesnio pavyzdžio nereikėjo nepaisyti klonas () nes kodas, kuris skambina klonas () yra klonuojamoje klasėje („CloneDemo“). Jei skambutis į klonas () buvo skirtingoje klasėje, tačiau tada turėsite nepaisyti klonas (). Nes klonas () yra deklaruojamas saugomi, jūs gausite „klonas apsaugojo prieigą objekte"pranešimas, jei jo nepaisėte prieš sudarydami klasę. 4 sąraše pateikiamas atnaujintas 3 sąrašas, kuris rodo nepaisomą klonas ().

Sąrašas 4. Klonuoti objektą iš kitos klasės

klasės duomenys įgyvendinami Cloneable {int x; @Override public Object clone () meta CloneNotSupportedException {return super.clone (); }} klasė CloneDemo {public static void main (String [] args) meta CloneNotSupportedException {Data data = new Data (); duomenys.x = 5; System.out.println ("duomenys.x =" + duomenys.x); Duomenų duomenys2 = (Duomenys) duomenys.klonas (); System.out.println ("duomenys2.x =" + duomenys2.x); }}

4 sąraše skelbiama a Duomenys klasės, kurios egzemplioriai turi būti klonuojami. Duomenys įgyvendina Klonuojamas sąsaja užkirsti kelią a CloneNotSupportedException nuo metimo, kai klonas () metodas vadinamas. Tada ji pareiškia tarptpagrįstas egzemplioriaus laukas xir nepaiso klonas () metodas. klonas () metodas vykdomas super.klonas () paskambinti jo superklasei (tai yra Objektasyra) klonas () metodas. Svarbiausia klonas () metodas identifikuoja CloneNotSupportedException jos metimai sąlyga.

4 sąraše taip pat skelbiama a „CloneDemo“ klasė, kuri: akimirksniu Duomenys, inicializuoja savo egzemplioriaus lauką, pateikia egzemplioriaus lauko vertę, klonuoja Duomenys objektą ir pateikia jo egzemplioriaus lauko vertę.

Sudaryti 4 sąrašą (javac CloneDemo.java) ir paleiskite programą (java CloneDemo). Turėtumėte stebėti šį rezultatą:

duomenys.x = 5 duomenys2.x = 5

Negilus klonavimas

Negilus klonavimas (taip pat žinomas kaip seklus kopijavimas) nurodo objekto laukų kopijavimą, nedubliuojant jokių objektų, į kuriuos yra nuoroda iš to objekto nuorodų laukų (jei yra nuorodų laukų). 3 ir 4 sąrašai iš tikrųjų parodė seklų klonavimą. Kiekvienas iš cd-, cd2-, duomenis- ir duomenys2nurodomi laukai identifikuoja objektą, kuris turi savo tarpt-pagrįstas x srityje.

Negilus klonavimas veikia gerai, kai visi laukai yra primityvaus tipo ir (daugeliu atvejų), kai bet kokie nuorodų laukai nurodo nekintamas (nekeičiami) objektai. Tačiau, jei kuris nors nurodytas objektas yra kintamas, bet kurio iš šių objektų pakeitimus gali pamatyti originalus objektas ir jo klonas (-ai). 5 sąrašas rodo.

5 sąrašas. Gilaus klonavimo problema atskaitos lauko kontekste

klasė Darbuotojas įgyvendina Cloneable {private String name; privatus int amžius; asmeninis adreso adresas; Darbuotojas (eilutės pavadinimas, int amžius, adreso adresas) {this.name = vardas; tai. amžius = amžius; tai.adresas = adresas; } @Paisyti viešojo objekto kloną () meta CloneNotSupportedException {return super.clone (); } Adresas getAddress () {grąžinimo adresas; } String getName () {grąžinimo vardas; } int getAge () {grįžimo amžius; }} klasė Adresas {private String city; Adresas (styginis miestas) {this.city = miestas; } String getCity () {grįžimo miestas; } void setCity (Styginių miestas) {this.city = miestas; }} klasė CloneDemo {public static void main (String [] args) meta CloneNotSupportedException {Employee e = new Employee ("John Doe", 49, naujas adresas ("Denver")); System.out.println (e.getName () + ":" + e.getAge () + ":" + e.getAddress (). GetCity ()); Darbuotojas e2 = (Darbuotojas) e.klonas (); System.out.println (e2.getName () + ":" + e2.getAge () + ":" + e2.getAddress (). GetCity ()); e.getAddress (). setCity („Čikaga“); System.out.println (e.getName () + ":" + e.getAge () + ":" + e.getAddress (). GetCity ()); System.out.println (e2.getName () + ":" + e2.getAge () + ":" + e2.getAddress (). GetCity ()); }}

Išvardijamos 5 dovanos Darbuotojas, Adresasir „CloneDemo“ klasės. Darbuotojas pareiškia vardas, amžiausir adresas laukai; ir yra klonuojamas. Adresas deklaruoja adresą, susidedantį iš miesto, o jo egzemplioriai yra kintami. „CloneDemo“ varo programą.

„CloneDemo“'s pagrindinis () metodas sukuria Darbuotojas objektą ir klonuoja šį objektą. Tada jis keičia miesto pavadinimą originalu Darbuotojas objekto adresas srityje. Nes abu Darbuotojas objektai nurodo tą patį Adresas objektą, pakeistą miestą mato abu objektai.

Sudaryti 5 sąrašą (javac CloneDemo.java) ir paleiskite šią programą (java CloneDemo). Turėtumėte stebėti šį rezultatą:

John Doe: 49: Denveris John Doe: 49: Denveris John Doe: 49: Chicago John Doe: 49: Chicago

Gilus klonavimas

Gilus klonavimas (taip pat žinomas kaip gilus kopijavimas) nurodo objekto laukų kopijavimą taip, kad visi nurodyti objektai būtų dubliuojami. Be to, nurodytų objektų, į kuriuos yra nuoroda, objektai yra dubliuojami ir pan. 6 refaktorių sąrašas 5 sąrašas, pademonstruojantis gilų klonavimą.

Sąrašas 6. Gilus adreso lauko klonavimas

klasė Darbuotojas įgyvendina Cloneable {private String name; privatus int amžius; asmeninis adreso adresas; Darbuotojas (eilutės pavadinimas, int amžius, adreso adresas) {this.name = vardas; tai. amžius = amžius; tai.adresas = adresas; } @Paisyti viešojo objekto kloną () išmeta CloneNotSupportedException {Darbuotojo e = (Darbuotojo) super.klonas (); el. adresas = (adresas) adresas.klonas (); grįžti e; } Adresas getAddress () {grąžinimo adresas; } String getName () {grąžinimo vardas; } int getAge () {grįžimo amžius; }} klasės adresas {private String city; Adresas (styginis miestas) {this.city = miestas; } @Paisyti viešojo objekto kloną () {grąžinti naują adresą (nauja eilutė (miestas)); } String getCity () {grįžimo miestas; } void setCity (Styginių miestas) {this.city = miestas; }} klasė CloneDemo {public static void main (String [] args) meta CloneNotSupportedException {Employee e = new Employee ("John Doe", 49, naujas adresas ("Denver")); System.out.println (e.getName () + ":" + e.getAge () + ":" + e.getAddress (). GetCity ()); Darbuotojas e2 = (Darbuotojas) e.klonas (); System.out.println (e2.getName () + ":" + e2.getAge () + ":" + e2.getAddress (). GetCity ()); e.getAddress (). setCity („Čikaga“); System.out.println (e.getName () + ":" + e.getAge () + ":" + e.getAddress (). GetCity ()); System.out.println (e2.getName () + ":" + e2.getAge () + ":" + e2.getAddress (). GetCity ()); }}

6 sąrašas rodo, kad Darbuotojas's klonas () metodas pirmiausia skambina super.klonas (), kuris negiliai kopijuoja vardas, amžiausir adresas laukai. Tada paskambina klonas () ant adresas lauką, kad padarytumėte nuorodos kopiją Adresas objektas. Adresas nepaiso klonas () metodas ir atskleidžia keletą skirtumų nuo ankstesnių klasių, kurios nepaiso šio metodo:

  • Adresas neįgyvendina Klonuojamas. Tai nėra būtina, nes tik Objektas's klonas () metodas reikalauja, kad klasė įdiegtų šią sąsają, ir tai klonas () metodas nėra vadinamas.
  • Svarbiausia klonas () metodas nemeta CloneNotSupportedException. Ši išimtis išmetama tik iš Objektas's klonas () metodas, kuris nėra vadinamas. Todėl išimtis neturi būti tvarkoma arba perkeliama į metod-call kaminą per metimo sąlygą.
  • Objektas's klonas () metodas nėra vadinamas (nėra super.klonas () skambinti), nes sekti kopijuoti nereikia Adresas klasė - yra tik vienas laukas, kurį reikia nukopijuoti.