Java nodrošina standarta klases bibliotēku, kas sastāv no tūkstošiem klašu un citu atsauces veidu. Neskatoties uz to iespēju atšķirībām, šie veidi veido vienu masveida mantojuma hierarhiju, tieši vai netieši paplašinot Objekts
klasē. Tas attiecas arī uz visām jūsu izveidotajām klasēm un citiem atsauces veidiem.
Šīs Java mantojuma apmācības pirmā puse parādīja mantojuma pamatus, īpaši to, kā izmantot Javapagarina
un super
atslēgvārdi, lai atvasinātu bērnu klasi no vecāku klases, izmantotu vecāku klases veidotājus un metodes, ignorētu metodes un daudz ko citu. Tagad mēs pievērsīsimies Java klases mantojuma hierarhijas mātes kuģim, java.lang.Object
.
Studējot Objekts
un tās metodes palīdzēs jums iegūt funkcionālāku izpratni par mantojumu un to, kā tas darbojas jūsu Java programmās. Iepazīšanās ar šīm metodēm palīdzēs jums vairāk izprast Java programmas.
Objekts: Java superklase
Objekts
ir visu pārējo Java klašu saknes klase jeb galvenā superklase. Saglabāts java.lang
iepakojums, Objekts
deklarē šādas metodes, kuras pārņem visas pārējās klases:
aizsargāts objekta klons ()
būla skaitlis ir vienāds (Object obj)
aizsargāta anulēšana pabeigt ()
Klase getClass ()
int hashCode ()
anulēt paziņojumu ()
anulēt paziņojumu Visi ()
String toString ()
tukša gaidīšana ()
tukša gaidīšana (ilgs noildze)
tukša gaidīšana (ilgs noildze, int nanos)
Java klase pārmanto šīs metodes un var ignorēt jebkuru metodi, kas nav deklarēta galīgais
. Piemēram,galīgais
toString ()
metodi var ignorēt, turpretī galīgais
pagaidiet ()
metodes nevar.
Mēs apskatīsim katru no šīm metodēm un to, kā tās ļauj jums veikt īpašus uzdevumus jūsu Java klašu kontekstā. Pirmkārt, ņemsim vērā pamatnoteikumus un mehānismus Objekts
mantojums.
Vispārīgi veidi
Iepriekš minētajā sarakstā jūs, iespējams, pamanījāt getClass ()
, kura Klase
atgriešanas veids ir a piemērs vispārējs tips. Es apspriedīšu vispārīgos veidus nākamajā rakstā.
Objekta paplašināšana: piemērs
Klase var skaidri paplašināt Objekts
, kā parādīts 1. sarakstā.
Saraksts 1. Nepārprotami paplašinot objektu
publiskā klase Darbinieks paplašina objektu {privātais virknes nosaukums; publiskais darbinieks (virknes nosaukums) {this.name = vārds; } public String getName () {atgriešanās nosaukums; } public static void main (String [] args) {Employee emp = new Employee ("John Doe"); System.out.println (emp.getName ()); }}
Tā kā jūs varat pagarināt ne vairāk kā vienu citu klasi (atgādiniet no 1. daļas, ka Java neatbalsta vairākkārtēju mantošanu pēc klases), jūs neesat spiests skaidri pagarināt Objekts
; pretējā gadījumā jūs nevarētu pagarināt nevienu citu klasi. Tādēļ jūs pagarināt Objekts
netieši, kā parādīts 2. sarakstā.
Saraksts 2. Netieši paplašinot objektu
public class Darbinieks {private String name; publiskais darbinieks (virknes nosaukums) {this.name = vārds; } public String getName () {atgriešanās nosaukums; } public static void main (String [] args) {Employee emp = new Employee ("John Doe"); System.out.println (emp.getName ()); }}
Sastādiet 1. vai 2. sarakstu šādi:
javac Employee.java
Palaidiet iegūto lietojumprogrammu:
java Darbinieks
Jums jāievēro šāda izeja:
Džons Doe
Uzziniet par klasi: getClass ()
The getClass ()
method atgriež jebkura objekta, uz kuru tas tiek izsaukts, izpildlaika klasi. The izpildlaika klase ir attēlots ar Klase
objekts, kas atrodams java.lang
iepakojums. Klase
ir ieejas punkts Java Reflection API, par kuru jūs uzzināsit, kad iekļausimies progresīvākās Java programmēšanas tēmās. Pagaidām ziniet, ka Java lietojumprogramma to izmanto Klase
un pārējo Java Reflection API, lai uzzinātu par tās struktūru.
Klases objekti un statiskās sinhronizētās metodes
Atgriezās Klase
objekts ir objekts, kuru bloķēja statiski sinhronizēti
pārstāvētās klases metodes; piemēram, statisks sinhronizēts void foo () {}
. (Es ieviesīšu Java sinhronizāciju nākamajā apmācībā.)
Objektu dublēšana: klons ()
The klons ()
metode izveido un atgriež objekta, uz kuru tas tiek izsaukts, kopiju. Tā kā klons ()
atgriešanās veids ir Objekts
, objekta atsauce uz to klons ()
Pirms attiecināt šo atsauci uz objekta tipa mainīgo, atgriešana ir jāpārskaita uz objekta faktisko tipu. 3. sarakstā tiek parādīta programma, kas demonstrē klonēšanu.
Saraksts 3. Objekta klonēšana
klase CloneDemo ievieš Cloneable {int x; public static void main (String [] args) met CloneNotSupportedException {CloneDemo cd = new CloneDemo (); cd.x = 5; System.out.println ("cd.x =" + cd.x); CloneDemo cd2 = (CloneDemo) cd.clone (); System.out.println ("cd2.x =" + cd2.x); }}
Saraksts 3 CloneDemo
klase īsteno Klonējams
interfeiss, kas atrodams java.lang
iepakojums. Klonējams
to īsteno klase (caur īsteno
atslēgvārds), lai novērstu Objekts
's klons ()
metode no metiena CloneNotSupportedException
klase (atrodama arī java.lang
).
CloneDemo
paziņo viens int
bāzes instances lauks nosaukts x
un a galvenais ()
metode, kas vingrina šo klasi. galvenais ()
tiek deklarēts ar a metieni
klauzula, kas iet CloneNotSupportedException
uz augšu metodi-zvanu kaudze.
galvenais ()
vispirms acumirklī CloneDemo
un inicializē iegūto instances kopiju x
uz 5
. Pēc tam tā izved instances x
vērtība un zvani klons ()
šajā gadījumā, nododot atpakaļ objektu CloneDemo
pirms tās atsauces saglabāšanas. Visbeidzot, tas izvada klona x
lauka vērtība.
Sastādīt 3. sarakstu (javac CloneDemo.java
) un palaidiet lietojumprogrammu (java CloneDemo
). Jums jāievēro šāda izeja:
cd.x = 5 cd2.x = 5
Galvenais klons ()
Iepriekšējam piemēram nevajadzēja ignorēt klons ()
jo kods, kas zvana klons ()
atrodas klonējamajā klasē (CloneDemo
). Ja zvans uz klons ()
tomēr atradās citā klasē, tad jums vajadzēs ignorēt klons ()
. Tā kā klons ()
tiek deklarēts aizsargāts
, jūs saņemsitklons ir aizsargājis piekļuvi objektam"ziņojums, ja pirms klases sastādīšanas to neesat ignorējis. 4. saraksts parāda pārstrādātu 3. ierakstu, kas parāda ignorēšanu. klons ()
.
Saraksts 4. Objekta klonēšana no citas klases
klase Datu rīki Cloneable {int x; @Orride public Object clone () izmet CloneNotSupportedException {return super.clone (); }} klase CloneDemo {public static void main (String [] args) met CloneNotSupportedException {Data data = new Data (); dati.x = 5; System.out.println ("dati.x =" + dati.x); Datu dati2 = (Dati) dati.klons (); System.out.println ("dati2.x =" + dati2.x); }}
4. saraksts deklarē a Dati
klase, kuras gadījumus paredzēts klonēt. Dati
īsteno Klonējams
interfeiss, lai novērstu a CloneNotSupportedException
no izmetšanas, kad klons ()
metodi sauc. Tad tā paziņo int
bāzes instances lauks x
un ignorē klons ()
metodi. The klons ()
metodi izpilda super.klons ()
izsaukt tās superklasi (tas ir, Objekts
s) klons ()
metodi. Galvenais klons ()
metode identificē CloneNotSupportedException
tās metieni
klauzula.
4. saraksts arī deklarē a CloneDemo
klase, kas: acumirklī Dati
, inicializē tā instances lauku, izvada instances lauka vērtību, klonē Dati
objektu un izvada tā instances lauka vērtību.
Sastādīt 4. sarakstu (javac CloneDemo.java
) un palaidiet lietojumprogrammu (java CloneDemo
). Jums jāievēro šāda izeja:
dati.x = 5 dati2.x = 5
Sekla klonēšana
Sekla klonēšana (zināms arī kā sekla kopēšana) attiecas uz objekta lauku dublēšanu, nedublējot nevienu objektu, uz kuru ir atsauce no šī objekta atsauces laukiem (ja ir kādi atsauces lauki). 3. un 4. saraksts faktiski parādīja seklu klonēšanu. Katrs no cd
-, cd2
-, dati
-, un dati2
-referencētie lauki identificē objektu, kuram ir sava int
-pamatots x
laukā.
Sekla klonēšana darbojas labi, ja visi lauki ir primitīva tipa un (daudzos gadījumos), ja kādi atsauces lauki attiecas uz nemainīgs (nemaināmi) objekti. Tomēr, ja kāds atsauces objekts ir maināms, sākotnējā objektā un tā klonā (-os) var redzēt izmaiņas, kas veiktas vienā no šiem objektiem. 5. saraksts parāda.
Saraksts 5. Seklās klonēšanas problēma atsauces lauka kontekstā
klase Darbinieks ievieš Cloneable {private String name; privāts int vecums; privātā adreses adrese; Darbinieks (virknes nosaukums, vecums, adreses adrese) {this.name = vārds; tas.vecums = vecums; this.adress = adrese; } @Orride public Object clone () izmet CloneNotSupportedException {return super.clone (); } Adrese getAddress () {atgriešanās adrese; } String getName () {atgriešanās nosaukums; } int getAge () {atgriešanās vecums; }} klases adrese {private String city; Adrese (virknes pilsēta) {this.city = pilsēta; } Virkne getCity () {atgriešanās pilsēta; } void setCity (virknes pilsēta) {this.city = pilsēta; }} klase CloneDemo {public static void main (String [] args) izmet CloneNotSupportedException {Employee e = new Employee ("John Doe", 49, new Address ("Denver")); System.out.println (e.getName () + ":" + e.getAge () + ":" + e.getAddress (). GetCity ()); Darbinieks e2 = (Darbinieks) e.klons (); System.out.println (e2.getName () + ":" + e2.getAge () + ":" + e2.getAddress (). GetCity ()); e.getAddress (). setCity ("Čikāga"); System.out.println (e.getName () + ":" + e.getAge () + ":" + e.getAddress (). GetCity ()); System.out.println (e2.getName () + ":" + e2.getAge () + ":" + e2.getAddress (). GetCity ()); }}
Uzskaitot 5 dāvanas Darbinieks
, Adrese
, un CloneDemo
klases. Darbinieks
paziņo nosaukums
, vecums
, un adrese
lauki; un ir klonējams. Adrese
paziņo, ka adrese sastāv no pilsētas, un tās gadījumi ir maināmi. CloneDemo
vada lietojumprogrammu.
CloneDemo
's galvenais ()
metode rada Darbinieks
objektu un klonē šo objektu. Tad tas maina pilsētas nosaukumu oriģinālā Darbinieks
objekta adrese
laukā. Tāpēc, ka abi Darbinieks
objekti atsaucas uz to pašu Adrese
objektu, mainīto pilsētu redz abi objekti.
Sastādīt 5. sarakstu (javac CloneDemo.java
) un palaidiet šo lietojumprogrammu (java CloneDemo
). Jums jāievēro šāda izeja:
Džons Doe: 49: Denvers Džons Doe: 49: Denvers Džons Doe: 49: Čikāga Džons Doe: 49: Čikāga
Dziļa klonēšana
Dziļa klonēšana (zināms arī kā dziļa kopēšana) attiecas uz objekta lauku dublēšanu tā, lai visi atsauktie objekti tiktu dublēti. Turklāt atsauces objektu atsauces objekti tiek dublēti utt. Uzskaita 6 refaktorus. 5. uzskaitījums, lai demonstrētu dziļu klonēšanu.
Saraksts 6. Adreses lauka dziļa klonēšana
klase Darbinieks ievieš Cloneable {private String name; privāts int vecums; privātā adreses adrese; Darbinieks (virknes nosaukums, vecums, adreses adrese) {this.name = vārds; tas.vecums = vecums; this.adress = adrese; } @Orride public Object clone () izmet CloneNotSupportedException {Employee e = (Employee) super.clone (); e.adrese = (Adrese) adrese.klons (); atgriešanās e; } Adrese getAddress () {atgriešanās adrese; } String getName () {atgriešanās nosaukums; } int getAge () {atgriešanās vecums; }} klases adrese {private String city; Adrese (virknes pilsēta) {this.city = city; } @Orride public Object clone () {return new Address (new String (city)); } Virkne getCity () {atgriešanās pilsēta; } void setCity (virknes pilsēta) {this.city = pilsēta; }} klase CloneDemo {public static void main (String [] args) izmet CloneNotSupportedException {Employee e = new Employee ("John Doe", 49, new Address ("Denver")); System.out.println (e.getName () + ":" + e.getAge () + ":" + e.getAddress (). GetCity ()); Darbinieks e2 = (Darbinieks) e.klons (); System.out.println (e2.getName () + ":" + e2.getAge () + ":" + e2.getAddress (). GetCity ()); e.getAddress (). setCity ("Čikāga"); System.out.println (e.getName () + ":" + e.getAge () + ":" + e.getAddress (). GetCity ()); System.out.println (e2.getName () + ":" + e2.getAge () + ":" + e2.getAddress (). GetCity ()); }}
6. saraksts to parāda Darbinieks
's klons ()
metode vispirms izsauc super.klons ()
, kas sekli kopē nosaukums
, vecums
, un adrese
lauki. Tad zvana klons ()
uz adrese
lauks, lai izveidotu atsauces dublikātu Adrese
objekts. Adrese
ignorē klons ()
metodi un atklāj dažas atšķirības no iepriekšējām klasēm, kas ignorē šo metodi:
Adrese
neieviešKlonējams
. Tas nav nepieciešams, jo tikaiObjekts
'sklons ()
metode prasa, lai klase ieviestu šo saskarni, un tasklons ()
metode netiek izsaukta.- Galvenais
klons ()
metode nemetCloneNotSupportedException
. Šis izņēmums tiek izmests tikai noObjekts
'sklons ()
metodi, kas netiek izsaukta. Tāpēc izņēmums nav jāapstrādā vai jāpārvieto pa metodi izsaukuma kaudzi, izmantojot metienu klauzulu. Objekts
'sklons ()
metode netiek izsaukta (navsuper.klons ()
zvans), jo sekla kopēšana nav nepieciešamaAdrese
klase - kopējams tikai viens lauks.