سرفصل‌های آموزشی
آموزش جاوا
نحوۀ Cast کردن آبجکت‌ به دیتا تایپ‌ و بالعکس در زبان جاوا

نحوۀ Cast کردن آبجکت‌ به دیتا تایپ‌ و بالعکس در زبان جاوا

در آموزش گذشته با نحوه کَست کردن دیتا تایپ‌های مختلف به یکدیگر آشنا شدیم و در این آموزش به تشریح نوع دیگری از فرآیند کَستینگ خواهیم پرداخت که در آن مقدار اختصاص‌یافته به یک آبجکت را با دیتا تایپ مورد نظر کَست کرده و بالعکس مقداری از نوع دادۀ مد نظر را به آبجکتی کَست می‌نماییم که برای شروع ابتدا پروژه‌ای جدید تحت عنوان CastingObjects ایجاد کرده سپس کلاسی به نام Casting در آن می‌سازیم.

نکتۀ قابل‌توجه در رابطه با کَستینگ آبجکت‌ها این است که در زبان برنامه‌نویسی جاوا نمی‌توان آبجکتی را به دیتا تایپ مورد نظر و بالعکس کَست نمود بلکه این کار با به‌کارگیری کلاسی از پیش تعریف‌شده و متناظر با هر دیتا تایپ در این زبان امکان‌پذیر می‌باشد. در واقع، هر یک از دیتا تایپ‌های مطرح‌شده در زبان جاوا از کلاسی هم‌نام با دیتا تایپ مربوطه برخوردار است که می‌توان با استفاده از قابلیت‌های این کلاس‌ها عملیات کَست کردن از یک آبجکت به دیتا تایپ مورد نظر و بالعکس را انجام داد.

همان‌طور که در آموزش‌های پیشین توضیح دادیم، در زبان برنامه‌نویسی جاوا هشت نوع دادۀ Primitive Type داریم که عبارتند از double ،float ،int ،short ،long ،byte ،char و boolean که توجه داشته باشیم تمامی آن‌ها با حروف کوچک نوشته‌ شده‌اند. به علاوه، کلاس‌های از پیش تعریف‌شدۀ هم‌نام با آن‌ها نیز در زبان جاوا برای هر یک از این دیتا تایپ‌ها در نظر گرفته شده‌اند با این تفاوت که کلاس‌های مذکور با حرف اول بزرگ نوشته می‌شوند که عبارتند از Double ،Float ،Integer ،Short ،Long ،Byte ،Character و Boolean به طوری که نام دو کلاس Integer و Character به صورت کامل نوشته می‌شوند در حالی که دیتا تایپ متناظر آن‌ها به ترتیب به صورت int و char نام‌گذاری شده‌اند.

اکنون قصد داریم تا یک آبجکت از روی کلاس Integer ایجاد کرده و مقداری به آن اختصاص دهیم (توجه داشته باشیم حرف اول واژۀ Integer به صورت بزرگ نوشته شده است.) که برای این منظور به صورت زیر عمل می‌کنیم:

public class Casting {
    public static void main(String[] args) {
        Integer integerObject = new Integer(123);
    }
}

همان‌طور که ملاحظه می‌کنیم، نحوۀ ساخت یک آبجکت از روی کلاس Integer بدین صورت است که اول نام کلاس مد نظر را نوشته سپس نام آبجکت را نوشته و با استفاده از کیورد new به کامپایلر دستور می‌دهیم که آبجکتی جدید از روی کلاس Integer ساخته و با عملگر = آن را به متغیر مورد نظر منتسب کند و بدین ترتیب در کد فوق آبجکتی تحت عنوان integerObject از روی کلاس Integer ساخته‌ و مقدار 123 از جنس عدد صحیح را بدان منتسب نموده‌ایم.

حال همانند مابقی آبجکت‌ها، می‌توانیم آبجکت ساخته‌شده را در تمامی قسمت‌های برنامه مورد استفاده قرار دهیم مضاف بر اینکه در صورت نیاز به استفاده از آن به عنوان یک مقدار عددی، می‌توانیم با فراخوانی متد تعریف‌شده در کلاس Integer روی آبجکت مد نظر آن را به مقدار عددی تبدیل نماییم به طوری که برای تبدیل آبجکت integerObject به مقداری با دیتا تایپ int به روش زیر عمل می‌کنیم:

public class Casting {
    public static void main(String[] args) {
        Integer integerObject = new Integer(123);
        int newValue = integerObject.intValue();
    }
}

در کد فوق، ابتدا آبجکتی از روی کلاس Integer تحت عنوان integerObject ساخته و مقدار عددی 123 را بدان منتسب کرده‌ایم و در ادامه متغیر دیگری به منظور نگهداری مقدار عددی 123 پس از کَستینگ تعریف کرده و مقدار ریترن‌شده در نتیجۀ فراخوانی متد ()intValue روی آبجکت integerObject را به آن اختصاص داده‌ایم (چنانچه آبجکت ساخته‌شده در مرحلۀ قبل از جنس کلاس Double بود، می‌توانستیم از متد ()doubleValue استفاده کرده و آن را به یک مقدار عددی از جنس double کَست کنیم.)

همچنین یکی از موارد رایج در فرآیند کَستینگ آبجکت به مقداری با دیتا تایپ مورد نظر، تبدیل آبجکت ساخته‌شده از روی کلاس String به مقداری با دیتا تایپ int است که برای روشن شدن این مطلب سناریویی تعریف کرده و آن را پیاده‌سازی می‌نماییم.

فرض می‌کنیم که می‌خواهیم برنامه‌ای طراحی کنیم تا در آن کاربر ابتدا نام سپس سال تولد خود را بر اساس تاریخ شمسی وارد برنامه کند و پس از اجرای برنامۀ مذکور سن ایشان محاسبه شده و به همراه استرینگی در پنجرۀ کنسول چاپ شود. برای شروع ابتدا نیاز است که استرینگی در کنسول چاپ کنیم تا به کاربر اطلاع دهیم که اطلاعات خود را وارد برنامه کند که برای این منظور به صورت زیر عمل می‌کنیم:

import java.util.Scanner;
public class Casting {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println("Please enter your name");
    }
}

در کد فوق، مشابه آنچه در آموزش‌های پیشین آموختیم، جهت دسترسی به ورودی از طریق کیبورد و دریافت دیتا از کلاس Scanner استفاده کرده و ابتدا آبجکتی به نام keyboardInput از روی آن می‌سازیم و با استفاده از دستور System.in به ورودی آی‌دی‌ای دسترسی پیدار می‌کنیم سپس استرینگ «Please enter your name» را با استفاده از متد ()println در کنسول چاپ می‌نماییم. حال به منظور دریافت دیتای ورودی از سمت کاربر، کد فوق را به صورت زیر تکمیل می‌کنیم:

import java.util.Scanner;
public class Casting {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println("Please enter your name");
        System.out.print("My name is ");
        String name = keyboardInput.next();
    }
}

همان‌طور که ملاحظه می‌کنیم، با اجرای برنامه ابتدا استرینگ «Please enter your name» چاپ شده و در سطر بعد استرینگ «My name is» را داریم و برنامه در همان سطر منتظر دریافت ورودیِ مربوط به نام کاربر می‌ماند چرا که از متد ()print برای چاپ این استرینگ استفاده کرده‌ایم. در ادامه، آبجکتی از روی کلاس String تحت عنوان name ساخته‌ایم و با فراخوانی متد ()next روی آبجکت keyboardInput دیتای ورودیِ کاربر را خوانده و با استفاده از عملگر = آن را به آبجکت name منتسب کرده‌ایم (در آموزش نحوۀ تعریف نوع ورودی کلاس Scanner در زبان برنامه‌نویسی جاوا نحوۀ عملکرد متد ()next و سایر متدهای کلاس Scanner را تشریح نموده‌ایم.) اکنون به منظور دریافت دیتای مربوط به سال تولد کاربر، کد فوق را به صورت زیر تکمیل می‌نماییم:

import java.util.Scanner;
public class Casting {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println("Please enter your name");
        System.out.print("My name is ");
        String name = keyboardInput.next();
        System.out.print("I was born in ");
        String date = keyboardInput.next();
        keyboardInput.close();
    }
}

در کد فوق، مجدداً از متد ()print استفاده کرده و استرینگ «I was born in» را در کنسول چاپ می‌کنیم تا از کاربر بخواهیم که سال تولد خود را وارد کند و در ادامه به منظور خواندن دیتای ورودیِ کاربر، آبجکتی تحت عنوان date از روی کلاس استرینگ ساخته و دیتای ریترن‌شده در نتیجۀ فراخوانی متد ()next روی آبجکت ساخته‌شده از روی کلاس Scanner را بدان منتسب می‌کنیم که در این مرحله اگر برنامۀ فوق را اجرا کنیم، در خروجی خواهیم داشت:

Please enter your name
My name is Behzad
I was born in 1362

تا به این مرحله نام کاربر و سال تولد وی را در قالب دیتایی از جنس استرینگ به ترتیب در آبجکت‌های name و date ذخیره کرده‌ایم اما در ادامه قصد داریم تا استرینگ اختصاص‌یافته به آبجکت date را گرفته و آن را از سال 1398 کم کنیم تا ببینیم فردی به اسم بهزاد چند ساله است (نکتۀ قابل‌توجه در ارتباط با دیتای مربوط به سال تولد کاربر این است که دیتای مذکور از جنس استرینگ می‌باشد و نمی‌توان آن را از عدد 1398 کم کرد که برای این منظور نیاز است تا استرینگ منتسب به آبجکت date را به دیتایی با دیتا تایپ int کَست نماییم.) بنابراین کد فوق را به صورت زیر تکمیل می‌کنیم:

import java.util.Scanner;
public class Casting {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println("Please enter your name");
        System.out.print("My name is ");
        String name = keyboardInput.next();
        System.out.print("I was born in ");
        String date = keyboardInput.next();
        int dateValueToInt = Integer.parseInt(date);
        keyboardInput.close();
    }
}

پس از دریافت دیتای مربوط به نام و سال تولد کاربر، در سطر دهم با استفاده از دیتا تایپ int متغیری تحت عنوان dateValueToInt تعریف کرده و متدی به نام ()parseInt از کلاس Integer را فراخوانی کرده و دیتای ریترن‌شده در نتیجۀ این فراخوانی را به متغیر dateValueToInt اختصاص داده‌ایم. در واقع، نحوۀ کار متد ()parseInt بدین صورت است که یک آرگومان ورودی از جنس استرینگ گرفته و آن را به دیتایی از جنس عدد صحیح تبدیل می‌کند و از همین روی در کد فوق آبجکت date را به عنوان آرگومان ورودی به متد ()parseInt داده‌ایم تا استرینگ منتسب به آن را به دیتایی از جنس عدد صحیح کَست نماید سپس نتیجۀ ریترن‌شده از این متد در متغیر dateValueToInt ذخیره شود. در ادامه، نیاز داریم تا عدد مربوط به سال تولد کاربر را از عدد 1398 کم کنیم و برای این منظور کد فوق را به شکل زیر تکمیل می‌کنیم:

import java.util.Scanner;
public class Casting {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println("Please enter your name");
        System.out.print("My name is ");
        String name = keyboardInput.next();
        System.out.print("I was born in ");
        String date = keyboardInput.next();
        int dateValueToInt = Integer.parseInt(date);
        int yourAge = 1398 - dateValueToInt;
        System.out.println("Dear " + name + " you are " + yourAge + " years old.");
        keyboardInput.close();
    }
}

در کد فوق، با استفاده از دیتا تایپ int متغیری تحت عنوان yourAge تعریف کرده و نتیجۀ حاصل از کسر مقدار منتسب به متغیر dateValueToInt از عدد 1398 را بدان اختصاص داده‌ایم و در ادامه مقدار منتسب به این متغیر و همچنین name را با استفاده از عملگر +‌ با استرینگ‌های فوق‌الذکر کانکت کرده و در کنسول چاپ می‌کنیم. بنابراین با اجرای برنامۀ فوق در خروجی خواهیم داشت:

Dear Behzad you are 36 years old.

همان‌طور که می‌بینیم، دیتای دریافت‌شده از کاربر در قالب یک مقدار استرینگ بوده و با فراخوانی متدی از کلاس Integer توانستیم آن را به مقداری از نوع دادۀ int تبدیل کرده و در نهایت از عدد 1398 کم کنیم.

در این آموزش به بررسی نحوۀ ساخت آبجکت از روی کلاس‌های متناظرِ هر یک از دیتا تایپ‌های زبان برنامه‌نویسی جاوا پرداختیم و در ادامه مثالی کاربردی را پیاده‌سازی نمودیم تا ببینیم که چگونه می‌توان در صورت نیاز با فراخوانی برخی متدهای تعریف‌شده در کلاس مربوطه آن‌ها را به مقداری با دیتا تایپ مورد نظر کَست نمود.

online-support-icon