View Full Version : مبتدی: محدوده دسترسی آرایه ها
dele514
سه شنبه 31 فروردین 1395, 09:35 صبح
سلام به همه
public class parameter {
static void f(int a,int[] array) {
a=4;
array[0]=5;
}
public static void main(String[] args) {
int a=1;
int[] array=new int[2];
array[0]=3;
f(a,array);
System.out.println(a+array[0]);
}
}
خروجی کد بالا عدد6 هست.یعنی متغیر a=1 و array[0]=5
در مورد متغیر ها واضحه که هر متغیری که داخل یه متد تعریف شده نمی تونیم با یه متد دیگه مقدار دهیش کنیم
حالا میخوام بدونم که آرایه ها چی؟چرا اینجا مقدارش رو تونستیم تغییر بدیم؟
Ahmad_Hoghooghi
چهارشنبه 01 اردیبهشت 1395, 22:47 عصر
در واقع بحث اصلی ای که این جا مطرح است در مورد "محدوده دسترسی" نیست. بلکه در مورد "تفاوت مفهوم pass by Value برای primitive type و reference type در جاوا" است.
در جاوا رابطه ی آرگومان و پارامتر یک تابع به این صورت است که
اگر نوع آنها از نوع primitive باشد، مقدار آرگومان در پارامتر کپی می شود (مفهوم ساده ی pass by value)
اگر نوع آنها از نوع reference type باشد (Object باشد)، در این صورت Object Reference آرگومان در Object Reference پارامتر کپی می شود. (Object references is passed by value)
ویژگی pass by value این است که اگر در داخل تابع تغییراتی در آنچه که در پارامتر داده شده داده شود، روی آرگومان ها، در محلی که تابع فراخوانی شده تاثیری ندارد. یعنی به صورت ساده آن چیزی که در مثال شما در مورد متغیر از نوع int با نام a اتفاق افتاد. من مثال شما را کمی تغییر دادم تا تمام مفهوم را پوشش دهد:
public class parameter {
static void f(int a,int[] array1,int[] array2) {
a=2;
array1[0]=2;
array2 = new int[2];
}
public static void main(String[] args) {
int primitiveIntVariable=1;
int[] arrayToCheckChangeInItem=new int[1];
int[] arrayToCheckChangeInReference=new int[1];
f(primitiveIntVariable,arrayToCheckChangeInItem,ar rayToCheckChangeInReference);
System.out.println("primitiveIntVariable " +primitiveIntVariable+"\n"+ // ans=1
"arrayToCheckChangeInItem "+arrayToCheckChangeInItem[0]+"\n"+ // ans=2
"arrayToCheckChangeInReference " + arrayToCheckChangeInReference[0]+"\n" // ans=0
);
}
}
در این مثال عملکرد مشابهی در مورد آرایه ی دوم هم اتفاق افتاده، یعنی یک آرایه جدید ایجاد کردیم و آن را در array2 قرار دهیم، اما تغییر در Object Reference پارامتر دوباره در آرگومان کپی نمی شود، به همین دلیل آرایه ی arrayToCheckChangeInReference در main در همان مقدار قبلی باقی مانده است.
شرح نکته ای که باعث ابهام می شود:
این نکته با استفاده از آرایه ی اول نشان داده شده است. وقتی آدرس یک Object را به تابعی می فرستیم، این تابع می داند متغییر ما در کدام خانه از حافظه ذخیره شده است، در نتیجه می تواند به آن خانه از حافظه مراجعه کند و تغییراتی در آنجا بدهد (array1[0]=2)، دقت کنید که شما [در جاوا] از داخل متد f قادر نیستید کاری کنید که arrayToCheckChangeInItem به خانه ی دیگری از حافظه اشاره کند، اما همان طور که می بینید می توانید تغییراتی در خانه هایی که به آنها اشاره می کند بدهید.
برای مطالعه ی بیشتر: این مقاله (http://javadude.com/articles/passbyvalue.htm)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.