JavaRush /Java Blogu /Random-AZ /Java-da parametrlərin ötürülməsi
vincent_vega
Səviyyə
Gainesville

Java-da parametrlərin ötürülməsi

Qrupda dərc edilmişdir
Java-da dəyişən dəyəri olan konteynerdir. Beləliklə, dəyişəni "keçmək" nə deməkdir? Və primitiv və istinad məlumat növləri arasındakı fərq nədir.
Java-da parametrlərin ötürülməsi - 1
Buna sonra çatacağıq. Əvvəlcə sadə bir tapşırıqla başlayaq. Bu kod nə edir:
int х = 3;
int у = х;
1-ci sətirdə int tipli x dəyişəni yaradılır və ona 3 dəyəri təyin edilir. 2-ci sətirdə int tipli y dəyişəni yaradılır və x dəyişəninin qiyməti təyin edilir . Gələcəkdə x dəyişəni heç bir şəkildə y-yə təsir göstərmir . Java x (3) dəyərini kopyalayır və kopyalayanları y -ə yerləşdirir . Bu, parametrin dəyərinə görə ötürülür. Bir dəyişəni digərinə yazmırsınız. Dəyər kopyalanır və yeni dəyişənə təyin edilir. İfadə y = x; " X-i y -yə yaz" demək DEYİL . Bu, " x daxilindəki dəyəri kopyalayın və həmin nüsxəni y -yə yazın " deməkdir. Əgər sonra y-ni dəyişdirsəm :
у = 34;
Bu x- ə təsir edəcəkmi ? Əlbəttə yox. x hələ də 3 dəyərinə malikdir. Əgər x-i sonra dəyişsəm :
х = 90;
Bu sizə necə təsir edəcək ? Heç bir şəkildə. Tapşırıq yerinə yetirildikdən sonra onlar heç bir şəkildə əlaqəli deyil (qiyməti KOPYALAMA). Referans növləri haqqında nə demək olar? Onlar necə işləyirlər? O qədər də çətin deyil, əslində qayda eynidir. Linklər eyni şeyi edir - linkin surətini alırsınız. Beləliklə, desəm:
Cat A = new Cat ();
Cat B = A;
A keçidi B linkinə kopyalanır. Bu obyektə aid deyil - hələ də yalnız bir obyektiniz var. Ancaq indi eyni Cat obyektini idarə edən iki fərqli istinadınız var . İndi isə parametrlərin metodlara ötürülməsinə baxaq. Java parametrləri dəyərlə ötürür. Həmişə. Bu, "dəyəri kopyalayın və nüsxəni ötürün" deməkdir. İbtidai növlər üçün bu asandır:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
doStuff metodu belə görünür:
void doStuff (int у) {

   / / Действия с 'y'
}
x dəyərinin surəti , yəni 5 doStuff() metoduna ötürülür . doStuff() metodunun y adlı öz dəyişəni var . y dəyişəni yeni, fərqli dəyişəndir. Metodun keçməsi zamanı x- də olanların surəti ilə . Bundan sonra yx-in bir-birinə heç bir təsiri yoxdur. y dəyişdirdiyiniz zaman x-ə təsir etmirsiniz .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
Və əksinə - x-i dəyişdirsəniz , y-ni dəyişməyəcəksiniz . Bu halda x- in etdiyi yeganə şey onun dəyərini kopyalayıb doStuff() metoduna ötürmək idi . "Dəyərdən keçmək" istinadlarla necə işləyir? Çox adam deyir ki, “Java ibtidai tipləri dəyərə görə, obyektləri isə istinadla ötürür”. Onların dedikləri deyil. Java hər şeyi dəyərlə keçir. Primitivlərlə məzmunun surətini alırsınız. Bağlantılarla siz məzmunun surətini də əldə edirsiniz. Bəs linkin məzmunu nədir? Uzaqdan nəzarət. Obyekti idarə etmək/girmək üçün qurğular. Obyektə istinadı metoda ötürəndə siz istinadın surətini keçirmiş olursunuz. Uzaqdan idarəetmə klonu. Obyekt hələ də yaradıldığı yığında oturaraq kiminsə pultdan istifadə etməsini gözləyir. Obyekt onu idarə etmək üçün nə qədər pultun “proqramlaşdırıldığına” əhəmiyyət vermir. Bununla maraqlanan yeganə insanlar zibil yığan və siz proqramçısınız. Beləliklə, siz deyəndə:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Yalnız bir Pişik obyekti var . Ancaq indi iki uzaqdan idarəetmə (link) eyni Cat obyektinə daxil ola bilər . Beləliklə, indi B- nin Cat obyektinə etdiyi hər şey A-nın göstərdiyi Pişiyə təsir edəcək , lakin A -nın məzmununa təsir etməyəcək ! Siz Cat-ı yeni B linkindən istifadə edərək dəyişə bilərsiniz (birbaşa A -dan kopyalanır), lakin A-nı dəyişə bilməzsiniz. Bu nə deməkdir? Siz A-nın istinad etdiyi obyekti dəyişə bilərsiniz , lakin siz A-nın istinadını dəyişə bilməzsiniz - onu başqa obyektə yönləndirin və ya null . Beləliklə, B istinadını dəyişdirsəniz ( B-nin istinad etdiyi faktiki Cat obyekti deyil, istinadın özünün dəyəri) A dəyərini dəyişməyəcəksiniz . Və əksinə. Belə ki:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Sadəcə olaraq, B başqa obyektə işarə edir. A hələ də xoşbəxtdir. Məndən sonra təkrarlayın: Java hər şeyi dəyərlə keçir. (Yaxşı, bir daha... hisslə.) Java hər şeyi dəyərlə keçir. İbtidai növlər üçün cari dəyərin surətini, obyekt istinadları üçün isə istinadın surətini (uzaqdan idarəetmə) ötürürsünüz. Heç vaxt obyekti keçmirsiniz. Bütün obyektlər yığında saxlanılır. Həmişə. İndi bir fincan qəhvə dəmləyin və bir neçə kod yazın! Orijinal məqalə.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION