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

ایمیل خود را وارد کنید:

اوراکل (ADF(Application Development Framework یک چارچوب(Framework)  کلی می باشد که برروی استانداردهای Java EE و تکنولوژی های Open Source جهت سادگی و پیاده سازی سریع تر برنامه های Java EE ایجاد شده است که کاملا توسعه پذیر و قابل تنظیم بوسیله افزودن یا اصلاح کتابخانه ها می باشد. ADF وظایف را از طریق ایجاد سرویس […]

CardLayout پنجره ای را در نظر بگیرید که شامل چندین پنل می باشد که در یک زمان فقط یکی از این پنل ها قابل مشاهده می باشد،با استفاده از کلاس java.awt.CardLayout شما می توانید کامپوننتی را ایجاد کنید که فقط یکی از این پنل ها را در یک زمان نمایش دهد، مانند شکل زیر: زمانی […]

اطلاعات سخت افزاری CPU اطلاعات CPU شامل جزئیاتی  مثل معماری ، نام سازنده ، مدل ، تعداد هسته ها ، سرعت هرکدام از هسته ها و غیره است. برای دسترسی به چنین جزئیاتی درباره سخت افزار CPU در لینوکس، تعداد بسیار اندکی کامند برای این منظور وجود دارد که ما در اینجا بطور مختصر تعدادی […]

Casting در جاوا

همه ی کلاس های جاوا از کلاس Object که در بالای سلسله مراتب قرار دارد بطور مستقیم یا غیرمستقیم ارث می برند. زمانی که شما یک متغییر  non-primitiveتعریف می کنید شما مجاز به استفاده از نوع دقیق داده از این متغییر یا یکی از انواع دقیق جدش خواهید بود.بعنوان مثال اگر کلاس NJTax کلاس Tax را extend کند هریک از خط های زیر درست است :

NJTax myTax1 = new NJTax();
Tax myTax2 = new NJTax(); // upcasting
Object myTax3 = new NJTax(); // upcasting

جاوا به حد کافی هوشمند است که بطور اتوماتیک  یک نمونه از کلاس را برای جدش cast کند.هنگامی که یک متغییر یک نوع عمومی تر از نمونه یک شی را دارا می باشد به آن  upcasting می گویند. فرض کنید که کلاس شی دارای ۱۰ متد و متغییرهای تعریف شده می باشد، کلاس Tax(یک زیرکلاس ضمنی از کلاس Object) 5 متد و متغییر بیشتر اضافه می کند(۱۵ تا می سازد) و NJTax 2تا دیگر اضافه می کند(کلا ۱۷نا) متغییر myTax1 به همه ی ۱۷تا متد و متغییر دسترسی خواهد داشت، myTax2 فقط ۱۵تا را خواهد دید و myTax3 فقط ۱۰تا. چرا همیشه از انواع دقیق تعریف متغییر استفاده نکند؟

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

از آنجا که جاوا بطور خودکار می تواند اشیا را upcast کند، شما می توانید کلاسی بنام  person با دو زیر کلاس Employee و Contractor ایجاد کنیدو آنگاه رکوردها را از یک دیتابیس بخوانید. برمبنای نوع استخدام شما می توانید یک نمونه شی مناسب ایجاد کنید و داخل آرایه ای از نوع person بگذارید:

Person workers[] = new Person [100];
workers[0] = new Employee("Majid", "Mohammadi");
workers[1] = new Employee("Amir", "Rezaei");
workers[2] = new Contractor("Saeed", "Bahrami");
//...

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

در نقطه ای دیگر شما به پردازش داده از آرایه workers احتیاج دارید. در یک حلقه شما می توانید نوع داده از عنصر جاری از آرایه را بوسیله عملگر instanceof تست کنید و آنگاه شی را برای Employee و Contractor  downcast کنید(نمی تواند بطور اتوماتیک انجام شود) و سپس آنرا پردازش کنید.

for (int i; i<20; i++){
Employee currentEmployee;
Contractor currentContractor;
if (workers[i] instanceof Employee){
currentEmployee = (Employee) workers[i];

} else if (workers[i] instanceof Contractor){
currentContractor = (Contractor) workers[i];

}
}

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

اگر یک کلاسی یک واسط را اجرا کند، شما می توانید نمونه آنرا برای این واسط  cast کنید. یک کلاسی بنام Employee تعریف کنید که واسط های Payble، Insurable و Pensionable را پیاده سازی کند:

class Employee implements Payable, Insurable, Pensionable {
// implementation of all interfaces goes here
}

اگر شما به رفتار Insurable در کدتان علاقه مندید، احتیاجی نیست که Object را به نوع Employee cast کنید فقط آنرا به نوع Insurable همانطور که در قطعه کد پایین نشان داده شده است cast کنید.متغییر currentEmployee فقط دسترسی به متدهای آن که در واسط Insurable تعریف شده بودند را نمایش خواهد داد.

Insurable currentEmployee;
if (workers[i] instanceof Insurable){
currentEmployee = (Insurable) workers[i];
// do some insurance-specific processing here
}

دیدگاه خود را به ما بگویید.