آموزش اینترفیس (Interface) در جاوا ، ماشین مجازی در جاوا و Garbage Collection در جاوا ، در قسمت پنجم آموزش برنامه نویسی اندروید مبحث مربوط به برنامه نویسی جاوا یا آموزش زبان جاوا برای اندروید را به اتمام میرسانیم و در ادامه بیشتر با مباحث برنامه نویسی اندروید آشنا خواهیم شد.در این قسمت Interface در جاوا را اموزش خواهیم داد ، با ما همراه باشید.
توجه : برای مشاهده تصاویر در سایز اصلی بر روی آنها کلیک کنید.
پیش از ادامه آموزش پیرامون ماهیت Thread ها نیاز به آشنایی با Interface ها در زبان برنامه نویسی جاوا داریم. واژه انگلیسی Interface به معنی “رابط” و “واسطه” می باشد. برای روشن شدن این مطلب مثالی ذکر می کنیم: فرض کنیم که عضو یک تیم برنامه نویسی هستیم که روی یک پروژه عظیم کار می کنیم. در واقع هر یک از اعضای این تیم مسئول نوشتن بخشی از برنامه است بدون آنکه به کار دیگر اعضاء کاری داشته باشد اما این در حالی است که یک نقشه اصلی ترسیم شده و در آن نقش کلیه اعضاء مشخص شده اند که هر کسی باید بر اساس آن نقشه کار خود را تکمیل کند. در این نقشه آمده است که برنامه نویس الف می بایست کدهای سمت سرور را بنویسد، برنامه نویس ب می بایست کدهای سمت کاربر را بنویسد و برنامه نویس پ بایستی UI نرم افزار را طراحی کند و …
از سوی دیگر این نقشه حاوی اطلاعاتی است مبنی بر اینکه هر برنامه نویس طبق چه استانداردی بایست به کدنویسی بپردازد. به عبارت دیگر برنامه نویسان نمی توانند طبق نظر شخصی به هرسبکی که تمایل دارند کدنویسی کنند. در واقع Interface در جاوا همانند آن نقشه می باشند بطوریکه نه تنها وظایف بخش های مختلف یک برنامه را مشخص می کنند بلکه خصوصیات آن را نیز مشخص می کنند.
۱- یک Interface در جاوا به هر تعداد که بخواهد می توان متد داشته باشد.
۲- نام فایلی که یک Interface در آن قرار دارد می بایست با نام مد نظر برای Interface یکی باشد و این در حالی است که پسوند فایل همانند کلاس ها java است.
مثلا MyInterface.java در زبان برنامه نویس جاوا Interface ها همانند کلاس ها می باشند اما این در حالی است که در موارد زیر با کلاس ها متفاوت می باشند:
پس از آشنایی با مفاهیم Thread و Interface در جاوا به طور کلی می توان گفت که Thread را به دو روش مختلف ساخت
برای درک بیشتر به مثال زیر دقت فرمایید:
public class ThreadA extends Thread
{
@Override
public void run() {
System.out.println("Thread A");
for (int i = 1; i <= 5; i++) {
System.out.println("From thread A loop no= " + i);
}
}
}
همانگونه که مشاهده میکنید در عبارات فوق کلاسی با عنوان مشخص ایجاد شده که از کلاس Thread جاوا ارث بری میکند و یک متد درون خود دارد که باید به این نکته توجه کرد که باید متد را override کرد. و در ادامه برای اجرای این کلاس در main برنامه باید از متدی تحت عنوان start به صورت زیر استفاده کرد.
همچنین بخوانید: شی گرایی در جاوا
public class ActionClass
{
public static void main(String args[]) {
ThreadA a = new ThreadA();
a.start();
}
}
به طور کلی در زبان جاوا به منظور مواجهه با Error ها از چیزی تحت عنوان Exception استفاده می کنیم. معادل فارسی واژه Exception برابر است با “استثناء” و در زبان جاوا به “رویدادی گفته می شود که در پروسه اجرای یک برنامه یا اپلیکیشن بوجود می آید و از اجرای طبیعی برنامه جلوگیری به عمل می آورد”.
فرض کنیم متدی داریم که این وظیفه را دارا است تا کاری انجام دهد. حال در حین اجرای دستورات داخل این متد یک Error روی می دهد. در شرایطی این چنین، کاری که این متد انجام می دهد این است که شیئی تحت عنوان Exception Object می سازد که حاوی اطلاعاتی پیرامون نوع Error و همچنین زمانیکه این Error در برنامه یا اپلیکیشن رخ داده است می باشد و سپس این شیئ را تحویل سیستم می دهد. از این مرحله به بعد سیستم سعی می کند تا راه کاری برای رفع این Error بیابد. اگر سیستم بتواند دستور یا به طور کلی کدی را بیابد که بتواند این Error را رفع کند، آن دستور یا کد که اصطلاحاً Exception Handler نام دارد به رفع مشکل برنامه ما خواهد پرداخت و در غیر این صورت برنامه Crash خواهد کرد.
به طور کلی در زبان برنامه نویسی جاوا وقتی این احتمال وجود داشته باشد که ممکن است با یک Exception مواجه شویم، بایستی کد خود را داخل دستوری تحت عنوان try بنویسیم که در این صورت اگر Error هم داخل برنامه یا اپلیکیشن ما وجود داشته باشد برنامه به هیچ وجه Crash نخواهد کرد.
برای درک بیشتر به شبه کد فوق دقت فرمایید
public class ExceptionsInJava {
public static void main(String[] args) {
try{
//کدی که میخواهیم اجرا شود
}catch(){
//کدی که در صورت بروز مشکل میخواهیم اجرا شود
}finally{
//کدی که در پایان اجرای مراحل فوق میخواهیم اجرا شود
}
}
}
به طور کلی Exception ها را می توان به دو گروه اصلی Checked و Unchecked دسته بندی کرد. در واقع منظور از Checked Exception ها Exception هایی هستند که در حین Compile-time رخ می دهند که از آن جمله می توان به IOException و SQLException اشاره کرد. در واقع این دست از Error ها مشکلاتی هستند که به Syntaxبرنامه مرتبط هستند. مثلاً اگر به جای نوشتن int عبارت INT را بنویسیم، از آنجا که یک مشکل Syntax یی داریم بایستی انتظار مشکلی مرتبط با Compile time داشته باشیم. به طور کلی این دسته از Exception ها “حتماً” می بایست اصطلاحاً Handle شده یا مد نظر قرار داده شوند. منظور از Unchecked Exception ها نوعی از Exception ها است که در حین Runtime رخ می دهند که از آن جمله می توان به ArithmeticException و NullPointerException اشاره نمود.
در واقع در این دست از مشکلات برنامه بدون هیچ مشکلی Compile می شود اما این در حالی است که در حین اجرای برنامه کاربر نتایج غیر قابل انتظاری مشاهده خواهد کرد و حتی ممکن است برنامه Crash هم بکند.
در حقیقت منظور از Compile-time این است که زمانیکه ما یک برنامه در زبان برنامه نویسی جاوا می نویسیم، کدهای ما می بایست به زبان ماشین تبدیل شوند و زمانیکه کدها به زبان ماشین تبدیل می شوند Compile-time نامیده می شود. حال پس از آنکه کدها به زمان ماشین تبدیل شدند و اصطلاحا Compile شد کاربر میتواند برنامه را اجرا کند و به زمانبک کاربر برنامه را اجرا میکند Runtime گفته میشود.
در واقع از بدو ایجاد زبان برنامه نویسی جاوا شعار طراحان این زبان محبوب این بوده است که Write One, Run Anywhere! به این معنی که “یک بار برنامه جاوای خود را بنویسید سپس روی هر پلتفرمی که خواستید آن را اجرا کنید!” که چنین قابلیتی جز با به کاری گیری مفهومی تحت عنوان “ماشین مجازی جاوا” امکان پذیر نخواهد بود.
به طور کلی ماشین مجازی جاوا را می توان در قالب تصویر زیر نشان داد:
همانطور که در تصویر بالا مشخص است برنامه جاوایی که ما می نویسیم یا همان Source Code برنامه ابتدا توسط جاوا Compile می شود. منظور از اصطلاحCompile تبدیل کدهای جاوا به زبان قابل فهم برای سیستم است که همان صفر و یک می باشند. در واقع ما یک بار بیشتر برنامه خود را Compile نخواهیم کرد و این برنامه Compiled شده برای هر یک از پلتفورم های موجود از قبیل ویندوز، مکینتاش، لینوکس و … یکسان خواهد بود. اکنون از این پس این وظیفه ماشین های مجازی است که برنامه Compiled شده را به شکلی که برای پلتفورم مد نظر قابل فهم است تبدیل نماید. به عبارت دیگر ماشین های مجازی تمام تلاش خود را به کار خواهند بست تا از روی کد یکسانی نتایج نسبتاً یکسانی را در پلتفورم های مختلف ایجاد کنند.
منظور از واژه Garbage در زبان انگلیسی “زباله” است و واژه Collection نیز به معنی “جمع آوری” می باشد. زمانیکه در زبان برنامه نویسی جاوا از این اصطلاح استفاده می کنیم منظور این است که ما به عنوان یک برنامه نویس جاوا نیازی نیست تا خود را درگیر مسائل مربوط به Memory یا “حافظه” کنیم چرا که این وظیفه ای است که بر عهده خود ماشین مجازی جاوا گذاشته شده است. برای روشن شدن نحوه عملکرد Garbage Collection مثالی می زنیم: فرض کنیم زمانیکه برنامه خود را اجرا می کنیم جایی در برنامه دستور می دهیم که یک Object ساخته شود حال این Object یا شیئ جدید نیازمند مقداری حافظه است و این در حالی است که سیستم ما با کمبود حافظه رو به رو است.
در حقیقت Garbage Collection در پشت پرده فعال است و به محض اینکه بفهمد ما قصد داریم یک شیئ جدید ایجاد کنیم اما حافظه ای برای این شیئ جدید موجود نیست به صورت خودکار بخش های مختلف برنامه را مورد بررسی قرار خواهد داد تا ببیند که آیا شیئی یا چیزی در برنامه وجود دارد که قبلاً ایجاد شده است ولیکن دیگر مورد استفاده قرار نمی گیرد و به محض مواجهه با چنین موقعیتی حافظه اختصاص داده شده به آن شیئ دیگر را گرفته و به شیئ جدیدی که قصد داریم ایجاد کنیم اختصاص می دهد. به طور کلی مفهوم Garbage Collection را می توان یکی از قابلیت بسیار مهم دیگر ماشین مجازی جاوا تلقی نمود.