دسترسی به اشیا از طریق متغیرهای مرجع

داده ها و روش های یک شی را می توان از طریق نقطه (.) عملگر از طریق متغیر مرجع شی. اشیاء تازه ایجاد شده در حافظه تخصیص داده می شوند. آنها از طریق متغیرهای مرجع قابل دسترسی هستند.
متغیرهای مرجع و انواع مرجع
اشیا از طریق شی قابل دسترسی هستند متغیرهای مرجع، که حاوی ارجاعاتی به اشیا هستند. چنین متغیرهایی با استفاده از نحو زیر اعلام می شوند:
ClassName objectRefVar;
یک کلاس در اصل یک نوع تعریف شده توسط برنامه نویس است. یک کلاس یک است نوع مرجع، به این معنی که متغیری از نوع کلاس می تواند به نمونه ای از کلاس اشاره کند. عبارت زیر متغیر را اعلام می کند myCircle بودن از دایره نوع:
Circle myCircle;
متغیر myCircle می تواند مرجع الف باشد دایره هدف – شی. دستور بعدی یک شی ایجاد می کند و مرجع آن را به آن اختصاص می دهد myCircle:
myCircle = new Circle();
میتوانید یک عبارت واحد بنویسید که اعلان یک متغیر مرجع شی، ایجاد یک شی، و تخصیص یک مرجع شی به متغیر را با نحو زیر ترکیب میکند:
ClassName objectRefVar = new ClassName();
به عنوان مثال:
Circle myCircle = new Circle();
متغیر myCircle ارجاع به a دارد دایره هدف – شی.
یک متغیر مرجع شی که به نظر می رسد یک شی را نگه می دارد در واقع حاوی ارجاع به آن شی است. به بیان دقیق، یک متغیر مرجع شی و یک شی متفاوت است، اما اغلب اوقات می توان از این تمایز چشم پوشی کرد. بنابراین، برای سادگی، خوب است
آن را بگو myCircle هست یک دایره به جای استفاده از توصیف طولانی تر که myCircle متغیری است که حاوی ارجاع به a است دایره هدف – شی.
آرایه ها در جاوا به عنوان اشیا در نظر گرفته می شوند. آرایه ها با استفاده از جدید اپراتور. متغیر آرایه در واقع متغیری است که حاوی ارجاع به آرایه است.
دسترسی به داده ها و روش های یک شی
در اصطلاحات OOP، عضو یک شی به فیلدها و روش های داده آن اشاره می کند. پس از ایجاد یک شی، می توان به داده های آن دسترسی داشت و روش های آن را می توان با استفاده از آن فراخوانی کرد عملگر نقطه (.، همچنین به عنوان شناخته شده است اپراتور دسترسی عضو شی:
- objectRefVar.dataField به یک فیلد داده در شی ارجاع می دهد.
- objectRefVar.method(Arguments) متدی را روی شیء فراخوانی می کند.
مثلا، myCircle.radius به شعاع در اشاره می کند myCircle، و myCircle.getArea() را فرا می خواند گتاریا روش در myCircle. متدها به عنوان عملیات روی اشیا فراخوانی می شوند.
فیلد داده شعاع به عنوان یک اشاره می شود متغیرنمونه، زیرا به یک نمونه خاص وابسته است. به همین دلیل، روش گتاریا به عنوان یک اشاره می شود روش نمونه، زیرا شما می توانید آن را فقط در یک نمونه خاص فراخوانی کنید. شیئی که یک متد نمونه بر روی آن فراخوانی می شود a نامیده می شود شیء فراخوان.
به یاد داشته باشید که استفاده می کنید Math.methodName(Arguments) (به عنوان مثال، Math.pow (3، 2.5)) برای فراخوانی یک متد در ریاضی کلاس میشه استناد کنید getArea() استفاده كردن Circle.getArea()? پاسخ منفی است. تمامی روش ها در ریاضی کلاس متدهای ثابتی هستند که با استفاده از عبارت تعریف می شوند ایستا کلمه کلیدی. با این حال، getArea() یک روش نمونه است و بنابراین غیراستاتیک است. باید از یک شی با استفاده فراخوانی شود objectRefVar.methodName(arguments) (به عنوان مثال، myCircle.getArea()).
معمولاً یک شی ایجاد میکنید و آن را به یک متغیر اختصاص میدهید و بعداً میتوانید از متغیر برای ارجاع به شی استفاده کنید. گاهی اوقات یک شی نیازی به ارجاع بعدا ندارد. در این مورد، شما می توانید یک شی را بدون اختصاص دادن صریح به یک متغیر با استفاده از نحو ایجاد کنید:
new Circle();
یا
System.out.println("Area is " + new Circle(5).getArea());
عبارت سابق الف ایجاد می کند دایره هدف – شی. دومی ایجاد می کند دایره شی و آن را احضار می کند گتاریا روش برگرداندن مساحت آن شیئی که به این روش ایجاد می شود به عنوان an شناخته می شود شی ناشناس.
فیلدهای داده مرجع و مقدار null
فیلدهای داده می توانند از انواع مرجع باشند. برای مثال موارد زیر دانشجو کلاس شامل یک فیلد داده است نام از رشته نوع رشته یک کلاس جاوا از پیش تعریف شده است.
class Student {
String name; // name has the default value null
int age; // age has the default value 0
boolean isScienceMajor; // isScienceMajor has default value false
char gender; // gender has default value '\u0000'
}
اگر یک فیلد داده از نوع مرجع به هیچ شیئی ارجاع ندهد، فیلد داده دارای یک مقدار جاوای ویژه است. خالی. خالی به معنای واقعی کلمه است درست است، واقعی و نادرست. در حالی که درست است، واقعی و نادرست حروف بولی هستند، خالی برای یک نوع مرجع تحت اللفظی است.
مقدار پیش فرض یک فیلد داده است خالی برای یک نوع مرجع، 0 برای یک نوع عددی، نادرست برای یک بولی نوع، و \u0000 برای یک کاراکتر نوع با این حال، جاوا هیچ مقدار پیش فرضی را به یک متغیر محلی در داخل یک متد اختصاص نمی دهد. کد زیر مقادیر پیش فرض فیلدهای داده را نمایش می دهد نام، سن، isScienceMajor است، و جنسیت برای یک دانشجو هدف – شی:
class Test {
public static void main(String[] args) {
Student student = new Student();
System.out.println("name? " + student.name);
System.out.println("age? " + student.age);
System.out.println("isScienceMajor? " + student.isScienceMajor);
System.out.println("gender? " + student.gender);
}
}
کد زیر دارای خطای کامپایل است، زیرا متغیرهای محلی هستند ایکس و y مقداردهی اولیه نمی شوند:
class Test {
public static void main(String[] args) {
int x; // x has no default value
String y; // y has no default value
System.out.println("x is " + x);
System.out.println("y is " + y);
}
}
NullPointerException یک خطای رایج در زمان اجرا است. زمانی اتفاق میافتد که یک متد را روی یک متغیر مرجع با a فراخوانی کنید خالی ارزش.
تفاوت بین متغیرهای انواع اولیه و انواع مرجع
هر متغیر یک مکان حافظه را نشان می دهد که دارای یک مقدار است. هنگامی که یک متغیر را اعلام می کنید، به کامپایلر می گویید که متغیر چه نوع مقداری را می تواند نگه دارد. برای یک متغیر از نوع اولیه، مقدار از نوع اولیه است. برای یک متغیر از نوع مرجع، مقدار a است
اشاره به جایی که یک شی در آن قرار دارد. به عنوان مثال، همانطور که در شکل زیر نشان داده شده است، مقدار بین المللی متغیر من است بین المللی ارزش 1، و ارزش دایره هدف – شی ج دارای ارجاع به جایی است که محتویات دایره شی در حافظه ذخیره می شود.
وقتی یک متغیر را به متغیر دیگر اختصاص می دهید، متغیر دیگر روی همان مقدار تنظیم می شود. برای یک متغیر از نوع اولیه، مقدار واقعی یک متغیر به متغیر دیگر اختصاص داده می شود. برای یک متغیر از نوع مرجع، مرجع یک متغیر به متغیر دیگر اختصاص داده می شود.
همانطور که در شکل بالا نشان داده شده است، بیانیه انتساب i = j مطالب را کپی می کند j به من برای متغیرهای اولیه همانطور که در شکل زیر نشان داده شده است، بیانیه انتساب c1 = c2 مرجع را کپی می کند c2 به c1 برای متغیرهای مرجع بعد از انتساب، متغیرها c1 و c2 رجوع به عین شیء شود.
بعد از بیانیه تکلیف c1 = c2، c1 به همان شی اشاره می کند c2. شی که قبلا توسط c1 دیگر مفید نیست و بنابراین در حال حاضر به عنوان شناخته شده است زباله. زباله فضای حافظه را اشغال می کند، بنابراین سیستم زمان اجرا جاوا زباله ها را شناسایی می کند و به طور خودکار فضای اشغال شده را بازیابی می کند. این فرآیند نامیده می شود مجموعه زباله.
اگر میدانید که دیگر به یک شیء نیازی نیست، میتوانید صریحاً اختصاص دهید خالی به یک متغیر مرجع برای شی. اگر شیء توسط هیچ متغیر مرجعی ارجاع داده نشود، JVM به طور خودکار فضا را جمع آوری می کند.