برای درک تفاوت بین اتصال اولیه (استاتیک) و دیرهنگام (دینامیک) در جاوا، ابتدا باید بفهمید که binding چیست . پیوند دادن به این معنی است که بین پیوند و کد ارتباط وجود دارد. به عنوان مثال، متغیری که شما به آن ارجاع می دهید به کدی که در آن تعریف شده است محدود می شود. به همین ترتیب، متدی که فراخوانی می شود به مکانی در کدی که در آن تعریف شده است محدود می شود.
دو نوع اتصال متد در زبان جاوا وجود دارد: اتصال اولیه (که استاتیک نیز نامیده می شود) و اتصال دیرهنگام (به ترتیب پویا) . فراخوانی یک متد در جاوا به این معنی است که متد به کد خاصی متصل است، چه در زمان کامپایل یا در زمان اجرا، زمانی که برنامه اجرا می شود و اشیاء ایجاد می شوند. همانطور که از نام آن پیداست، پیوند استاتیک ماهیت ایستاتری دارد زیرا در زمان کامپایل اتفاق می افتد، به این معنی که کد «می داند» پس از کامپایل کد منبع جاوا در فایل های کلاس، کدام روش را فراخوانی کند. و از آنجایی که این به مرحله اولیه چرخه حیات برنامه اشاره دارد، به آن اتصال اولیه نیز می گویند. از طرف دیگر، پس از اجرای برنامه توسط ماشین مجازی جاوا، پیوند پویا در زمان اجرا اتفاق می افتد. در این حالت، کدام روش فراخوانی توسط شی خاص تعیین می شود، بنابراین اطلاعات در زمان کامپایل در دسترس نیست زیرا اشیاء در زمان اجرا ایجاد می شوند. و از آنجایی که این اتفاق در اواخر چرخه عمر برنامه رخ می دهد، در جاوا به آن late binding می گویند.
بنابراین، تفاوت اساسی بین اتصال ایستا و پویا در جاوا این است که اولی در زمان کامپایل، بر اساس نوع متغیر مرجع، زودتر اتفاق میافتد، و دومی دیرتر، در زمان اجرا، با استفاده از اشیاء بتن رخ میدهد.
بیایید به چند تفاوت دیگر نگاه کنیم تا این موضوع را بهتر درک کنیم و همچنین بتوانیم به این سوال بسیار محبوب که در مصاحبه های جاوا پرسیده می شود پاسخ دهیم.
صحافی اولیه و دیررس در جاوا
تفاوت های زیادی بین اتصال استاتیک و پویا در جاوا وجود دارد، اما مهم ترین آنها نحوه استفاده JVM از آنها است. آیا تا به حال به این فکر کردهاید که چگونه JVM تصمیم میگیرد زمانی که بیش از یک متد با نام یکسان در محدوده وجود دارد، کدام متد را فراخوانی کند؟ اگر تا به حال از overloading یا overriding متد استفاده کرده اید، می دانید که در جاوا می توانید چندین متد با نام یکسان داشته باشید. در مورد جاوا، JVM از هر دو اتصال استاتیک و پویا برای انتخاب روش مورد نظر استفاده می کند.
مثالی از اتصال استاتیک و پویا در جاوا
در این برنامه خواهید دید که اتصال متدهای مجازی در زمان کامپایل با استفاده از اتصال ایستا اتفاق نمی افتد، زیرا این روش یک متد از سوپرکلاس را فراخوانی می کند، همانطور که با متدهای استاتیکی که زودتر باند می شوند اتفاق می افتد. اگر متدی از یک زیر کلاس فراخوانی شود، از یک شی خاص برای اتصال تابع در زمان اجرا استفاده می شود، و از این رو از اتصال پویا برای اتصال توابع مجازی استفاده می شود.
publicclassMain{publicstaticvoidmain(String[] args){// Пример статического и динамического связывания в JavaInsurance current =newCarInsurance();// Динамическое связывание на основе an objectint premium = current.premium();// Статическое связывание на основе классаString category = current.category();System.out.println("premium : "+ premium);System.out.println("category : "+ category);}}classInsurance{publicstaticfinalint LOW =100;publicintpremium(){return LOW;}publicstaticStringcategory(){return"Insurance";}}classCarInsuranceextendsInsurance{publicstaticfinalint HIGH =200;publicintpremium(){return HIGH;}publicstaticStringcategory(){return"Car Insurance";}}
Результаты выполнения:
premium :200
category :Insurance
همانطور که می بینید، فراخوانی متد premium()منجر به اجرای یک متد از زیر کلاس می شود، در حالی که فراخوانی متد category()منجر به اجرای یک متد سوپرکلاس می شود. این به این دلیل است که premium()- یک متد مجازی است که با استفاده از اتصال دیرهنگام حل می شود، در حالی که category()- یک متد استاتیک است که با استفاده از اتصال استاتیک زمان کامپایل با نام کلاس حل می شود.
اکنون که اطلاعاتی در مورد نحوه اتصال فراخوانی های متد جاوا و نحوه عملکرد اتصال ایستا و پویا دارید، بیایید تفاوت های کلیدی بین اتصال اولیه و دیررس در جاوا را مرور کنیم:
پیوند استاتیک در زمان کامپایل رخ می دهد، در حالی که پیوند پویا در زمان اجرا رخ می دهد.
از آنجایی که پیوند استاتیک در اوایل چرخه عمر برنامه اتفاق می افتد، به آن اتصال اولیه می گویند. به طور مشابه، اتصال پویا را اتصال دیرهنگام نیز می گویند زیرا در مراحل بعدی اجرای برنامه اتفاق می افتد.
اتصال ایستا در زبان جاوا برای حل روشهای بارگذاری شده استفاده میشود در حالی که اتصال پویا در زبان جاوا برای حل روشهای لغو شده استفاده میشود.
به همین ترتیب، روشهای خصوصی، استاتیک و پایانه با استفاده از اتصال استاتیک حل میشوند، زیرا نمیتوان آنها را نادیده گرفت، در حالی که همه روشهای مجازی با استفاده از اتصال پویا حل میشوند.
در مورد اتصال ایستا، از اشیاء بتن استفاده نمی شود، بلکه از نوع اطلاعات استفاده می شود، یعنی از نوع متغیر مرجع برای کشف روش مورد نظر استفاده می شود. از طرف دیگر، اتصال پویا از یک شی خاص برای یافتن روش مورد نظر در جاوا استفاده می کند.
در اینجا یک تمرین خوب بر اساس مفاهیم اتصال ایستا و پویا در جاوا ارائه شده است. آیا می توانید به این سوال پاسخ دهید: "هنگام اجرای برنامه زیر چه خروجی خواهد داشت؟"
خروجی این برنامه چیست؟ Collection، Setیا HashSet؟ این تمام چیزی است که میخواستیم در مورد تفاوتهای بین اتصال اولیه (ایستا) و دیر (دینامیک) در جاوا به شما بگوییم. این یکی از بهترین سوالات مصاحبه تلفنی جاوا است زیرا فرصت های زیادی برای آزمایش عمق دانش داوطلب فراهم می کند. همیشه به یاد داشته باشید که روشهای خصوصی ، استاتیک و نهایی با استفاده از پیوند استاتیک محدود میشوند ، در حالی که روشهای مجازی با استفاده از پیوند پویا محدود میشوند . به همین ترتیب، بهترین مثال برای اتصال استاتیک، بارگذاری بیش از حد روش است، در حالی که overriding پویا است. منبع
GO TO FULL VERSION