مفهوم تبدیل نوع داده ها در جاوا

چاپ

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

 

مثال (مفهوم تبدیل نوع داده ها در جاوا)

double
float
long
int

 هنگامی که در یک عبارت محاسباتی از دو مقدار با نوع متفاوت استفاده شود، نوع متحد سازی شده، در لیست بالا، آن نوعی است که شماره ی کمتری دارد. بعبارت دیگر عملوندی که در این لیست شماره ی بیشتری داشته باشد، به نوع عملوندی که شماره ی کمتری در این لیست دارد، تبدیل می شود. بعنوان مثال جمع یک عدد از نوع double و یک عدد از نوع int، می شود از نوع double. و یا به عنوان مثالی دیگر، تفریق یک عدد از نوع long و یک عدد از نوع float می شود از نوع float. 

 نکته: مقادیر بولی(Boolean) را نمی توان به دیگر انواع داده ها تبدیل نمود. در برخی از زبان های برنامه نویسی مثل ++C  مقادیر بولی در حقیقت عدد هستند، اما جاوا این چنین نیست. 

بعنوان مثال فرض کنید که یک متغیر به نام hoursWorked از نوع int داریم و یک متغیر دیگر به نام payRate از نوع double داریم. و می خواهیم به صورت زیر آنها را در یکدیگر ضرب کنیم:

مثال (مفهوم تبدیل نوع داده ها در جاوا)

int hoursWorked = 37;
double payRate = 6.73;
double grossPay = hoursWorked * payRate;

 حاصل این ضرب، از نوع double خواهد بود، زیرا همان طور که در لیست بالایی مشاهده می کنید، نوع double از اولویت بیشتری برخوردار است. بنابراین برابر قرار دادن حاصل ضرب در متغیر grossPay (که از نوع double است ) صحیح است. اما کدهایی که در زیر نوشته شده اند، کامپایل نخواهند شد، زیرا این امکان وجود ندارد تا یک عدد از نوع double را در یک متغیر از نوع int ذخیره کنیم. 

مثال (مفهوم تبدیل نوع داده ها در جاوا)

int hoursWorked = 37;
double payRate = 6.73;
int grossPay = hoursWorked * payRate;

 نکته: هنگامی که نوع داده های char و short و byte در عبارت هایی استفاده شوند که دارای نوع متفاوتی هستند، می توان آنها را از نوع int درنظر گرفت. اگر شما بر روی هر ترکیبی از مقادیر داده ها از نوع char و short و byte محاسبه انجام دهید، نتیجه به طور پیش فرض از نوع int خواهد بود. بعنوان مثال اگر شما دو مقدار از نوع byte را با یکدیگر جمع کنید، نتیجه از نوع int خواهد بودو  نه از نوع byte.

شما می توانید با استفاده از تعیین نوع(type casting)، جاوا را مجبور کنید تا از یک نوع متحد ساز خاص  استفاده کند. تعیین نوع، مشخص می کند که یک مقدار از یک نوع خاص، با یک نوع داده ی دیگر مورد استفاده قرار گیرد. برای تعیین یک نوع خاص، می توانید عملگر تعیین نوع را در داخل یک پرانتز قرار دهید.پس از عملگر تعیین نوع، یک متغیر یا یک ثابت قرار می گیرد. بعنوان مثال، در کد زیر مثالی از تعیین نوع یا type casting را مشاهده می کنید:

مثال (مفهوم تبدیل نوع داده ها در جاوا)

double bankBalance = 189.66;
float weeklyBudget = (float) (bankBalance / 4);
//نتیجه =47.415 

نکته: به طور دقیق تر، به عملگر تعیین نوع، عملگر یگانی تعیین نوع(unary cast operator) گفته می شود. برخلاف یک عملگر باینری که به دو عملوند احتیاج دارد، یک عملگر یگانی(unary) تنها به یک عملوند احتیاج دارد. پس از عملگر یگانی تعیین نوع، عملوند آن قرار می گیرد. 

 در مثال بالا، متغیر bankBalance بر عدد صحیح 4 تقسیم می شود و نتیجه ابتدا از نوع double است. سپس این مقدار، قبل از اینکه در متغیر weeklyBudget ذخیره شود، به نوع float تبدیل می شود و سپس در متغیر مذکور ذخیره می شود. اما اگر ما هیچ تبدیل نوعی را انجام ندهیم، عبارتی که حاصل را به متغیر weeklyBudget انتساب می دهد، کامپایل نخواهد شد. 

 به طور مشابه، در کدهای زیر، یک متغیر از نوع float را به نوع int تبدیل می کنیم:

مثال (مفهوم تبدیل نوع داده ها در جاوا)

float myMoney = 47.82f;
int dollars = (int) myMoney;
//برابر است با 47 dollars

 در مثال بالا، متغیر myMoney که از نوع float است، قبل از اینکه در متغیر dollars قرار گیرد، به یک عدد صحیح(int) تبدیل می شود. به دلیل اینکه مقدار float قرار است به مقداری از نوع int تبدیل شود، مقادیر اعشاری از بین می روند. عملگر تعیین نوع، به طور دائمی، نوع داده ی یک متغیر را تغییر نمی دهد، بلکه این تغییر صرفاً هنگام انجام عملیات جاری انجام می شود. 

نکته: هنگام تعیین نوع، داده ها از دست می روند( یا به عبارت دیگر کوانتیزه می شوند). بعنوان مثال بزرگترین مقدار نوع داده ی byte برابر است با 127 و بزرگترین مقدار نوع داده ی int برابر است با 2,147,483,647  بنابراین عبارت زیر یک نتیجه ی غیرطبیعی و تحریف شده را نشان می دهد:

مثال (مفهوم تبدیل نوع داده ها در جاوا)

int anOkayInt = 200;
byte aBadByte = (byte)anOkayInt;

 نکته: یک بایت(byte) از هشت تا 0 و 1 تشکیل شده است(از هشت عدد باینری). اولین رقم  باینری یا به عبارت دیگر اولین بیت، قادر است یک 0 یا 1 را در خود نگهداری کند. این بیت تعیین کننده ی مثبت یا منفی بودن آن عدد است. سپس هفت بیت باقی مانده، مقدار واقعی را در خود نگهداری می کنند. هنگامی که مقدار صحیح 200( به باینری:۱۱۰۰۱۰۰۰)  در یک متغیر از نوع byte ذخیره می شود، اولین رقم آن(از سمت چپ)، در هشتمین بیت(از سمت راست) متغیر قرار می گیرد، و این باعث می شود تا جاوا فکر کند که منظور شما مقدار 72- بوده است. ( عدد 72 به باینری: ۱۰۰۱۰۰۰). که این مقدار یک مقدار غلط و اشتباه است. 

 هنگامی که شما می خواهید یک مقدار را به یک نوع متحد ساز با اولویت بیشتر تبدیل کنید، نیازی به تعیین نوع(cast) ندارید. بعنوان مثال هنگامی که شما عبارتی مثل زیر را بنویسید، جاوا به طو اتوماتیک مقدار صحیح 10 را به نوع double تبدیل می کند. بنابراین این عدد قادر خواهد بود تا در متغیر payRate ذخیره شود:

مثال (مفهوم تبدیل نوع داده ها در جاوا)

double payRate = 10;

 اما برای وضوح بیشتر، اگر می خواهید مقدار 10 را به متغیر payRate انتساب دهید، بهتر است آن را به صورت زیر بنویسید:

مثال (مفهوم تبدیل نوع داده ها در جاوا)

double payRate = 10.0;

نتیجه های هر دو کاملا یکسان هستند. 


آزمون: گزینه ی اشتباه را مشخص کنید!

1. هنگامی که شما بر روی دو عملوند با نوع مختلف، عملیات محاسباتی انجام می دهید، شما باید آنها را به یک نوع، مورد محاسبه قرار دهید. 

2. جمع یک مقدار از نوع double و یک مقدار از نوع int و یک مقدار از نوع float، در نهایت از نوع double خواهد بود. 

3.  شما می توانید با استفاده از یک متحد ساز، یک مقدار از یک نوع دیگر را با یک نوع دلخواه ذخیره کنید. 


پاسخ: گزینه ی 1 اشتباه است. 

هنگامی که شما بر روی دو عملوند با نوع مختلف، عملیات محاسباتی انجام می دهید، جاوا آنها را به یک نوع متحد ساز محاسبه می کند.