Programmēšana

Mantošana Java, 2. daļa: Objekts un tā metodes

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.

lejupielādēt Iegūt kodu Lejupielādējiet šajā apmācībā avota kodu, piemēram, lietojumprogrammām. Izveidoja Jeff Friesen JavaWorld.

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īgaistoString () metodi var ignorēt, turpretī galīgaispagaidiet () 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 intbā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 intbāzes instances lauks xun ignorē klons () metodi. The klons () metodi izpilda super.klons () izsaukt tās superklasi (tas ir, Objektss) 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 tikai Objekts's klons () metode prasa, lai klase ieviestu šo saskarni, un tas klons () metode netiek izsaukta.
  • Galvenais klons () metode nemet CloneNotSupportedException. Šis izņēmums tiek izmests tikai no Objekts's klons () 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's klons () metode netiek izsaukta (nav super.klons () zvans), jo sekla kopēšana nav nepieciešama Adrese klase - kopējams tikai viens lauks.
$config[zx-auto] not found$config[zx-overlay] not found