Когато се обаждате аргументи подадени "по стойност". С други думи, стойността на параметъра в тялото на метода - е копие на тези обекти, които са с кодово инициатор премина като аргументи на метода. Ако, например, методът приема като аргумент на стойност от тип двойно, в тялото на метода записва копие на съответните стойности на параметрите, както и евентуални промени към копието по време на действието на метода, не влияе върху съдържанието на променливите в код-инициатор. Да разгледаме следния пример:
клас 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 обекти се предават по стойност. От две копия на една и съща референтна променлива точка на един обект, всички промени в състоянието на обекта, произведени от един линк ще бъде "видян" от другата. Има само един начин да се премине аргументи (по стойност), и тя може значително да опрости живота.
Свързани статии