ارسال کردن پارامتر به متُد، کاری بسیار راحت است، اما کمی مفهوم پیچیدهای دارد. در حالت کلی به سه شکل میتوان به متُدها پارامترهایی را ارسال کرد که عبارت هستند از Call By Value، Call By Pointer، Call By Reference.
نکتهای که وجود دارد این است که بسیاری از برنامه نویسان جاوا معتقدند که جاوا Call By Value است و عدهای دیگر نیز معتقدند که جاوا Call By Reference است. اینکه جاوا را چه مینامند اصلا اهمیتی ندارد، بلکه مهم این است که شما رفتار جاوا را بدانید که در هر وضعیت چگونه عمل میکند.
در جاوا دو نوع داده وجود دارد که عبارت هستند از دادههای اولیه (Primitive Data Type) و دادههای ارجاعی (Reference Data Type). دادههای اولیه (Primitive Data Type) هشت نوع بودند: byte, short, int, long, char, float, double, boolea. این هشت نوع داده به صورت پیشفرض در جاوا تعریف شدهاند و استفاده از آنها در یک مثال ساده به صورت زیر است:
package ir.zoomit;
public class MainApp {
public static void main(String[] args) {
int integerNumber = 10;
char character = 'A';
boolean b = true;
}
}
با استفاده از Primitive Data Typeها میتوانیم دادههای پیچیدهتری را بسازیم. به عنوان مثال کلاس String که برای کار با رشتهها استفاده میشود، در دل خودش از دادهی کارکتر (char) استفاده کرده است. String یک کلاس است، بنابراین جزء دادههای ارجاعی (Reference Data Type) به حساب میآید. به عبارت دیگر تمام کلاسها که از روی آنها اشیائی ایجاد میشود، جزء دادههای ارجاعی هستند و فقط و فقط آن هشت دادهای که در بالا گفته شد جزء دادههای پایه به حساب میآیند.
چند نکته در مورد دادههای پایه و ارجاعی
دقیقا منظور از ارجاع یا Reference چیست؟ به طور کلی برای استفاده از دادههای ارجاعی، حتما باید ابتدا از روی آنها یک آبجکت ساخت. به صورت زیر:
package ir.zoomit;
public class MainApp {
public static void main(String[] args) {
Person p = new Person(); // Object Creation OR Instantiation
}
}
class Person {
}
در کد بالا دو کلاس وجود دارد. یکی کلاس اصلی (MainApp) که در آن متد معروف main پیادهسازی شده است و دیگری کلاس Person که هیچ پیاده سازی ندارد. همانطور که مشاهده میکنید در داخل متد main یک آبجکت از روی کلاس Person ساختهایم.
نکته: اصطلاحا به ساخت آبجکت از روی یک کلاس Object Creation یا Instantiation گفته میشود. حتما اصطلاحات انگلیسی را با تلفظ درست یاد بگیرید و به کار ببرید.
در بسیاری از کتابها و منابع آموزشی به اشتباه گفته میشود که p در کد بالا شی یا آبجکت است. در صورتی که کاملا اشتباه است. ما در آموزشهای قبلی هم در مورد این موضوع صحبت کردیم، اما بهتر است دوباره نگاهی سطح پایینتر به این موضوع داشته باشیم.
همانطور که میدانید برای ساختن یک شی از روی یک کلاس، باید آن کلاس را new کنیم. هنگامی که با استفاده از عملگر new اقدام به ساخت یک شی از روی یک کلاس میکنیم، عملگر new در واقع دو کار را انجام میدهد. ابتدا یک شی جدید در حافظهی Heap ایجاد میکند و سپس یک Reference یا ارجاعی از آن شی ساخته شده را برمیگرداند. یعنی ما با استفاده از آن ارجاع، میتوانیم به شی ساخته شده در حافظه دسترسی داشته باشیم. برای اینکه بتوانیم با استفاده از ارجاع به شیئی در حافظه دسترسی داشته باشیم، باید ارجاع را در یک متغیری ذخیره کنیم. این متغیر در کد بالا، p است. بنابراین p شی نیست، بلکه یک Reference یا ارجاعی به شی در حافظه است.
نکتهی دیگری که باید از آن اطلاع داشته باشید و قبلا هم به آن اشاره شده است، این است که در تکه کد زیر:
Person p = new Person();
متغیر p در حافظهی Stack (استک) ایجاد شده است و آبجکت یا شی در حافظهی Heap «هیپ».
- ۹۹/۰۲/۲۸