Programmēšana

Vai Java iziet ar atsauci vai caur vērtību?

Daudzas programmēšanas valodas ļauj nodot parametrus pēc atsauces vai vērtības. Java mēs varam nodot tikai parametrus pēc vērtības. Tas uzliek zināmas robežas un rada arī jautājumus. Piemēram, ja metodē tiek mainīta parametra vērtība, kas notiek ar vērtību pēc metodes izpildes? Jums var rasties jautājums, kā Java pārvalda objektu vērtības atmiņas kaudzē. Šis Java Challenger palīdz atrisināt šos un citus bieži uzdotos jautājumus par Java objektu atsaucēm.

Iegūstiet pirmkodu

Iegūstiet šī Java Challenger kodu. Kamēr sekojat piemēriem, varat pats veikt testus.

Objektu atsauces tiek nodotas pēc vērtības

Visas Java objektu atsauces tiek nodotas pēc vērtības. Tas nozīmē, ka vērtības kopija tiks nodota metodei. Bet triks ir tāds, ka vērtības kopijas nodošana maina arī objekta reālo vērtību. Lai saprastu, kāpēc, sāciet ar šo piemēru:

 public class ObjectReferenceExample {public static void main (String ... doYourBest) {Simpson simpson = new Simpson (); transformIntoHomer (simpson); System.out.println (simpson.name); } static void transformIntoHomer (Simpson simpson) {simpson.name = "Homer"; }} klase Simpsons {Stīgas nosaukums; } 

Kā jūs domājat simpson.name būs pēc transformIntoHomer metode tiek izpildīta?

Šajā gadījumā tas būs Homērs! Iemesls ir tāds, ka Java objektu mainīgie ir vienkārši atsauces, kas norāda uz reāliem objektiem atmiņas kaudzē. Tāpēc, pat ja Java parametrus nodod metodēm pēc vērtības, ja mainīgais norāda uz objekta atsauci, tiks mainīts arī reālais objekts.

Ja jums joprojām nav īsti skaidrs, kā tas darbojas, ieskatieties zemāk redzamajā attēlā.

Rafaels Šinelato Del Nero

Vai primitīvie tipi tiek nodoti pēc vērtības?

Tāpat kā objektu tipi, arī primitīvie tipi tiek nodoti pēc vērtības. Vai šajā koda piemērā varat secināt, kas notiks ar primitīvajiem tipiem?

 public class PrimitiveByValueExample {public static void main (String ... primitiveByValue) {int homerAge = 30; changeHomerAge (homerAge); System.out.println (homerAge); } static void changeHomerAge (int homerAge) {homerAge = 35; }} 

Ja esat noteicis, ka vērtība mainīsies uz 30, jums ir taisnība. Tas ir 30, jo (atkal) Java nodod objekta parametrus pēc vērtības. Skaitlis 30 ir tikai vērtības kopija, nevis reālā vērtība. Primārie veidi tiek piešķirti kaudzes atmiņā, tāpēc tiks mainīta tikai vietējā vērtība. Šajā gadījumā nav objekta atsauces.

Nemainīgu objektu atsauču nodošana

Ko darīt, ja mēs to pašu testu izdarītu ar nemaināmu Stīga objekts?

JDK satur daudzas nemainīgas klases. Piemēri ietver iesaiņojuma veidus Vesels skaitlis, Dubultā, Peldēt, Garš, Būla, BigDecimal, un, protams, ļoti labi zināms Stīga klasē.

Nākamajā piemērā ievērojiet, kas notiek, kad mainām a vērtību Stīga.

 public class StringValueChange {public static void main (String ... doYourBest) {String name = ""; changeToHomer (nosaukums); System.out.println (nosaukums); } static void changeToHomer (virknes nosaukums) {name = "Homer"; }} 

Kā jūs domājat, kāda būs izeja? Ja uzminējāt “”, tad apsveicam! Tas notiek tāpēc, ka a Stīga objekts ir nemainīgs, kas nozīmē, ka lauki iekšpusē Stīga ir galīgi un tos nevar mainīt.

Izgatavošana Stīga klases nemainīgs dod mums labāku kontroli pār vienu no Java visbiežāk izmantotajiem objektiem. Ja vērtība a Stīga varētu mainīt, tas radītu daudz kļūdu. Ņemiet vērā arī to, ka nemainām Stīga klase; tā vietā mēs vienkārši piešķiram jaunu Stīga vērtību. Šajā gadījumā vērtība “Homer” tiks nodota tālāk nosaukums iekš changeToHomer metodi. The Stīga "Homērs" varēs pretendēt uz atkritumu savākšanu, tiklīdz tas būs changeToHomer metode pabeidz izpildi. Pat ja objektu nevar mainīt, vietējais mainīgais būs.

Stīgas un daudz ko citu

Uzziniet vairāk par Java Stīga klase un vairāk: skatiet visus Rafaela ierakstus sērijā Java Challengers.

Notiek mainīgu objektu atsauču nodošana

Atšķirībā no Stīga, lielākā daļa objektu JDK ir maināmi, piemēram, StringBuilder klasē. Tālāk sniegtais piemērs ir līdzīgs iepriekšējam, taču tajā ir funkcijas StringBuilder nevis Stīga:

 statiskā klase MutableObjectReference {public static void main (String ... mutableObjectExample) {StringBuilder name = new StringBuilder ("Homer"); addSureName (nosaukums); System.out.println (nosaukums); } static void addSureName (StringBuilder nosaukums) {name.append ("Simpson"); }} 

Vai varat secināt šī piemēra iznākumu? Šajā gadījumā, tā kā mēs strādājam ar maināmu objektu, rezultāts būs “Homer Simpson”. Jūs varētu sagaidīt tādu pašu rīcību no jebkura cita Java maināmā objekta.

Jūs jau esat iemācījies, ka Java mainīgie tiek nodoti pēc vērtības, tas nozīmē, ka tiek nodota vērtības kopija. Vienkārši atcerieties, ka nokopētā vērtība norāda uz a reāls objekts Java atmiņas kaudzē. Iet garām vērtībai joprojām mainās reālā objekta vērtība.

Piedalieties objektu atsauču izaicinājumā!

Šajā Java Challenger mēs pārbaudīsim, ko esat uzzinājis par objektu atsaucēm. Zemāk redzamajā koda piemērā redzams nemainīgs Stīga un maināms StringBuilder klasē. Katrs no tiem tiek nodots kā parametrs metodei. Zinot, ka Java iziet tikai pēc vērtības, kas, jūsuprāt, būs rezultāts, kad tiks izpildīta galvenā šīs klases metode?

 public class DragonWarriorReferenceChallenger {public static void main (String ... doYourBest) {StringBuilder warriorProfession = new StringBuilder ("Dragon"); Stīgu warriorWeapon = "Zobens"; changeWarriorClass (warriorProfession, warriorWeapon); System.out.println ("Warrior =" + warriorProfession + "Weapon =" + warriorWeapon); } static void changeWarriorClass (StringBuilder warriorProfession, String ierocis) {warriorProfession.append ("Bruņinieks"); ierocis = "Pūķis" + ierocis; ierocis = nulle; warriorProfession = null; }} 

Šeit ir opcijas, pārbaudiet atbildes atslēgu šī raksta beigās.

A: Warrior = null Ierocis = null

B: Kareivis = Pūķa ierocis = Pūķis

C: Kareivis = Pūķa bruņinieka ierocis = Pūķa zobens

D: Karotājs = Pūķa bruņinieka ierocis = Zobens

Kas tikko notika?

Pirmais parametrs iepriekš minētajā piemērā ir karavīrsProfesija mainīgais, kas ir maināms objekts. Otrais parametrs - ierocis - ir nemainīgs Stīga:

 static void changeWarriorClass (StringBuilder warriorProfession, virknes ierocis) {...} 

Tagad analizēsim, kas notiek šajā metodē. Šīs metodes pirmajā rindā mēs pievienojam bruņiņieks vērtība karavīrsProfesija mainīgais. Atcerieties, ka karavīrsProfesija ir maināms objekts; tāpēc reālais objekts tiks mainīts, un tā vērtība būs “Pūķu bruņinieks”.

 warriorProfession.append ("Bruņinieks"); 

Otrajā instrukcijā nemainīgais vietējais Stīga mainīgais tiks mainīts uz “Pūķa zobens”. Tomēr reālais objekts nekad netiks mainīts Stīga ir nemainīgs un tā atribūti ir galīgi:

 ierocis = "Pūķis" + ierocis; 

Visbeidzot, mēs ejam garām nulle šeit esošajiem mainīgajiem, bet ne objektiem. Objekti paliks nemainīgi, kamēr tie joprojām būs pieejami ārēji - šajā gadījumā izmantojot galveno metodi. Lai gan vietējie mainīgie būs nulle, ar objektiem nekas nenotiks:

 ierocis = nulle; warriorProfession = null; 

No tā visa mēs varam secināt, ka galīgās vērtības no mūsu maināmās StringBuilder un nemainīgs Stīga būs:

 System.out.println ("Warrior =" + warriorProfession + "Weapon =" + warriorWeapon); 

Vienīgā vērtība, kas mainījās changeWarriorClass metode bija karavīrsProfesija, jo tas ir maināms StringBuilder objekts. Pieraksti to warriorIeroči nemainījās, jo tas ir nemainīgs Stīga objekts.

Pareizā izeja no mūsu Challenger koda būtu:

D: Kareivis = Pūķa bruņinieka ierocis = Zobens.

Video izaicinājums! Objekta atsauču atkļūdošana Java

Atkļūdošana ir viens no vienkāršākajiem veidiem, kā pilnībā absorbēt programmēšanas koncepcijas, vienlaikus uzlabojot arī kodu. Šajā video jūs varat sekot līdzi, kamēr es atkļūdoju un izskaidroju objektu atsauces Java.

Biežas kļūdas ar atsaucēm uz objektiem

  • Mēģina mainīt nemaināmu vērtību ar atsauci.
  • Mēģina mainīt primitīvo mainīgo pēc atsauces.
  • Reālā objekta sagaidīšana nemainīsies, kad metodē mainīsit maināmā objekta parametru.

Kas jāatceras par objektu atsaucēm

  • Java vienmēr nodod parametru mainīgos pēc vērtības.
  • Objekta mainīgie Java vienmēr norāda uz reālo objektu atmiņas kaudzē.
  • Maināmā objekta vērtību var mainīt, kad tā tiek nodota metodei.
  • Nemaināmā objekta vērtību nevar mainīt, pat ja tam tiek nodota jauna vērtība.
  • “Passing by value” attiecas uz vērtības kopijas nodošanu.
  • “Pāreja ar atsauci” attiecas uz mainīgā faktiskās atsauces nodošanu atmiņā.

Uzziniet vairāk par Java

  • Iegūstiet vairāk ātru koda padomu: Izlasiet visus Rafaela ierakstus JavaWorld Java Challengers sērijā.
  • Uzziniet vairāk par maināmiem un nemainīgiem Java objektiem (piemēram, Stīga un StringBuffer) un kā tos izmantot savā kodā.
  • Jūs varētu būt pārsteigts, uzzinot, ka Java primitīvie veidi ir pretrunīgi. Šajā funkcijā Džons I. Mūrs liek domāt par to saglabāšanu un iemācīšanos tos labi izmantot.
  • Turpiniet veidot savas Java programmēšanas prasmes Java Dev Gym.
  • Ja jums patika atkļūdot Java mantojumu, skatiet vairāk video Rafaela Java izaicinājumu video atskaņošanas sarakstā (šīs sērijas videoklipi nav saistīti ar JavaWorld).
  • Vai vēlaties strādāt pie projektiem bez stresa un uzrakstīt kodu bez kļūdām? Dodieties uz vietnes NoBugsProject, lai iegūtu savu kopiju Bez kļūdām, bez stresa - izveidojiet programmatūru, kas maina dzīvi, neiznīcinot savu dzīvi.

Šis stāsts "Vai Java iziet ar atsauci vai iet caur vērtību?" sākotnēji to publicēja JavaWorld.

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