Programmēšana

Izpratne par konstruktoriem

Teikšana, ka konstruktors ir metode, ir tāds pats kā apgalvojums, ka Austrālijas pīļknābis ir tikai vēl viens zīdītājs. Lai saprastu pīļknābīti, ir svarīgi zināt, ar ko tas atšķiras no citiem zīdītājiem. Lai saprastu konstruktoru, ir tikpat svarīgi saprast, kā tas atšķiras no metodes. Jebkuram Java studentam, īpaši tam, kurš studē sertifikāta iegūšanai, jāzina šīs atšķirības; šajā rakstā es tos konkretizēšu. 1. tabulā šī raksta beigās ir apkopotas galvenās konstruktora / metodes atšķirības.

Mērķis un funkcija

Konstruktoriem ir viens dzīves mērķis: izveidot klases instanci. To var saukt arī par objekta izveidošanu, kā tas ir:

Platypus p1 = jaunais Platypus (); 

Metožu mērķis savukārt ir daudz vispārīgāks. Metodes pamatfunkcija ir Java koda izpilde.

Parakstu atšķirības

Konstruktori un metodes atšķiras trīs paraksta aspektos: modifikatori, atgriešanās veids un nosaukums. Tāpat kā metodes, konstruktoriem var būt jebkurš no piekļuves modifikatoriem: publisks, aizsargāts, privāts vai neviens (bieži saukts iepakojums vai draudzīgs). Atšķirībā no metodēm, konstruktori var izmantot tikai piekļuves modifikatorus. Tāpēc konstruktori nevar būt abstrakts, galīgais, dzimtā, statisksvai sinhronizēts.

Arī atgriešanās veidi ir ļoti atšķirīgi. Metodēm var būt jebkurš derīgs atgriešanas veids vai bez atgriešanās veida, tādā gadījumā atgriešanas veids tiek norādīts kā spēkā neesošs. Konstruktoriem nav pat atgriešanās veida spēkā neesošs.

Visbeidzot, attiecībā uz parakstu metodēm un konstruktoriem ir atšķirīgi nosaukumi. Konstruktoriem ir tāds pats nosaukums kā viņu klasei; pēc vienošanās metodes izmanto citus nosaukumus, nevis klases nosaukumu. Ja Java programma ievēro parastās konvencijas, metodes sākas ar mazo burtu, konstruktori ar lielo burtu. Arī konstruktoru nosaukumi parasti ir lietvārdi, jo klases nosaukumi parasti ir lietvārdi; metožu nosaukumi parasti norāda darbības.

"Šī" lietošana

Konstruktori un metodes izmanto atslēgvārdu šo pavisam savādāk. Metode izmanto šo atsaukties uz klases instanci, kas izpilda metodi. Statiskās metodes neizmanto šo; tie nepieder pie klases instances, tātad šo nebūtu uz ko atsaukties. Statiskās metodes pieder klasei kopumā, nevis instancei. Konstruktori izmanto šo atsaukties uz citu konstruktoru tajā pašā klasē ar atšķirīgu parametru sarakstu. Izpētiet šādu kodu:

publiskā klase Platypus {Stīgas nosaukums; Platypus (virknes ievade) {name = input; } Platypus () {this ("Jānis / Marija Doe"); } public static void main (String args []) {Platypus p1 = new Platypus ("racējs"); Platypus p2 = jaunais Platypus (); }} 

Kodā ir divi konstruktori. Pirmais ņem a Stīga ievadiet instances nosaukumu. Otrais, neņemot vērā parametrus, sauc pirmo konstruktoru pēc noklusējuma nosaukuma "Džons / Marija Doe".

Ja konstruktors izmanto šo, tam jābūt konstruktora pirmajā rindā; ignorējot šo noteikumu, kompilators iebilst.

"Super" izmantošana

Gan metodes, gan konstruktori izmanto super atsaukties uz superklasi, taču dažādos veidos. Izmantotās metodes super lai veiktu ignorētu metodi virsklasē, kā parādīts šajā piemērā:

klase Zīdītājs {void getBirthInfo () {System.out.println ("dzimis dzīvs."); }} klase Platypus pagarina zīdītāju {void getBirthInfo () {System.out.println ("izšķiļas no olām"); System.out.print ("parasti zīdītājs ir"); super.getBirthInfo (); }} 

Iepriekš minētajā programmā zvans uz super.getBirthInfo () izsauc ignorēto metodi Zīdītājs superklase.

Konstruktori izmanto super izsaukt superklases konstruktoru. Ja konstruktors izmanto super, tai tas jāizmanto pirmajā rindā; pretējā gadījumā sastādītājs sūdzēsies. Piemērs:

publiskā klase SuperClassDemo {SuperClassDemo () {}} klases bērns pagarina SuperClassDemo {bērns () {super (); }} 

Iepriekš minētajā (un triviālā!) Piemērā konstruktors Bērns() ietver zvanu uz super, kas izraisa klasi SuperClassDemo jāapvieno papildus Bērns klasē.

Sastādītāja piegādātais kods

Jaunais Java programmētājs var paklupt, kad kompilators automātiski piegādā kodu konstruktoriem. Tas notiek, ja jūs rakstāt klasi bez konstruktoriem; kompilators automātiski piegādās konstruktoru bez argumentiem. Tādējādi, ja jūs rakstāt:

publiskās klases piemērs {} 

tas ir funkcionāli līdzvērtīgs rakstīšanai:

publiskās klases piemērs {Piemērs () {}} 

Kompilators arī automātiski piegādā kodu, kad jūs to neizmantojat super (izmantojot nulli vai vairāk parametrus) kā konstruktora pirmo rindu. Šajā gadījumā dators automātiski ievieto super. Tādējādi, ja jūs rakstāt:

publiskā klase TestConstructors {TestConstructors () {}} 

tas ir funkcionāli līdzvērtīgs rakstīšanai:

publiskā klase TestConstructors {TestConstructors () { super; } } 

Iesācējs ar asām acīm var brīnīties, kā iepriekš minētā programma var izsaukt vecāku klases konstruktoru TestConstructor nepagarina nevienu klasi. Atbilde ir tāda, ka Java paplašina Objekts klase, kad nepārprotami nepaplašināt klasi. Kompilators automātiski piegādā konstruktoru bez argumentiem, ja nav skaidri deklarēts neviens konstruktors, un automātiski piegādā argumentu bez argumentiem super zvans, kad konstruktoram nav tieša zvana super. Tātad šie divi koda fragmenti ir funkcionāli līdzvērtīgi:

publiskās klases piemērs {} 

un

publiskās klases piemērs {Piemērs () { super; } } 

Mantojums

Kas ir nepareizs ar šo scenāriju? Advokāts lasa testamentu Klase. ES locekļi Klase ģimene ir sapulcējusies pie liela konferenču galda, daži maigi šņukst. Advokāts lasa: "Es, Klase, būdams veselīga prāta un ķermeņa, atstājiet visus savus konstruktorus saviem bērniem. "

Problēma ir tā, ka konstruktorus nevar mantot. Par laimi Klase bērni, viņi automātiski iemantos kādu no vecāku metodēm, tāpēc Klase bērni nekļūs pilnīgi nabadzīgi.

Atcerieties, ka Java metodes tiek pārmantotas, bet konstruktori nav. Apsveriet šādu klasi:

public class Piemērs {public void sayHi {system.out.println ("Sveiki"); } Piemērs () {}} public class SubClass paplašina piemēru {} 

The Apakšklase klase automātiski manto saki sveiks metode, kas atrodama vecāku klasē. Tomēr konstruktors Piemērs() nav mantojis Apakšklase.

Apkopojot atšķirības

Tāpat kā platiķis atšķiras no tipiskā zīdītāja, tāpat konstruktori atšķiras no metodēm; to mērķa, paraksta un izmantošanas ziņā šo un super. Turklāt konstruktori atšķiras pēc mantojuma un kompilatora piegādātā koda. Paturot visu šo informāciju taisni, tas var būt nepatīkams darbs; Šajā tabulā ir sniegts ērts galveno punktu apkopojums. Plašāku informāciju par konstruktoriem un metodēm varat atrast zemāk sadaļā Resursi.

1. tabula. Konstruktoru un metožu atšķirības

TematsKonstruktoriMetodes
MērķisIzveidojiet klases instanciGrupēt Java paziņojumus
ModifikatoriNevar būt abstrakts, galīgais, dzimtā, statisksvai sinhronizētsVar būt abstrakts, galīgais, dzimtā, statisksvai sinhronizēts
Atgriešanas veidsNav atgriešanās veida, pat ne spēkā neesošsspēkā neesošs vai derīgs atgriešanās veids
NosaukumsTas pats nosaukums kā klase (pirmais burts ir lielais ar lielo burtu) - parasti lietvārdsJebkurš vārds, izņemot klasi. Metodes nosaukumi sākas ar mazo burtu pēc vienošanās - parasti darbības nosaukums
šoAttiecas uz citu konstruktoru tajā pašā klasē. Ja to izmanto, tam jābūt konstruktora pirmajai līnijaiAttiecas uz piederošās klases gadījumu. Nevar izmantot ar statiskām metodēm
superZvana vecāku klases konstruktoram. Ja to izmanto, tam jābūt konstruktora pirmajai līnijaiVecāku klasē aicina ignorēt metodi
MantojumsKonstruktori netiek mantotiMetodes tiek pārmantotas
Kompilators automātiski piegādā noklusējuma konstruktoruJa klasei nav konstruktora, automātiski tiek piegādāts konstruktors bez argumentiemNeattiecas
Kompilators automātiski piegādā noklusējuma zvanu superklases konstruktoramJa konstruktors neveic nulles vai vairāk argumentu izsaukumus uz super, aicinājums bez argumentiem super ir izgatavotsNeattiecas
Roberts Nīlsens ir Sun sertificēts Java 2 programmētājs. Viņš ieguvis maģistra grādu izglītībā, specializējoties datorizētā apmācībā un vairākus gadus pasniedzis datoru jomā. Viņš ir arī publicējis ar datoru saistītus rakstus dažādos žurnālos.

Uzziniet vairāk par šo tēmu

  • Dažas grāmatas, kas aptver konstruktoru pamatus un metodes, ir
  • Pilnīga Java 2 studiju sertifikācijas rokasgrāmata, Saimons Robertss u.c. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
  • Java 2 (eksāmena Cram), Bils Brogdens (The Coriolis Group, 1999):

    //www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548

  • Java īsumā, Deiviss Flanagans (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
  • Apmeklējiet Sun Microsystems vietni, lai uzzinātu vairāk par metodēm un konstruktoriem

    //java.sun.com/docs/books/tutorial/trailmap.html

  • Lai iegūtu vairāk Java satura iesācējiem, lasiet JavaWorld 's jauns Java 101 kolonnu sērija

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

Šo stāstu “Izpratne par konstruktoriem” sākotnēji publicēja JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found