مفهوم Casting در زبان برنامه نویسی جاوا


پس از آشنایی با مبحث وراثت در زبان برنامه نویسی جاوا در فصل گذشته، حال نوبت به توضیح پیرامون Cast کردن در برنامه نویسی می رسد (در زبان انگلیسی واژه ی Cast دارای معانی متفاوتی است اما این در حالی است که در زبان برنامه نویسی جاوا این واژه تعریف خاصی دارد. از این رو از ترجمه لغوی این اصلاح خودداری می کنیم.)

گاهی اوقات در برنامه نویسی برای ما پیش می آید که نیاز داریم تا جنس داده های خود را تغییر دهیم که اصطلاحاً به فرایند تغییر جنس داده ای به داده ای دیگر در زبان برنامه نویسی جاوا Cast کردن گفته می شود. به طور مثال فرض کنیم که ما نیاز داریم تا یک متغیر از جنس int که برای اعداد صحیح مورد استفاده قرار می گیرد را به متغیر double که برای اعداد اعشاری مورد استفاده قرار می گیرد مبدل سازیم که برای این کار می بایست از عمل Cast کردن استفاده کنیم.

لازم به ذکر است پس از آن که ما مثلاً یک متغیر را به یک متغیر دیگر Cast کردیم در واقع ما متغیر قبلی خود را تبدیل به متغیر جدید نکرده ایم بلکه یک متغیر جدید از روی متغیر قبلی خود ساخته ایم که دارای همان جنسی است که مد نظر ما است. از میان کلیه متغیرها تنها متغیری که قابلیت Cast شدن ندارد متغیرهایی از جنس boolean هستند که در آموزش های پیشین با آن آشنا شده ایم

هشدار
به علاقمندان به طراحی اپلیکیشن های اندرویدی توصیه می شود این مبحث را با دقت فرا گیرند چرا که از Cast به کرات در کدهای خود که برای سیستم عامل اندروید طراحی می کنند استفاده خواهند کرد و در صورتی که این مبحث را به خوبی درک نکنند، در توسعه ی اپ های اندروید با مشکل مواجه خواهند شد!

در حقیقت داده ی اولیه ای که ما می خواهیم آن ها را به داده ای از جنس دیگری تبدیل کنیم در اصطلاح برنامه نویسی داده Source به معنی منبع نامیده می شود و داده ی جدید ایجاد شده، داده ی Destination به معنی مقصد نامیده می شود. نکته ای که در اینجا حائز اهمیت است این است که اگر داده های Destination از داده ی Source بزرگ تر باشند، فرایند کست شدن به مراتب با ضریب خطای کمتری صورت خواهد پذیرفت. برای روشن شدن این مطلب یک مثال می زنیم. فرض کنیم که داده Source ما داده ای از جنس یک متغیر از نوع byte می باشد که قصد داریم تا آن را به داده ای از جنس متغیر دیگری از نوع int تبدیل کنیم (برای آشنایی بیشتر می توان به مبحث Primitive Type ها در آموزش های گذشته مراجعه کرد.) همان طور که می دانیم متغیر int نسبت به متغیری از جنس byte که هر دو برای ذخیره سازی اعداد صحیح به کار می روند به مراتب مقادیر بزرگ تری را در خود جای می دهد.

گاهی اوقات نیز عکس این قضیه اتفاق می افتد. به عبارت دیگر فضایی که داده ی Destination از حافظه اشغال می کند نسبت به فضای اشغال شده توسط داده Source کوچکتر است. به طور مثال فرض کنیم که می خواهیم متغیری از جنس int را به متغیری از جنس short که برای ذخیره سازی اعداد صحیح استفاده می شود Cast کنیم. از آن جایی که فضای ذخیره سازی متغیری از جنس short از متغیری از جنس int به مراتب کمتر است، جاوا این تبدیل را برای ما انجام خواهد داد اما این در حالی است که بایستی شاهد نتایج کمی غیر قابل انتظار باشیم!

برای روش شدن مطالب تئوریک فوق، پروژه ای جدید تحت عنوان Cast ایجاد کرده سپس کلاسی به نام Casting در آن ایجاد می کنیم. کد اولیه ی ما به شکل زیر خواهد بود:

public class Casting {
    public static void main(String[] args) {
    }
}

حال یک متغیر از جنس double تحت عنوان doubleVariable به مقدار اولیه 10.2 ایجاد می کنیم. کد تکمیل شده ی ما به شکل زیر خواهد بود:

public class Casting {
    public static void main(String[] args) {
        double doubleVariable = 10.2;
    }
}

متغیر double ایجاد شده به منزله داده ی Source ما خواهد بود. حال قصد داریم تا این داده را به داده ای از جنس متغیر int که برای ذخیره سازی اعداد صحیح مورد استفاده قرار می گیرد Cast کنیم. برای این منظور کد فوق را به شکل زیر تکمیل می کنیم:

public class Casting {
    public static void main(String[] args) {
        double doubleVariable = 10.2;
        int integerVariable = (int) doubleVariable;
    }
}

همان طور که در کد فوق مشاهده می شود ما یک متغیر از جنس int تحت عنوان integerVariable ایجاد کرده و مقدار آن را معادل با مقدار داده Source که در مرحله قبل ایجاد کردیم قرار می دهیم. در واقع در این مرحله ما قصد داریم داده ی Source که همان متغیر double است را به داده Destination که همان متغیر int است Cast کنیم که برای این منظور، پس از علامت مساوی مقابل نام داده Destination یک جفت علامت پرانتز ( ) قرار داده و نوع داده ای را که می خواهیم داده اولیه به آن Cast شود را می نویسیم و از آن جا که در این مثال می خواهیم داده ی ما به داده ای از جنس متغیر int تبدیل شود داخل پرانتز نوع متغیر مد نظر که int می باشد را می نویسیم. در اینجا کار ما به اتمام رسیده است. حال برای آن که خروجی برنامه خود را ببینیم، نیاز به دستور ;()System.out.println داریم. در واقع در مرحله اول نام متغیر اولیه خود یا همان متغیر Source را به صورت زیر می نویسیم:

public class Casting {
    public static void main(String[] args) {
        double doubleVariable = 10.2;
        int integerVariable = (int) doubleVariable;
        System.out.println(doubleVariable);
    }
}

در این مرحله از کار، اگر برنامه را اجرا کنیم خروجی زیر قابل مشاهده خواهد بود:

در واقع از آنجا که داده ی اولیه ی ما از جنس متغیری از نوع double است، ما در خروجی برنامه یک عدد اعشاری خواهیم داشت. حال اگر داده Destination یا همان داده نهایی که پس از Cast شدن داده ی اولیه در قالب یک متغیر از جنس int قرار گرفته است را در دستور ;()System.out.println به صورت زیر قرار دهیم، متوجه عملکرد Cast خواهیم شد:

public class Casting {
    public static void main(String[] args) {
        double doubleVariable = 10.2;
        int integerVariable = (int) doubleVariable;
        System.out.println(integerVariable);
    }
}

در واقع در کد فوق نام متغیر Destination که کست شده است را داخل پرانتز می نویسیم. خروجی برنامه به شکل زیر خواهد بود:

در تصویر فوق می بینیم که جاوا به صورت خودکار پس از Cast کردن داده ای از جنس عدد اعشاری به داده ای از جنس عدد صحیح، عدد را رند کرده است. حال ببینیم عکس این قضیه چه طور ممکن است اتفاق افتد. در این مثال قصد داریم تا Source یی بزرگ تر را به Destination یی کوچک تر از خود Cast کنیم. برای این منظور کد خود را به شکل زیر بازنویسی می کنیم:

public class Casting {
    public static void main(String[] args) {
        int integerVariable = 1000000;
    }
}

در واقع در مثال فوق، داده ی اولیه ما از جنس متغیری از نوع int است که مقدار اولیه آن معادل با 1000000 است. متغیری از جنس int همواره نسبت به متغیری از جنس short دارای ظرفیت بیشتری برای ذخیره سازی اعداد صحیح می باشد. حال می خواهیم متغیر int مثال فوق را به متغیر short که نام آن shortVariable است کست کنیم. برای این منظور کد فوق را به شکل زیر تکمیل می کنیم:

public class Casting {
    public static void main(String[] args) {
        int integerVariable = 1000000;
        short shortVariable = (short) integerVariable;
    }
}

در مرحله ی اول، برای به نمایش در آوردن خروجی برنامه در دستور ;()System.out.println نام متغیر خود که از جنس int است را می نویسیم سپس برنامه را اجرا می کنیم:

می بینیم که همان مقداری که برای متغیر int خود در نظر گرفته بودیم در پنجره ی کنسول به نمایش در آمده است. حال نام متغیر short که کست شده است را به صورت زیر فرا می خواهیم:

public class Casting {
    public static void main(String[] args) {
        int integerVariable = 1000000;
        short shortVariable = (short) integerVariable;
        System.out.println(shortVariable);
    }
}

پس از اجرای برنامه خروجی زیر مشاهده خواهد شد:

همان طور که ملاحظه می شود، از آنجا که ظرفیت متغیری از جنس short نسبت به متغیری از جنس int به مراتب کمتر است، خروجی برنامه نیز عددی به مراتب کوچکتر از مقدار اولیه متغیر int پیش از کست شدن خواهد بود. در آموزش بعد، با نحوه ی Cast کردن یک Object به یک Variable و بالعکس آشنا خواهیم شد.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
با سلام و تشکر از آموزش های جامع و کاملتون
من چون علاقه مند به زبان برنامه نویسی جاوا هستم و در حال حاضر در حال مطالعه ی سری مقدماتی آموزش های برنامه نویسی جاوا سایت شما میباشم. میخواستم بدونم اگه میشه یک کتاب جامع و کامل پیرامون آموزش جاوا به من معرفی کنید تا بعد از اتمام این دوره ی مقدماتی به مطالعه ی اون بپردازم(البته ویدیو آموزشی در این زمینه زیاد هست اما من علاقه مند به مطالعه ی کتاب آموزشی {به شرط جامع بودنش} هستم)
miracle
miracle
سلام بر اقای مرادی عزیز واقعا خدا قوت
روش آموزش شما باعث شده که به طور منظم اونها رو پیگیری کنم و خوب یاد بگیرم امیدوارم بتونم به زودی در امر آموزش دادن و کمک به دیگران به شما ملحق بشم.
در ضمن پادکست هاتون خیلی عالیه همگی شما رو دوست دارم.
کاربر میهمان
کاربر میهمان
خیلی خوب آموزش می دهید مرسی
امیرحسین مختاری
امیرحسین مختاری
سلام
میشه کاربرد cast رو بگین برای چیه؟
Sina Deuxshiri
Sina Deuxshiri
سلام
در همین مثال خوب توضیح داده شده. کست کردن صرفا محدود به داده های اولیه نیست. آبجکت ها رو هم میشه با توجه به یکسری قوانین کست کرد.

در پاسخ به