نحوه ی Cast کردن یک شیئ به یک متغیر و بالعکس در زبان برنامه نویسی جاوا


در آموزش گذشته با نحوه کست کردن متغیر ها به یکدیگر آشنا شدیم. همان طور که توضیح دادیم، عمل Cast کردن به منزله یکی از دستورات کاربردی در برنامه نویسی اپلیکیشن های سیستم عامل اندروید می باشد.

در این آموزش قصد داریم ببینیم که به چه نحوی می توان یک شیء را به یک متغیر و بالعکس کست نمود. پیش از شروع، نیاز است تا پروژه ای جدید تحت عنوان Casting Objects به معنی "کست کردن اشیاء" ایجاد کرده سپس کلاسی با نام Casting در آن بسازیم.

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

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

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

همان طور که ملاحظه می شود طرز ساخت یک شیء از روی کلاس Integer به این شکل است که اول نام کلاس مد نظر را نوشته سپس نامی مرتبط را آن را در نظر می گیریم که در این مثال نام integerObject در نظر گرفته شده است. سپس یک علامت مساوی قرار داده و از آنجا که می خواهیم یک شیء جدید از روی این کلاس بسازیم، نیاز است تا کلید واژه ی new را بنویسیم و سپس نام کلاس را مجدد بنویسم. در داخل پرانتزی که مقابل کلید واژه ی Integer قرار دارد می بایست یک پارامتر تعریف کنیم. به عبارت دیگر این پارامتر همان مقدار کلاس Integer خواهد بود. حال همانند مابقی اشیاء، می توانیم از این شیء ساخته شده در هر کجای برنامه که بخواهیم استفاده کنیم. زمانی هم که بخواهیم از این شیء به عنوان یک متغیر استفاده کنیم، در کلاس Integer متدی تعریف شده است که این کار را برای ما خواهد کرد. اگر بخواهیم مقداری از جنس متغیر int از شیئ که در بالا ساختیم به دست آوریم، می بایست به شکل زیر عمل کنیم:

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

در واقع، در خطی از کد که اضافه کردیم این دستور را به کامپایلر می دهیم که یک متغیر از جنس int تحت عنوان newValue به معنی "مقدار جدید" بسازد سپس مقدار این متغیر را مساوی با نام شیئ که در بالا ساختیم قرار داده به ضمیمه ی متد ()intValue که وظیفه اش تبدیل مقدار شیء بالا به یک متغیر است (لازم به ذکر است که اگر شیء ساخته شده در مرحله قبل از جنس کلاس Double بود می توانستیم از متد ()doubleValue استفاده کنیم.)

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

فرض کنیم که می خواهیم برنامه ای طراحی کنیم که در آن کاربر اول نام خود را وارد کند سپس تاریخ تولد خود را بر اساس تاریخ شمسی وارد کند. سپس برنامه سن ایشان را محاسبه کرده و در نهایت جمله ای در پنجره ی کنسول به نمایش در می آورد مبنی بر این که مثلاً آقا یا خانم ایکس، شما 30 سال سن دارید. برای شروع این پروژه کار خود را به صورت زیر آغاز می کنیم:

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 برای دسترسی به ورودی از طریق کیبورد استفاده خواهیم کرد (در آموزش های پیشین به کرات از این کلاس استفاده شده است. لذا از توضیح پیرامون این کلاس خودداری خواهیم کرد.) نام شیء ساخته شده از روی کلاس Scanner را keyboardInput به معنی "ورودی کیبورد" می گذاریم (لازم به ذکر است برای دسترسی به کلاس Scanner می بایست این کلاس را در برنامه خود Import یا وارد کنیم بنابراین اولین خط از کد فوق برای همین مسئله نوشته شده است.) سپس در دستور ;()System.out.println عبارت Please enter your name به معنی "لطفاً نام خود را وارد کنید" را نوشته ایم. حال قصد داریم تا این امکان را برای کاربر فراهم کنیم که بتواند نام خود را از طریق کیبورد وارد برنامه کند. برای همین منظور کد فوق را به شکل زیر تکمیل می کنیم:

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 عبارت My name is به معنی "نام من هست" را وارد می کنیم. اگر توجه کرده باشید در این دستور از کلیدواژه ی println استفاده نکرده و در عوض از دستور print استفاده کرده ایم چرا که نمی خواهیم برنامه پس از اجرای این دستور به خط بعد برود. سپس یک شیء از روی کلاس String تحت عنوان name به معنی "نام" ایجاد کرده و مقدار آن را ورودی کیبورد به کلاس Scanner قرار می دهیم. برای همین منظور پس از علامت مساوی نام کلاس Scanner را نوشته سپس از متد ()next استفاده می کنیم که وظیفه اش گرفتن ورودی کیبورد است. حال قصد داریم تا کد خود را تکمیل کنیم تا بتوانیم تاریخ تولد را هم از طریق کیبورد بگیریم:

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();
    }
}

مجدد از دستور ;()System.out.print استفاده می کنیم تا عبارت I was born in به معنی "من در ... به دنیا آمدم" را به نمایش در آوریم. سپس یک شیء دیگر از روی کلاس String به اسم date به معنی "تاریخ" ایجاد می کنیم و مقدار آن را همانند شیء name قرار می دهیم. حال اگر برنامه را اجرا کنیم با تصویر زیر مواجه خواهیم شد:

تا اینجای کار برنامه ما به درستی کار می کند. اکنون می خواهیم مقدار شیء ساخته شده از روی کلاس String تحت عنوان date را گرفته و از سال 1392 کم کنیم تا ببینیم فردی به اسم بهزاد چند ساله است. نکته ای که در اینجا می بایست مد نظر قرار داد این است که مقدار date اگر چه که 1362 است اما این در حالی است که جنس آن همانند مقدار name چیزی از جنس استرینگ یا رشته است و ما به هیچ وجه نمی توانیم آن را از عدد 1392 کم کنیم. برای این منظور نیاز است تا از Cast کردن 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);
    }
}

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

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 = 1392 - dateValueToInt;
        System.out.println("Dear " + name + " you are " + yourAge
        + " years old.");
    }
}


در کد فوق پس از تکمیل یک متغیر از جنس int به اسم yourAge به معنی "سن شما" ایجاد کرده ایم و مقدار آن را برابر با حاصل تفریق عدد 1392 از مقدار متغیر dateValueToInt قرار داده ایم. سپس در دستور ;()System.out.println که پس از آن قرار گرفته است کلمه ی Dear به معنی "عزیز" را به علاوه ی name می کنیم که در برگیرنده نام کاربر خواهد بود. سپس عبارت you are به معنی "شما هستید" را به علاوه ی نام متغیری می کنیم که قرار است تاریخ تولد کاربر را از عدد 1392 کسر کند که همان yourAge است. در نهایت عبارت years old را به انتهای عبارت خود اضافه می کنیم. پس از اجرای برنامه، خروجی زیر مشاهده خواهد شد:

در فصل بعد، پیرامون متدها، وظیفه ی آن ها، نحوه ساخت متدها، Access Control یا به عبارتی "کنترل کردن سطح دسترسی" متدها و سایر مباحث مروبوطه در زبان برنامه نویسی جاوا صحبت خواهیم کرد.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
سلام، با تشکر از آموزش های با حوصله و عالیتون.
من میخوام اسمی که کاربر وارد میکنه، وقتی برنامه میخواد تو کنسول نمایش بده، اولین حرفش رو بزرگ نشون بده. یعنی مثلا کاربر وارد میکنه behzad ولی تو کنسول به صورت Behzad نمایش بده.
چی کار کنم؟
ممنون.
محمد صالح
محمد صالح
با سلام
با توجه به آموزشهایی که تاکنون مطالعه کرده ایم نمونه کد لینک پیوست تقدیم می شود
http://8pic.ir/images/yl110gek3qoxlhz7tdim.jpg
احتمالا روشهای بهتری وجود داره ....

در پاسخ به

saba
saba
سلام. نمی شد از اولش هم به جای اینکه سال تولد رو string دریافت کنیم، همون int می گرفتیم؟
Sina Deuxshiri
Sina Deuxshiri
سلام. چرا میشد، اما خُب اینجا برای تمرین بیشتر اینجوری گفته شده.

در پاسخ به

نعیم  بختیاری
نعیم بختیاری
البته این مشکل در اموزش های قبلی هم وجود داشت
نعیم  بختیاری
نعیم بختیاری
با سلام و عرض خسته نباشید
آموزش هاتون واقعا عالین اما به نظر من یه مشکل داره اونم اینکه تنها چیز هایی رو اموزش میدین که مثال میزنین مثلا cast کردن string بهint رو چون مثال زدین اموزش دادین ولی مثلا castکردن stringبهdouble رو اموزش ندادین
حسین
حسین
فکر کنم فهمیدم. متد .intValue برای کست شی از متغیر هم جنس بکار میرود و پارس کردن برای کست شی از متغیر غیر هم جنس.
در هر صورت ممنون.
حسین
حسین
شما برای کست کردن شی به متغیر در ابتدای همین آموزش (پاراگراف پنجم) به اینصورت گفتید:
اگر بخواهیم مقداری از جنس متغیر int از شیئ که ساختیم به دست آوریم، می بایست به شکل زیر عمل کنیم:

int newValue = integerObject.intValue();

متد intvalue چه فرقی با پارس کردن داره و کجا از هر کدوم استفاده میکنیم؟
کاربر میهمان
کاربر میهمان
با سلام و خسته نباشید. آموزش هاتون واقعا عالیه و مباحث پیچیده رو با حوصله و مثال تشریح میکنید . بسیار ممنون.
در ابتدا برای تبدیل شی به متغیر ، متد intValue را معرفی کردید. آیا میشه بجای:
int dateValueToInt = Integer.parseInt(date);
برای تبدیل شی به این شکل نوشت...
int dateValueToInt = Date.intValue();
Sina Deuxshiri
Sina Deuxshiri
سلام
ابتدا اینکه تبدیل شی به متغیر نداریم. به این عملی که انجام شده می گیم پارس کردن. در مورد خط آخر متوجه نشدم می خواین چیکار کنید. بیشتر توضیح بدین.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام واقعا خسته نباشید اموزشهای جامع و کاملی دارید.
لطفا اگه میشه درباره متد pares بیشتر توضیح بدید که دقیقا کارش چیه. ممنون میشم.
Sina Deuxshiri
Sina Deuxshiri
سلام
در اینجا ورودی ای و که از کاربر می گیریم در داخل متغیری از جنس کلاس String ذخیره می کنیم. پارس می کنیم که به عدد تبدیل شه. البته میشه از همون اول وقتی ورودی می گیریم، متغیرمون و همون int تعریف کنیم که دیگه لازم نباشه پارس کنیم.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام بر شما! خدا قوت! اگه به سوال زیر پاسخ بدین ممنون میشم:
یک سوال مهم برام پیش اومد و اونم اینه که خب چرا ما از همون اول متغیر data رو از نوع int نگرفتیم که بعد بتونیم اون رو از سال 1392 براحتی تفریق کنیم؟ بعبارتی به جای ;() String date = keyboardInput.next نمیشد بنویسیم :
int date=keyboardInput.nextInt و دیگه نیازی به استفاده از متد parse int نباشه؟؟
Sina Deuxshiri
Sina Deuxshiri
سلام.
چرا دوست عزیز میشد. اما خب اینجا می تونیم به دید یه تمرین نگاه کنیم تا با نحوه پارس کردن بیشتر آشنا بشیم.

در پاسخ به

ApA
ApA
باسلام و تشکر فراوان از اموزش های بی نظیرتان
من تا آخر این فصل(فصل 9) را به طور کامل و دقیق خوانده ام ,آیا حالا می توانم شروع به خواندن برنامه نویسی اندروید کنم و در کنارش هم بقیه فصل های جاوا را ادامه دهم؟(منظورم این است که آیا در برنامه نویسی اندروید به مشکلی بر نمی خورم؟)
لطفا زود پاسخم را بدهید,بازهم تشکر
Sina Deuxshiri
Sina Deuxshiri
سلام
بهتره که ابتدا جاوا رو تموم کنید. اما می تونید هم زمان با هم مطالعه کنید. موفق باشید :)

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام یه سوال داشتم..چه زمانی از این نوع cast کردن استفاده میشه چون در درس قبلی cast کردن اسانتر انجام میشد..
Mojtaba
Mojtaba
ابتدا تشکر میکنم ازتون .خیلی زیبا مباحث تشریح میکنین و این شیوه اموزش و توضیحات نتیجش این شده که علاقم به برنامه نویسی بیشتر شده. ممنون.
و یه سوال .
در این برنامه که تو این قسمت شرح دادین . در قسمت () String name = keyboardInput.next زمانی که عدد هم وارد میکنیم سیستم دریافت میکنه و نمایش میده.که قاعدتا با تو جه با معرفی String این عمل انجام میشه . چیکار کنیم که فقط کارکتر بگیره و زمانی که عدد وارد میشه اجرا نشه؟
Sina Deuxshiri
Sina Deuxshiri
سلام
شما باید در یک حلقه یه بازه ای و تعریف کنید که فقط شامل کارکترها میشه. می تونید با استفاده از کدهای اسکی این کار و انجام بدین.

در پاسخ به

mostafa
mostafa
ممنون
امیرحسین مختاری
امیرحسین مختاری
عالی