View Full Version : در مورد آرایه
mmmgmmm
دوشنبه 09 شهریور 1394, 21:02 عصر
یه آرایه توی فایلی که لینکشو گذاشتم هست در کلاس circularbuffer که final تعریف شده ولی مقدار اولیه آن تغییر کرده،کسی میدونه چرا؟؟؟
http://s3.picofile.com/file/8209507518/Fig26_18_19.rar.html
قطعه کدش را جدا هم می گذارم:
private final int[] buffer = { -1, -1, -1 }; // shared buffer
private int occupiedCells = 0; // count number of buffers used
private int writeIndex = 0; // index of next element to write to
private int readIndex = 0; // index of next element to read
// place value into buffer
public synchronized void set( int value ) throws InterruptedException
{
// wait until buffer has space avaialble, then write value;
// while no empty locations, place thread in waiting state
while ( occupiedCells == buffer.length )
{
System.out.printf( "Buffer is full. Producer waits.\n" );
wait(); // wait until a buffer cell is free
} // end while
buffer[ writeIndex ] = value; // set new buffer value
-سیّد-
سه شنبه 10 شهریور 1394, 00:15 صبح
سلام
لطفاً وقتی کدی رو اینجا میذارین، توی تگ مخصوص خودش بذارین که بشه خوندش! انصافاً خود شما میتونی کد بالا رو بخونی؟!
من کد شما رو گذاشتم توی تگ JAVA که بشه خوندش:
private final int[] buffer = { -1, -1, -1 }; // shared buffer
private int occupiedCells = 0; // count number of buffers used
private int writeIndex = 0; // index of next element to write to
private int readIndex = 0; // index of next element to read
// place value into buffer
public synchronized void set( int value ) throws InterruptedException
{
// wait until buffer has space avaialble, then write value;
// while no empty locations, place thread in waiting state
while ( occupiedCells == buffer.length )
{
System.out.printf( "Buffer is full. Producer waits.\n" );
wait(); // wait until a buffer cell is free
} // end while
buffer[ writeIndex ] = value; // set new buffer value
اما جواب سؤالتون:
دقت کنید: اینجا ۲ جور متغیر داریم. یکی متغیر buffer که نوعش آرایه هست (آرایه توی جاوا در واقع یه جور شیء هست با تعریف خاص، برای توضیح بیشتر به این تاپیک (http://barnamenevis.org/showthread.php?489315-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1-length-%D8%AF%D8%B1-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D9%87%D8%A7) مراجعه کنید). و یکی دیگه، تک تک متغیرهایی که داخل این آرایه تعریف کردیم. یعنی شما یه متغیر از نوع []int دارید، و داخل اون ۳ تا متغیر int دارید (که مقدار اولیهی همهشون ۱- هست).
حالا سؤال اینه: کدوم متغیر final تعریف شده؟ متغیر buffer که آرایهی شما هست. آیا مقادیر داخل آرایه هم final هستند؟ نخیر. آیا اصلاً میشه توی جاوا مقادیر داخل یه آرایه رو final تعریف کرد؟ نخیر.
پس وقتی شما یه آرایهی final تعریف میکنید، مثل هر متغیر final دیگه، نمیشه مقدار خودش رو عوض کرد، یعنی توی کد بالا نمیتونید بنویسید:
buffer = new int[10];
چون با این کار دارید مقدار خود متغیر final رو عوض میکنید. اما میتونید مقادیر داخلش رو عوض کنید، چون مقادیرش final نیستن.
این قضیه دقیقاً مشابه این کد پایین هست:
public class MyClass {
public int a;
public int b;
public int c;
public MyClass(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
}
...
private final MyClass o = new MyClass(-1, -1, -1);
...
o.a = 10; // مشکلی نیست
o = new MyClass(10, 20, 30); // خطا
توی کد بالا، اون جایی که مقدار فیلد a رو داریم عوض میکنیم، هیچ مشکلی نیست، چون فیلد a که final نیست. اما اون جایی که داریم مقدار خود متغیر o رو عوض میکنیم، خطا داریم چون متغیر o خودش final هست. حالا شما فرض کنید به جای کلاس MyClass، از نوع آرایه تعریف کردید. دقیقاً مشابه همین هست.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.