در آموزش گذشته با نحوه کَست کردن دیتا تایپهای مختلف به یکدیگر آشنا شدیم و در این آموزش به تشریح نوع دیگری از فرآیند کَستینگ خواهیم پرداخت که در آن مقدار اختصاصیافته به یک آبجکت را با دیتا تایپ مورد نظر کَست کرده و بالعکس مقداری از نوع دادۀ مد نظر را به آبجکتی کَست مینماییم که برای شروع ابتدا پروژهای جدید تحت عنوان 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 کم کنیم.
در این آموزش به بررسی نحوۀ ساخت آبجکت از روی کلاسهای متناظرِ هر یک از دیتا تایپهای زبان برنامهنویسی جاوا پرداختیم و در ادامه مثالی کاربردی را پیادهسازی نمودیم تا ببینیم که چگونه میتوان در صورت نیاز با فراخوانی برخی متدهای تعریفشده در کلاس مربوطه آنها را به مقداری با دیتا تایپ مورد نظر کَست نمود.