همانطور که در جلسات پیش گفته شد، JVM یک ماشین مجازی است که محیط اجرایی برای بایت کدهای جاوا را فراهم می کند. از آنجایی که JVM به پلتفرم خود وابستهست، JVMهای مختلفی برا پلتفرم های سخت افزاری و نرم افزاری موجود است.
JVM در واقع
JVM کارهای زیر را می کند:
و به موارد زیر معنا می بخشد:
معماری JVM را به طور خلاصه در تصویر زیر مشاهده می کنید که شامل کلاسلودر، فضای حافظه و موتور اجرا می باشد.
1- کلاسلودر
کلاسلودر زیر مجموعه ای از JVM می باشد که کلاس ها را بارگذاری می کند. هر موقع که یک برنامه جاوا اجرا شود، ابتدا توسط کلاسلودر خوانده می شود. جاوا دارای سه کلاسلودر داخلی می باشد.
در صورتی که بخواهید کلاس لودر دلخواه خود را بنویسید، باید از کلاس ClassLoader ارثبری کنید و کلاس خودتان را ایجاد نمایید.
//Let's see an example to print the classloader name public class ClassLoaderExample { public static void main(String[] args) { // Let's print the classloader name of current class. //Application/System classloader will load this class Class c=ClassLoaderExample.class; System.out.println(c.getClassLoader()); //If we print the classloader name of String, it will print null because it is an //in-built class which is found in rt.jar, so it is loaded by Bootstrap classloader System.out.println(String.class.getClassLoader()); } }
خروجی:
sun.misc.Launcher$AppClassLoader@4e0e2f2a null
2- فضای کلاس یا متد
فضای کلاس یا متد، ساختارهایی همچون منبع ثابت اجرایی، اطلاعات مربوط به متدها و فیلدها و کد مربوط به متدها را نگهداری می کند.
3- هیپ (Heap)
فضایی است که هنگام اجرای برنامه به اشیا تخصیص داده می شود.
4- استک (stack)
استک جاوا فریمها را در خود ذخیره می کند، متغیرهای محلی و نتایج مقطعی را نگه میدارد و در صدا زدن و خروجی دادن متدها هم نقش مهمی ایفا می کند. هر ریسه یک استک خصوصی ماشین مجازی جاوا را دارد که همزمان با خود ریسه ساخته می شود.
با صدا زدن یک متد، یک فریم ساخته می شود و پس از اتمام کار متد، فریم از بین می رود.
5- رجیستر شمارنده برنامه
شمارنده برنامه (PC) شامل آدرس دستورات JVM که در حال اجرا هستند، می باشد.
6- استک متد محلی
شامل تمامی متدهای محلی موجود در برنامه می باشد.
7- موتور اجرا
موتور اجرا شامل موارد زیر می شود:
8- رابط کاربری محلی جاوا
Java Native Interface یا JNI فریم ورکی است که رابط کاربری مورد نیاز برای ارتباط با برنامه های نوشته شده در زبان های دیگر همچون سی، اسمبلی را فراهم می کند. جاوا همچنین برای فرستادن خروجی در کنسول یا ارتباط با کتابخانه های سیستم عامل از JNI استفاده می کند.
متغیر یک ظرفی می باشد که مقداری را در هنگام اجرای برنامه در جاوا نگه داری می کند. مقدار درون متغیر از جنس یک نوع داده می باشد. در واقع میشود گفت که متغیر نامی برای محل حافظه است.
در جاوا سه نوع متغیر وجود دارند: local یا محلی، instance یا نمونه و استاتیک.
به طور کل نیز دو نوع داده داریم: 1- بدوی یا اولیه 2- غیراولیه
متغیر نامی برای فضای تخصیص داده شده در حافظه یا به بیان دیگر نامی برای خانه محل حافظه است. علت نامگذاریش به متغیر، امکان تغییر مقدار متغیر می باشد.
سه نوع متغیر در جاوا وجود دارند:
به متغیری که در بدنه یک متد تعریف می شود متغیر محلی می گویند. امکان استفاده از این متغیر فقط در همان متد میسر می باشد و در واقع متدهای دیگر از وجود این متغیر آگاه نیستند.
متغیر محلی را نمیتوان استاتیک تعریف کرد.
به متغیری که بیرون از بدنه متد اما در کلاس تعریف شده است می گویند. متغیر نمونه هم نمی تواند استاتیک باشد.
علت نام گذاریش به متغیر نمونه این است که مقدارش مختص به یک نمونه ساخته شده از یک کلاس می باشد و بین تمام نمونه ها و اشیاهای ساخته شده از یک کلاس مشترک نیست
متغیری که با کلمه کلیدی Static تعریف شود را متغیر استاتیک می گویند. متغیر استاتیک بین تمام اشیا و نمونه های ساخته شده از یک کلاس مشترک می باشد و به همین دلیل تنها یکبار هنگام لود شدن کلاس به آن حافظه تخصیص داده می شود.
class A{ int data=50;//instance variable static int m=100;//static variable void method(){ int n=90;//local variable } }//end of class
جمع دو عدد:
class Simple{ public static void main(String[] args){ int a=10; int b=10; int c=a+b; System.out.println(c); }}
خروجی:
20
گسترش یا Widening:
class Simple{ public static void main(String[] args){ int a=10; float f=a; System.out.println(a); System.out.println(f); }}
خروجی:
10 10.0
تایپ کستینگ (تبدیل نمونه ها به یکدیگر):
class Simple{ public static void main(String[] args){ float f=10.5f; //int a=f;//Compile time error int a=(int)f; System.out.println(f); System.out.println(a); }}
خروجی:
10.5 10
اورفلو Overflow:
class Simple{ public static void main(String[] args){ //Overflow int a=130; byte b=(byte)a; System.out.println(a); System.out.println(b); }}
خروجی:
130 -126
اضافه کردن بایت ها و تایپ کستینگ
class Simple{ public static void main(String[] args){ byte a=10; byte b=10; //byte c=a+b;//Compile Time Error: because a+b=20 will be int byte c=(byte)(a+b); System.out.println(c); }}
خروجی:
20
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.