کار با اشیاء در جاوا – جلسه 5
1397/02/20 10:06 , بهزاد ناظمی

کار با اشیاء در جاوا – جلسه 5

اشیای قابل تبدیل و انواع اولیه

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

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

دو متغیر باید از یک نوع باشند یا متغیری که دریافت کننده آن مقدار است، باید به اندازه کافی بزرگ باشد تا بتواند مقدار را نگه دارد.

نکته :

تنها یک قسمت وجود دارد که کامپایلر جاوا در آن انعطاف پذیر است: شیء String. پردازش خط در روش println ()، انتساب جملات، و آرگومان متدها توسط اپراتور اتصال کننده + ساده شده است.

اگر هر متغیری در یک گروه از متغیرهای یکپارچه، یک رشته باشد، جاوا همه چیز را به عنوان یک رشته پردازش می کند.

float gpa = 2.25F;
System.out.println("Honest, mom, my GPA is a " +
(gpa + 1.5));

گاهی اوقات شما در کلاس جاوا خود دارای مقداری هستین که برای آنچه که نیاز دارید مناسب نیست. ممکن است کلاس اشتباه یا نوع داده اشتباه باشد، مانند یک float زمانی که شما نیاز به یک int دارید. در این شرایط، می توانید از یک فرایند به نام casting برای تبدیل یک مقدار از یک نوع به نوع دیگری استفاده کنید.

اگرچه جایگذاری بصورت منطقی ساده است، ولی در واقعیت فرآیندی از جاوا  که هر دو نوع اولیه را دارد، پیچیده است (مانند int، float و boolean) و انواع شیء مانند (String، Point، و غیره). این بخش در مورد سه حالت قالب ها و مکالمات بحث می کند:

  • تبدیل میان انواع ابتدایی، مانند int به float یا float به double
  • تبدیل از یک شیء از یک کلاس به یک شیء از کلاس دیگر، از جمله از Object به String
  • تبدیل انواع اولیه به اشیاء و سپس استخراج مقادیر اولیه از آن اشیاء.

گفتگو در مورد تبدیل و جایگذاری زمانی ساده تر است که از نظر منابع و مقصد مورد بحث قرار گیرد. منبع متغیری است که به نوع دیگری تبدیل شده است. نتیجه مقصد نهایی است.

تبدیل انواع اولیه

تبدیل میان انواع اولیه شما را قادر می سازد تا مقادیر یک نوع را به نوع دیگری تبدیل کند.

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

در بسیاری از جایگذاری ها بین انواع اولیه، مقصد نهایی می تواند مقادیر بالاتری از منبع داشته باشد، بنابراین مقادیر به راحتی تبدیل می شوند. یک مثال میتواند بایت را به یک int تبدیل کند.

از آنجا که یک بایت مقادیر 128 تا 127 را نگه می دارد و int  حدود 210000، فضای بیش از نیازی برای بازیابی یک بایت به یک int وجود دارد. اغلب شما می توانید به طور خودکار از یک byte یا char به عنوان int استفاده کنید؛ یک int به عنوان long؛ int به عنوان float؛ یا هر چیزی به عنوان double.

در اغلب موارد، به دلیل اینکه نوع بزرگتر دقت بیشتری نسبت به کوچکتر را فراهم می کند، هیچ گونه اطلاعاتی از دست نخواهد رفت. استثناء عدد صحیح رأی دادن به مقادیر شناور است. در اینجا استثناء تبدیل عدد صحیح به مقادیر شناور است. تبدیل long به یک float یا long به double می تواند سبب کاهش دقت گردد.

شما باید از یک مبدل واضح برای تبدیل یک مقدار از یک نوع بزرگ به نوع کوچکتر استفاده کنید. مبدل های صریح فرم زیر را می دهند:

(typename) value

در اینجا typename نام نوع داده اولیه ایی هست که شما در حال تبدیل آن هستید، مانند short، int و یا float.

 value یک اصطلاح است که نتیجه آن در مقدار نوع منبع مشخص می شود.

به عنوان مثال، در مطلب زیر، مقدار x با مقدار y تقسیم می شود و نتیجه به int تبدیل می شود:

int result = (int)(x / y);

توجه داشته باشید که از آنجا که اولویت جایگذاری بالاتر از حساب ریاضی است، باید از پرانتز در اینجا استفاده کنید. در غیر این صورت، ابتدا مقدار x به یک int تبدیل می شود و سپس توسط y تقسیم می شود، که منجر به تولید نتیجه دیگری می شود.

تبدیل اشیاء

اشیاء کلاس ها نیز می توانند به اشیاء کلاس های دیگر منتقل شوند، زمانی که کلاس های منبع و مقصد بواسطه وراثت به یکدیگر مرتبط هستند و یک کلاس، زیر کلاسی از دیگری است.

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

به عنوان مثال، روشی را  که دو نوع آرگومان، يکی از نوع Object و يکی از نوع Component را در بسته java.awt (که داراي کلاس براي يک رابط گرافيکي است) را در نظر بگيرد.

شما می توانید نمونه ای از هر کلاس را برای شناسه Object  منتقل کنید زیرا تمام کلاس های Java زیرکلاس های Object هستند. برای آرگومان کامپوننت، شما می توانید در زیر کلاس های آن مانند دکمه، حمل کننده و برچسب (همه در java.awt) منتقل کنید.

این قضییه در تمام نقاط یک برنامه مصداق دارد، نه تنها در داخل فراخوانی متدها.

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

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

این مثال را در نظر بگیرید: اگر یک فرآیندی داشته باشید که متدهای را در اشیاء کلاس Integer فراخوانی می کند، از شیء سوپرکلاس number که در خیلی از متدهای integer قرار ندارد، استفاده می کند. اگر شما سعی کنید به روش هایی که شیء مقصد ندارند فراخوانی انجام دهید خطایی رخ خواهد داد.

برای استفاده از اشیاء سوپر کلاسی در جایی که اشیاء زیر کلاس قرار می گیرند، باید آنها را به صراحت جایگذاری ببرید. شما هیچ اطلاعاتی در جایگذاری از دست نخواهید داد، اما تمام متدها و متغیرهایی را که زیر کلاس تعریف خواهد کرد را به دست می آورید.

برای تبدیل یک شیء به کلاس دیگر، شما از عمل مشابهی که برای انواع اولیه استفاده شده بود ، استفاده خواهید کرد، که به این صورت ارائه می شود:

(classname) object

در این مثال،  classname نام کلاس مقصد است و object یک اشاره به شیء منبع است. جایگذاری ارجاعی  به شیء  قدیم  نوع classname  ایجاد می کند؛ شیء قدیمی همچنان همانند گذشته موجود خواهد بود.

مثال زیر، نمونه ای از تبدیل کلاس VicePresident  را به یک نمونه از Employee نشان می دهد. VicePresident  یک زیرکلاس Employee با اطلاعات بیشتر است:

Employee emp = new Employee();
VicePresident veep = new VicePresident();
emp = veep; // no cast needed for upward use
veep = (VicePresident) emp; // must cast explicitly

هنگامی که شما شروع به کار با رابط کاربری گرافیکی، "کتابخانه کلاس جاوا"، در 2 هفته می کنید ، خواهید دید که جایگذاری یک شیء زمانی که از عملیات گرافیکی Java2D استفاده کنید، ضروری است. شما باید قبل از نشان دادن بر روی صفحه ، شیء Object Graphics را به یک شیء Object Graphics2D تبدیل کنید. مثال زیر از یک شیء گرافیکی به نام screen برای ایجاد یک شیء جدید Graphics2D به نام screen2D استفاده می کند:

Graphics2D screen2D = (Graphics2D) screen;

Graphics2D یک زیر کلاس از Graphics است و هر دو به بسته java.awt تعلق دارند. شما این موضوع را به طور کامل در جلسه 13 "ایجاد Java2D Graphics" خواهید آموخت.

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

تبدیل انواع اولیه به اشیاء و بلعکس

چیزی که نمیتوانید شما توانایی انجام آن را ندارید تبدیل یک شیء به داده های اولیه و بلعکس است.

 انواع اولیه و اشیاء در جاوا متفاوت هستند، و شما نمی توانید به طور خودکار بین این دو تبادل انجام دهید.

به عنوان یک جایگزین، بسته java.lang شامل کلاس هایی است که مربوط به هر نوع داده اولیه هستند: Float، Boolean، Byte و غیره.

اکثر این کلاس ها دارای نام های مشابه نوع داده ها هستند، به جز نام کلاس هایی که  با حرف بزرگ شروع می شوند (Short  به جای short ، Double  به جای double و غیره). همچنین دو کلاس دارای نام هایی  از نوع داده های متفاوتی  هستند: Character برای متغیرهای char استفاده می شود و Integer برای متغیرهای int استفاده می شود.

با استفاده از کلاس های مربوط به هر نوع اولیه، شما می توانید یک شیء که دارای همان مقدار است را ایجاد کنید. مطلب زیر یک مثال از کلاس Integer با مقدار عدد صحیح 7801 ایجاد می کند:

Integer dataCount = new Integer(7801);

پس از اینکه یک شیء را به این شیوه ایجاد کردید، می توانید آن را همانند شیء دیگری استفاده کنید (هر چند که نمی توانید ارزش آن را تغییر دهید) . هنگامی که می خواهید از آن مقدار دوباره به عنوان یک مقدار اولیه استفاده کنید، روش هایی  نیز وجود دارد. برای مثال، اگر شما می خواستید یک مقدار int را از یک شیء dataCount بدست آورید، عبارت زیر نشان می دهنده چگونگی آن است:

int newCount = dataCount.intValue(); // returns 7801

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

هنگامی که شما به یک int بعنوان نتیجه ای نیاز دارید، می توان با استفاده از  متد کلاس class parseInt () از کلاس integer این کار را انجام داد. رشته برای تبدیل، تنها آرگومان فرستاده شده به روش است، همانطور که در مثال زیر آمده  است:

tring pennsylvania = "65000";
int penn = Integer.parseInt(pennsylvania);

کلاس های زیر می توانند برای کار با اشیاء به جای انواع داده های اولیه استفاده شوند: Boolean، Byte، Character، Double، Float، Integer، Long، Short، Void. این کلاسها معمولا "پوشش دهنده شیء" نامیده میشوند، زیرا آنها ارائه نمایشی را ارائه میدهند که شامل یک مقدار اولیه است.

کار با انواع ابتدایی و اشیائی که از مقادیر یکسانی  هستند شامل آسان شدن فرآیندهای autoboxing  و unboxing در یک فرآیند تبدیل اتوماتیک خواهند شد. Autoboxing به طور خودکار یک نوع اولیه را به یک شیء تبدیل می کند. Unboxing در جهت عکس آن عمل می کند.

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

در اینجا مثالی از autoboxing   و unboxing آمده است :

Float f1 = 12.5F;
Float f2 = 27.2F;
System.out.println("Lower number: " + Math.min(f1, f2));

روش Math.min () دو مقدار float را به عنوان آرگومان می گیرد، اما در مثال قبلی به روش دوم، دو شیء Float را به عنوان آرگومان می فرستد.

کامپایلر خطایی را برای این مغایرت، گزارش نمی دهد. در عوض، اشیاء Float به صورت خودکار به مقادیر float قبل از ارسال به روش min () ارسال می شوند.

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

 

           برگرفته از : informit.com

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامع SQL Server (جلسه ۱۲)
آموزش جامع SQL Server (جلسه ۱۲)

دستور UPDATE در SQL Server برای تغییر داده‌های موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

آموزش جامع SQL Server (جلسه ۱۵)
آموزش جامع SQL Server (جلسه ۱۵)

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفاده‌ای ندارد را حذف کنید. برای ...

آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)
آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...

آخرین دیدگاه ها

دیدگاه خود را درباره این پست بنویسید

فرم ارسال نظرات