„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.
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,galutinis
toString ()
metodas gali būti nepaisomas, o galutinis
laukti()
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į tarpt
pavadintas 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 tarpt
pagrįstas egzemplioriaus laukas x
ir nepaiso klonas ()
metodas. klonas ()
metodas vykdomas super.klonas ()
paskambinti jo superklasei (tai yra Objektas
yra) 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 duomenys2
nurodomi 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
, Adresas
ir „CloneDemo“
klasės. Darbuotojas
pareiškia vardas
, amžiaus
ir 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žiaus
ir 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įgyvendinaKlonuojamas
. Tai nėra būtina, nes tikObjektas
'sklonas ()
metodas reikalauja, kad klasė įdiegtų šią sąsają, ir taiklonas ()
metodas nėra vadinamas.- Svarbiausia
klonas ()
metodas nemetaCloneNotSupportedException
. Ši išimtis išmetama tik išObjektas
'sklonas ()
metodas, kuris nėra vadinamas. Todėl išimtis neturi būti tvarkoma arba perkeliama į metod-call kaminą per metimo sąlygą. Objektas
'sklonas ()
metodas nėra vadinamas (nėrasuper.klonas ()
skambinti), nes sekti kopijuoti nereikiaAdresas
klasė - yra tik vienas laukas, kurį reikia nukopijuoti.