ПредишенСледващото

Когато се обаждате аргументи подадени "по стойност". С други думи, стойността на параметъра в тялото на метода - е копие на тези обекти, които са с кодово инициатор премина като аргументи на метода. Ако, например, методът приема като аргумент на стойност от тип двойно, в тялото на метода записва копие на съответните стойности на параметрите, както и евентуални промени към копието по време на действието на метода, не влияе върху съдържанието на променливите в код-инициатор. Да разгледаме следния пример:

клас PassByValue

публично статично невалидни основни (String [] опцията)

Sustem.out.println ( "нагоре: един =" + он);

Sustem.out.println ( "след: един =" + он);

публично статично невалидни halveIt (двойна арг)

Arg / = 2.0; // Разделете половината от стойността на Arg

sustem.out.println ( "половин: Arg =" + Arg);

по-долу показва резултатите от програмата - стойности на параметрите на работа разделение в метод арг halveIt не влияе на съдържанието на променлива в един метод тяло основна.

половината: Arg = 0.5

клас PassRef

публично статично невалидни основни (String [] опцията)

Боди Венера = нов орган ( "Benepa", нула);

Sustem.out.rgintln ( "до" + Венера);

Sustem.out.rgintln ( "след" + Венера);

публично статично невалидни CommonName (Body bodyRef)

bodyRef.name = "Утринна звезда";

В резултат на програмата е, както следва:

След: 0 (Morning Star)

Моля, имайте предвид, че състоянието на "външни" във връзка с метода на CommonName обект изменяема "отвътре" на този метод; В допълнение, Венера променлива запазила препратка към същия клас обект на тялото, както и метод CommonName копие bodyRef референтна променлива Венера получи друга стойност - нула. Всичко това, разбира се, изисква по-подробно обяснение.

Следната диаграма илюстрира променливите на състоянието, веднага след обаждане от главния метод SommonName.

В този момент две променливи, Венера в основните и в bodyRef COMMONNAME, посочете един и същ обект. Когато COMMONNAME метод за извършване на промяна в поле bodyRef.name се променя от съдържанието на един и същ обект, който е общ за двете референтни променливи. Когато COMMONNAME възлага bodyRef стойност нула, промяна само на съдържанието на самата променлива bodyRef; препратка състояние Венера остава същата като параметър bodyRef - копие от променливата Венера, приет през като аргумент от стойността. Единствената информация, че последният елемент е изложен - е създаването bodyRef като такова (същото се наблюдава в предишния пример, когато само "жертва" страна в процеса метод halveIt доказва параметър арг). Ако промяната bodyRef повлиян Венера стойност в основната, след низ. показва на екрана, тя ще съдържа думата нула. (. BodyRef име = ...) Що се отнася до първото твърдение задача в тялото на метода COMMONNAME, трябва да се повтори още веднъж: един и същ обект в същото време посочи двете променливи, Венера в основния и bodyRef в COMMONNAME, така че промени в състоянието на обекта, чрез позоваване bodyRef, ще бъдат видими при достъп до обекта с другите съществуващи връзки (по-специално, Венера).

Има много неща, общ, така че решението е неправилно и че Java обекти се твърди, че мина "за справка." На теория, езици за програмиране, връзката терминът предаване е достатъчно upotrebitelny, строго погледнато, означава следното: когато аргументът предава на функция, наречена функция получава препратка към първоначалната стойност, но не и копие от тази стойност. Ако тялото на стойността на функция се променя, съответните данни в кода започва разговор, също е обект на промяна, и параметъра като аргумент посочи същия блок памет. Ако Java всъщност е позволено да използват аргументи подадени чрез препратка, имаше начин да се декларира метод halveIt, така че неговата вътрешна код може да се промени стойността на външен променлив, и да позволи на метода SommonName промените стойността на Венера до нула. Но това не е възможно. В Java обекти се предават чрез препратка - референтни PA обекти се предават по стойност. От две копия на една и съща референтна променлива точка на един обект, всички промени в състоянието на обекта, произведени от един линк ще бъде "видян" от другата. Има само един начин да се премине аргументи (по стойност), и тя може значително да опрости живота.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!