اینترنت پنجره ها اندروید
بسط دادن

چه تغییرات دسترسی در جاوا وجود دارد. دسترسی به اصلاح کننده ها

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

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

اصلاح کننده های دسترسی را می توان برای هر دو کلاس و اعضای آنها - زمینه ها و روش ها - اعمال کرد. در مجموع ، چهار اصلاح کننده دسترسی وجود دارد و در اینجا ما شرح مختصری از آنها را ارائه می دهیم ، سپس هر یک را با جزئیات در نظر می گیریم.

  • عمومی- هر جزء به عنوان اعلام شده عمومی، از هر کد قابل دسترسی است
  • حفاظت شده- امکان دسترسی به جزء درون بسته و کلاسهای بعدی آن را فراهم می کند
  • خصوصی- اجازه دسترسی به اجزای داخل کلاس را می دهد
  • پیش فرض(بدون کلید واژه) - اجازه دسترسی به اجزای داخل بسته را می دهد

کلاسهای موروثی کلاسهایی هستند که از یک کلاس به ارث رسیده اند. ما هنوز وراثت را مطالعه نکرده ایم.

دسترسی به کلاسها

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

دسترسی به اعضای کلاس

اعضای کلاس همیشه در داخل بدنه کلاس در دسترس هستند. پیش فرضاعضای کلاس در بسته ای که کلاس در آن تعریف شده است نیز موجود هستند.

اصلاح کننده عمومی

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

چگونه عمومیکلاس ها ، زمینه ها ، متدها و سازندگان را می توان اعلام کرد.

اصلاح کننده محافظت شده

ما در مبحث وراثت کلاس به این اصلاح کننده نگاه دقیق تری خواهیم داشت. اگر وراثت استفاده نمی شود ، این اصلاح کننده درست مانند اصلاح کننده پیش فرض کار می کند.

تنها چیزی که اکنون به طور مختصر می توان گفت این است که اجزا به عنوان اعلام شده هستند حفاظت شدهدسترسی خواهند داشت هر کلاس کودک از هر بستهیا هر کلاس از همان بسته

چگونه حفاظت شدهزمینه ها ، متدها ، سازنده ها ، کلاس های تو در تو و رابط های تو در تو را می توان اعلام کرد.

حفاظت شده .

اصلاح کننده خصوصی

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

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

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

اساساً ، اصلاح کننده های دسترسی یک موضوع ساده است ، اما بعداً به آنها برمی گردیم. در حالی که فقط یک آشنایی بود. و حالا کمی تمرین ...

من کلاس های Mod02.java ، DefMod.java ، ProMod.java و PrvMod.java را که متعلق به بسته pro.java.pkg002 هستند ، و همچنین کلاس PubMod.java ، که متعلق به بسته pro.java.pkg003 است ، ایجاد کردم. در مرحله بعد ، من فقط تصاویری از این کلاس ها و نتیجه برنامه را ارائه می دهم:

ما در مورد اصلاح کننده ها صحبت خواهیم کرد: اصلاح کننده ها ، دامنه ها ، اصلاح کننده ها برای کلاس ها ، زمینه ها ، روش ها چیست. فکر می کنم خسته کننده نخواهد بود.

اصلاح کننده ها در جاواکلمات کلیدی هستند که به کلاس ، زمینه کلاس یا متد ویژگی های خاصی می دهند.

برای نشان دادن نمایان بودن طبقه ای از روش ها و زمینه های آن ، 4 اصلاح کننده دسترسی وجود دارد:

  • خصوصیاعضای کلاس فقط در داخل کلاس قابل دسترسی هستند.
  • بسته خصوصی یا پیش فرض (پیش فرض)اعضای کلاس در داخل بسته قابل مشاهده هستند.
  • حفاظت شدهاعضای کلاس در داخل بسته و در کلاسهای مشتق شده موجود هستند.
  • عمومیاعضای کلاس برای همه در دسترس هستند.

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

مسئله این است که ما هیچ گونه تغییر دهنده دسترسی به فیلدها و روش های خود را ثبت نکرده ایم و آنها دارای ویژگی پیش فرض هستند (اعضای کلاس در داخل بسته قابل مشاهده هستند). برای رفع خطای کامپایل کد ما و در نهایت اجرای آن ، باید سازنده و متدهای خود را عمومی کنیم. سپس می توان آنها را از بسته های دیگر فراخوانی کرد.

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

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

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

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

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

یک اصلاح کننده ایستا در مقابل یک متد یا فیلد نشان می دهد که آنها به نمونه ای از این کلاس تعلق ندارند. معنی این برای ما چیست؟ وقتی فیلد یا متد کلاس را استاتیک توصیف کردیم ، می توان آن را بدون استفاده از نمونه ای از کلاس فراخوانی کرد. یعنی به جای این ساختار: Cat cat = new Cat ()؛ cat.method () ، فقط می توانید Cat.method () را بنویسید. به شرطی که روش ثابت باشد. متغیرهای استاتیک برای همه اشیاء کلاس یکسان هستند. یک پیوند دارند.

    تعدیل کنندگان کلاس عمومی (

    static int otherStaticField = 5؛

    public static void myStaticMethod () (

    someField = "زمینه من"؛

    // nonStaticField = ""؛ خطای کامپایل

    // از فیلدهای غیر استاتیک نمی توان استفاده کرد

    // در روشهای ایستا

    public void myNonStaticMethod () (

    otherStaticField = 4 ؛ // می توان از فیلدهای ایستا استفاده کرد

    // در روشهای غیر استاتیک

    // متد اصلی همچنین دارای اصلاح کننده استاتیک است

    جدید Modificators () .myNonStaticMethod ()؛

    Modificators.myStaticMethod () ؛ // متدها و فیلدهای استاتیک را فراخوانی کنید

    // از طریق classname.method

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

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

اصلاح کننده بعدی که ما بررسی خواهیم کرد ، خواهد بود نهایی

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

ما در مورد اصلاح کننده نهایی روشها و کلاسها در مقاله OOP صحبت خواهیم کرد.

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

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

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

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

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

اصلاح کننده strictfp- عملکرد عملیات بر روی تعداد نوع شناور و دوگانه (نقطه شناور) مطابق استاندارد IEEE 754 را ارائه می دهد. یا به عبارت ساده تر ، تضمین می کند که در یک روش نتایج محاسبات در همه سیستم عامل ها یکسان باشد.

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

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

ما در مقاله OOP در مورد اصلاح کننده انتزاعی بیشتر صحبت خواهیم کرد.

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

که در هنگام مقداردهی اولیه برای تغییر مقادیر اضافه می کنید. زبان جاوا دارای طیف وسیعی از اصلاح کننده ها است که اصلی ترین آنها عبارتند از:

  • اصلاح کننده های دسترسی ؛
  • کلاس ، روش ، متغیر و اصلاح کننده جریان برای دسترسی استفاده نمی شود.

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

کلاس عمومی className (// ...) private boolean myFlag؛ دو هفته پایانی ثابت = 9.5 ؛ int static final int BOXWIDTH = 42 ؛ public static void main (استدلال های رشته) (// بدنه روش)

دسترسی به اصلاح کننده ها

جاوا تعدادی اصلاح کننده دسترسی برای تنظیم سطوح دسترسی برای کلاس ها ، متغیرها ، متدها و سازنده ها ارائه می دهد. چهار نقطه دسترسی وجود دارد:

  • قابل مشاهده در بسته (به طور پیش فرض و بدون نیاز به اصلاح کننده).
  • قابل مشاهده فقط برای کلاس (خصوصی).
  • قابل مشاهده برای همه (عمومی).
  • قابل مشاهده برای بسته و همه زیر کلاسها (محافظت شده).

اصلاح کننده پیش فرض دسترسی بدون کلید واژه است

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

یک متغیر یا متد بدون تغییر کنترل دسترسی برای هر کلاس دیگری در همان بسته در دسترس است. فیلدهای یک رابط بصورت ضمنی عمومی ، استاتیک ، نهایی و روشهای موجود در یک رابط بصورت پیش فرض عمومی هستند.

مثال

متغیرها و روشها را می توان در جاوا بدون هیچ گونه تغییری اعلام کرد ، همانطور که در مثال زیر نشان داده شده است:

نسخه رشته = "1.5.1"؛ boolean processOrder () (true true؛)

اصلاح کننده دسترسی خصوصی

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

اصلاح کننده دسترسی خصوصی محدود کننده ترین سطح دسترسی است. کلاس و رابط ها نمی توانند خصوصی باشند.

اگر متدهای عمومی دریافت کننده در کلاس وجود داشته باشد ، می توان به متغیرهایی که بصورت خصوصی اعلام شده اند دسترسی پیدا کرد (برای مثال و توضیحات زیر را ببینید).

استفاده از اصلاح کننده خصوصی در جاوا راه اصلی پنهان کردن داده ها است.

مثال

کلاس زیر از کنترل دسترسی خصوصی استفاده می کند:

Public class Logger (قالب رشته خصوصی ؛ عمومی رشته عمومی getFormat () (این را بازگردانید. فرمت ؛) public void setFormat (قالب رشته) (this.format = format؛))

در اینجا متغیر است قالب بندیکلاس متمرکز سازخصوصی است ، بنابراین راهی برای سایر کلاسها وجود ندارد که مستقیماً مقدار آن را دریافت کرده و تعیین کنند.

بنابراین ، برای اینکه این متغیر در دسترس همه چیز باشد ، ما دو روش عمومی را تعریف کرده ایم: getFormat ()که مقدار را برمی گرداند قالب بندی، و setFormat (رشته)که مقدار آن را تعیین می کند

اصلاح کننده دسترسی عمومی

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

با این حال ، اگر سعی کنیم در بسته دیگری به کلاس عمومی دسترسی پیدا کنیم ، کلاس عمومی باید وارد شود.

به دلیل وراثت کلاس ، در جاوا همه متدها و متغیرهای عمومی یک کلاس توسط زیر کلاس های آن به ارث می رسد.

مثال

عملکرد زیر از کنترل دسترسی عمومی استفاده می کند:

public static void main (استدلال های رشته ای) (// ...)

روش اصلی ()باید عمومی باشد در غیر این صورت ، توسط مترجم java نمی توان کلاس را اجرا کرد.

اصلاح کننده دسترسی محافظت شده

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

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

دسترسی محافظت شده به یک زیر کلاس توانایی استفاده از متد یا متغیر کمکی را می دهد و از تلاش یک کلاس غیر مرتبط برای استفاده از آن جلوگیری می کند.

مثال

کلاس والد زیر از کنترل های دسترسی محافظت شده استفاده می کند تا کلاس فرزند آن روش را نادیده بگیرد openSpeaker ():

Class AudioPlayer (boolean openSpeaker (Speaker sp) محافظت شده (// جزئیات پیاده سازی)) کلاس StreamingAudioPlayer (boolean openSpeaker (Speaker sp) (// جزئیات پیاده سازی))

علاوه بر این ، اگر روشی را تعریف کنیم openSpeaker ()به عنوان محافظت شده ، پس از آن هیچ کلاس دیگری غیر از AudioPlayer قابل دسترسی نخواهد بود. اگر آن را عمومی تعریف کنیم ، در دسترس همگان قرار می گیرد. اما قصد ما این است که این روش را فقط در زیر کلاس قرار دهیم ، به همین دلیل از اصلاح کننده محافظت شده استفاده کردیم.

کنترل دسترسی و قوانین وراثت

قوانین زیر در جاوا برای روشهای ارثی اعمال می شود:

  • روشهایی که در یک فوق کلاس عمومی اعلام می شوند نیز باید در همه زیر کلاسها عمومی باشند.
  • روشهایی که در یک فوق کلاس محافظت شده اعلام می شوند باید در زیر کلاسهای خود یا محافظت شده یا عمومی باشند. آنها نمی توانند خصوصی باشند
  • روش هایی که خصوصی اعلام می شوند برای همه به ارث نمی رسد ، بنابراین هیچ قانونی برای آنها وجود ندارد.

اصلاح کننده های کلاس ، روش ، متغیر و جریان برای دسترسی استفاده نمی شوند

جاوا تعدادی اصلاح کننده را نه برای دسترسی ، بلکه برای اجرای بسیاری از عملکردهای دیگر ارائه می دهد:

  • اصلاح کننده ایستابرای ایجاد متدها و متغیرهای کلاس استفاده می شود.
  • اصلاح کننده نهاییبرای تکمیل اجرای کلاسها ، متدها و متغیرها استفاده می شود.
  • اصلاح کننده چکیدهمورد نیاز برای ایجاد کلاسها و روشهای انتزاعی ؛
  • اصلاح کننده ها هماهنگ شدهو فراردر جاوا برای جریانها استفاده می شود.

اصلاح کننده استاتیک

اصلاح کننده استاتیک- برای ایجاد متدها و متغیرهای کلاس استفاده می شود.

متغیرهای استاتیک

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

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

روشهای استاتیک

کلمه کلیدی استاتیک برای ایجاد روشهایی استفاده می شود که مستقل از هر نمونه ایجاد شده برای کلاس وجود خواهد داشت.

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

متغیرها و متدهای یک کلاس را می توان با استفاده از نام کلاس و پس از آن یک نقطه و نام متغیر یا متد دسترسی پیدا کرد.

مثال

اصلاح کننده استاتیک در جاوا برای ایجاد متدها و متغیرهای کلاس استفاده می شود ، همانطور که در مثال زیر نشان داده شده است:

کلاس عمومی InstanceCounter (private static int numInances = 0 ؛ static int getCount محافظت شده () (بازگشت numInsts؛) private static void addInstance () (numInances ++؛) InstanceCounter () (InstanceCounter.addInstance ()؛) public static void main ( استدلال های رشته ای) (System.out.println ("since" + InstanceCounter.getCount () + "example") ؛ for (int i = 0؛ i

خروجی زیر را دریافت خواهید کرد:

شروع از 0 نمونه 500 نمونه ایجاد کرد

اصلاح کننده نهایی

اصلاح کننده نهایی- برای تکمیل اجرای کلاسها ، متدها و متغیرها استفاده می شود.

متغیرهای نهایی

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

با این حال ، داده های داخل شی قابل تغییر است. بنابراین ، می توان وضعیت شی را تغییر داد ، اما نه مرجع.

در متغیرهای جاوا ، اصلاح کننده نهایی اغلب با static استفاده می شود تا یک متغیر کلاس به یک ثابت تبدیل شود.

مثال

کلاس عمومی test (int int = = 10؛ // در زیر نمونه هایی از اعلامیه های ثابت آمده است: public static final int BOXWIDTH = 6 ؛ static final String TITLE = "(! LANG: Manager"; public void changeValue(){ value = 12; //будет получена ошибка } } !}

روشهای نهایی

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

هدف اصلی برای نهایی شدن روش این است که محتوای روش نباید به طرف دیگر تغییر کند.

مثال

اعلان متد با استفاده از اصلاح کننده نهایی در اعلان کلاس در مثال زیر نشان داده شده است:

تست کلاس عمومی (تغییر نام خلأ نهایی عمومی () (// بدنه روش))

کلاس نهایی

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

مثال

آزمون کلاس عمومی عمومی (// بدنه کلاس)

اصلاح کننده چکیده

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

کلاس انتزاعی

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

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

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

مثال

کلاس انتزاعی کاروان (قیمت خصوصی دوگانه ؛ مدل رشته خصوصی ؛ سال خصوصی رشته ؛ عمومی خلاصه خلاء goFast () ؛ // روش انتزاعی عمومی تغییر خلاء خلاصه خلاصه رنگ () ؛)

روش انتزاعی

روش انتزاعی روشی است که با هر پیاده سازی اعلام می شود. بدنه روش (پیاده سازی) توسط زیر کلاس ارائه می شود. روشهای انتزاعی هرگز نمی توانند نهایی یا دقیق باشند.

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

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

یک روش انتزاعی با نقطه ویرگول خاتمه می یابد. مثال: نمونه چکیده عمومی ()؛

مثال

کلاس انتزاعی عمومی SuperClass (خلاصه خلاء m () ؛ // روش انتزاعی) کلاس SubClass گسترش SuperClass (// پیاده سازی روش انتزاعی void m () (.........))

اصلاح کننده همگام

اصلاح کننده همگام

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

مثال

عمومی همگام سازی void showDetails () (.......)

اصلاح کننده گذرا

یک متغیر نمونه که به عنوان گذرا مشخص شده است ، به ماشین مجازی جاوا (JVM) دستور می دهد که هنگام سریال سازی شیء حاوی آن ، از متغیر مشخص شده بگذرد.

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

مثال

حد عمومی گذرا عمومی = 55 ؛ // عمومی عمومی باقی نخواهد ماند ؛ // ادامه خواهد داشت

اصلاح کننده فرار

اصلاح کننده فرار- در جاوا برای جریانها استفاده می شود.

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

دسترسی به یک متغیر فرار همه متغیرهای کپی شده ذخیره شده در حافظه را همزمان می کند. فرار تنها می تواند برای متغیرهای نمونه ای استفاده شود که از نوع شی یا خصوصی هستند. اشاره به یک شیء فرار می تواند خالی باشد.

مثال

کلاس عمومی MyRunnable پیاده سازی Runnable (خصوصیات فرار بولی فعال ؛ اجرای عمومی خالی () (فعال = واقعی ؛ در حالی که (فعال) (// خط 1 // برخی از کد در اینجا)) توقف عمومی خالی () (فعال = غلط ؛ / / خط 2))

به طور معمول ، run () در یک نخ (اولین بار با استفاده از Runnable در جاوا) و stop () از یک نخ دیگر فراخوانی می شود. اگر خط 1 از مقدار فعال ذخیره شده استفاده می کند ، تا زمانی که فعال فعال را در خط 2 تنظیم نکنید ، حلقه نمی تواند متوقف شود.

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

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

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

  • خصوصی
  • عمومی (باز)
  • حفاظت شده
  • دسترسی پیش فرض در صورت عدم وجود اصلاح کننده

نمونه هایی از اعلان های اصلاح کننده (همیشه باید در اولویت قرار گیرند):

عمومی int i؛ خصوصی دو نفره j ، k؛ private int createMethod (int a) (...)؛ کلاس عمومی گربه ()

همانطور که مشاهده می کنید ، اصلاح کننده برای یک متغیر ، متد ، کلاس کاربرد دارد.

عمومی

هنگام استفاده از کلمه کلیدی عمومیشما اطلاع می دهید که اعلان اعضای کلاس زیر از هر کد دیگری در پروژه شما در دسترس همه است.

فرض کنید کلاس به عنوان اعلام شده است عمومی، و دو روش دارد. یکی خصوصی، دومین - عمومی... شما به کلاس درس و به آن دسترسی خواهید داشت دومینمتد ، اما نه برای اولین ، حتی اگر کلاس خود باز باشد.

خصوصی

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

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

حفاظت شده

کلمه کلیدی حفاظت شدهمربوط به مفهوم وراثت است ، که در آن اعضای جدید به کلاس قبلی (پایه) اضافه می شوند ، در حالی که اجرای اولیه بدون تغییر باقی می ماند. همچنین می توانید رفتار اعضای کلاس موجود را تغییر دهید. برای ایجاد یک کلاس جدید بر اساس کلاس موجود ، از کلمه کلیدی استفاده کنید گسترش می یابد.

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

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

یک کلاس تخیلی در نظر بگیرید SillySensor

کلاس عمومی SillySensor (private int sensorData؛ public SillySensor () (sensorData = 0؛) calibrate void private (int iSeed) (// کد برای کالیبراسیون) از دانه های خالی محافظت شده Calibration (int iSeed) (calibrate (iSeed)؛) public int getSensorData ( ) (// سنسور را در اینجا بررسی کنید sensorData؛))

کلاس به صورت اعلام شده است عمومیو در کلاسهای دیگر موجود است کلاس دارای یک متغیر است sensorData، که فقط در کلاس خود (خصوصی) موجود است. سازنده در کلاس های دیگر موجود است ( عمومی) روش کالیبره کردن ()فقط داخل کلاس کار می کند ( خصوصی) روش seedCalibration ()در کلاس یا زیر کلاس خود موجود است ( حفاظت شده) روش getSensorData ()موجود در کلاسهای دیگر ( عمومی).

کلاس اصلاح کننده
کلاس Modifier تمام اصلاح کننده ها را کد می کند ،
در اعلامیه های نوع ، در فرم استفاده می شود
ثابت ها:
چکیده ، نهایی ، رابط ، NATIVE ،
خصوصی ، محافظت شده ، عمومی ، استاتیک ،
سخت ، همگام ، گذرا ،
فرار.
هر یک از ثابت ها یک روش درخواست فرم دارد
isMod (اصلاح کننده int) (در اینجا Mod یکی از موارد بالا است
نام های داده شده ، به عنوان مثال ، isPublic) ،
که در صورت اصلاح ، true برمی گرداند
mod در اعلامیه نوع موجود است.

بیایید به یک مثال نگاه کنیم. بذار باشه
اعلام میدانی
public static final int s = 10؛
سپس مقدار برگشت داده شده توسط متد
getModifiers شی مربوطه
کلاس Field شبیه خواهد بود
اصلاح کننده. PUBLIC | اصلاح کننده. STATIC |
اصلاح کننده. نهایی
اصلاح کننده strictfp معرفی شده است
STRICT ثابت
روش ها - از پرس و جوها می توان در استفاده کرد
فرم زیر

Modifier.isPrivate (field.getModifiers ()) ؛
این معادل شرایط زیر است
(field.getModifiers () & Modifier.PRIVATE)! = 0
کلاس میدانی
به عنوان بخشی از کلاس Field ، متدها پیاده سازی می شوند ،
اجازه درخواست اطلاعات در مورد
نوع فیلد ، و همچنین آن را بخوانید و تنظیم کنید
معنی
بیایید برخی از متدهای کلاس Field را در نظر بگیریم
1.getType () - یک شیء کلاس را برمی گرداند
کلاس مربوط به نوع فیلد فعلی.
به عنوان مثال ، برای فیلدی از نوع int ، دریافت می کنیم
int.class

2. روش ها را تعیین کنید و دریافت کنید - به شما امکان می دهد بخوانید
مقدار فعلی میدان ، و همچنین یک مقدار جدید تنظیم کنید.
بیایید یک مثال را در نظر بگیریم:
public static void printField (Object o ،
نام رشته) پرتاب می کند
NoSuchFieldException ،
IllegalAccessException (
فیلد = o.getClass (). GetField (نام) ؛
مقدار کوتاه = (کوتاه) field.get (o)؛
System.out.println (مقدار) ؛
}
آن ها متد get مقداری را با آن برمی گرداند
به فیلد یا شی مربوط مربوط می شود
کلاس - پوسته
یک مثال از استفاده از روش مجموعه به این شکل است:

public static void setField (Object o ، String name ،
کوتاه nv) پرتاب می کند
NoSuchFieldException ،
IllegalAccessException (
فیلد = o.getClass (). GetField (نام)؛
field.set (o ، new Short (nv)) ؛
}
ذخیره nv در فیلدی از یک شیء معین
شما باید از کلاسهای بسته بندی استفاده کنید.
روش هایی نیز وجود دارد که فرم دارد
getPrimitiveType (مانند getInt) و
setPrimitiveType. این روش ها می توانند
استفاده برای تغییر زمینه در یک کلاس ،
داشتن نوع اولیه مثلا،
field.setShort (o ، nv) ؛

کلاس روش
ابزارهای کلاس Method - به شما امکان می دهد دریافت کنید
اطلاعات کامل در مورد
اعلان متد یک کلاس خاص ،
و این روش ها را در فراخوانی کنید
زمینه اشیاء داده شده
متدهای کلاس Method را در نظر بگیرید.
1.public class getReturnType () - برمی گرداند
شیء Class مربوط به نوع است
مقدار برگشتی با روش فعلی
اگر به جای بازگشت تایپ کنید
اعلان متد یک سرویس را مشخص می کند
کلمه باطل است ، روش مورد نظر برمی گردد
شیء void.class

2.public class getParameterTypes () - برمی گرداند

پارامترهایی که در اظهارنامه مشخص شده است
روش فعلی اشیاء در یک آرایه وارد می شوند
به ترتیب پارامترهای ذکر شده در
اعلام روش اگر روش ندارد
پارامترها ، یک آرایه خالی بازگردانده می شود.
3. کلاس عمومی getExceptionTypes () - برمی گرداند
آرایه ای از اشیاء Class مربوط به انواع
استثنائاتی که در جمله مشخص شده است
اعلان روش فعلی را می اندازد. اشیاء
به ترتیب آرایه وارد می شوند
نام انواع استثنا در لیست ذکر شده است
اعلام روش

4. فراخوانی شی عمومی (Object onThis، Object args)
پرتاب IllegalAccessException ،
استثناء غیرقانونی ،
InvocationTargetException
متد مشخص شده توسط شیء فعلی را فراخوانی می کند
روش ، در زمینه یک شی onThis با تخصیص
مقادیر آرگومان های منتقل شده توسط آرایه args.
برای روشهای غیر استاتیک ، انتخاب اجرا
بر اساس نوع واقعی انجام می شود
شیئی که توسط پارامتر onThis شناسایی شده است. برای
روشهای ایستا در این مورد در
توجه و ممکن است خالی باشد
طول آرایه args باید یک عدد باشد
پارامترهای موجود در اعلان متد و انواع شیء عناصر آرایه باید قابل انتساب باشند
انواع متناظر پارامترهای روش - در
در غیر این صورت یک استثنا حذف می شود
IIlegalArgumentException.

10.

اگر ترکیب جسم تعیین شود
onThis ، بدون نوع ، عضو
که روش فعلی است ،
یک استثنا کنار گذاشته می شود
استثناء غیرقانونی
اگر onThis خالی است و روش آن خیر
استاتیک ، یک استثنا از نوع پرتاب می شود
NullPointerException.
اگر اجرای متد فراخوانی شده باشد
غیر طبیعی خاتمه می یابد ، دور انداخته می شود
استثنا از نوع InvocationTargetException.

11.

بیایید به یک مثال نگاه کنیم. بیایید از طریق تماس بگیرید
روش بازتاب بازگشت str.indexOf ("." ، 8)
سپس ما داریم
تلاش كردن (
Сlass strClass = str.getClass ()؛
روش indexM = strClass.getMethod ("indexOf" ،
کلاس جدید (string.class ، int.class)) ؛
نتیجه شی = indexM.invoke (str ، شی جدید (
"." ، lnteger جدید (8))) ؛
return ((Integer) result) .intValue ()؛
}
گرفتن (NoSuchMethodException e) (…… ..)
گرفتن (invocationTargetException e) (…… ..)
گرفتن (غیر قانونیAccessException e) (……)

12.

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

13.

test double static داده = (0.3،1.3e-2 ، 7.9 ، 3.17) ؛

تلاش كردن (
برای (int arg = 0 ؛ arg< args.length; arg++){
نام رشته = args؛
کلاس classFor = Class.forName (نام) ؛
مرتب سازی SortDouble =
(SortDouble) classFor.newInstance ()؛
معیارهای SortMetrics = sorter.sort (testData)؛
System.out.println (نام + ":" + معیارها) ؛
برای (int i = 0 ؛ i< testData.length; i++)
System.out.println ("" + testData [i])؛))
گرفتن (استثناء e) (System.err.println (e)؛))

14.

روش Newlnstance در صورت نادرست
برنامه قادر به پرتاب بزرگ است
تعدادی از اشیاء استثنائی مختلف
انواع
InstantiationException - اگر کلاس ، شی باشد
که باید ایجاد شود ندارد
سازنده بدون استدلال ، یا
به صورت انتزاعی یا در تعریف شده است
واقعا یک رابط است ،
یا انجام روش ایجاد
شی برای دیگری قطع می شود
دلایل
IllegalAccessException - اگر کلاس یا کلاس آن باشد
هیچ سازنده آرگومان در دسترس نیست

15.

SecurityException - اگر خط مشی معتبر باشد
امنیت ایجاد اشیاء جدید را ممنوع می کند
ExceptionInInitializerError - وقتی پرتاب می شود
راه اندازی اولیه کلاس
روشهای دیگر در کلاس Constructor تعریف شده است.
public Сlass getParameterTypes ()

مربوط به انواع پارامترهایی است که
در بیانیه سازنده فعلی مشخص شده است.
کلاس عمومی getExceptionTypes ()
آرایه ای از اشیاء Class را برمی گرداند ،
مربوط به انواع استثنائات است که
در بند پرتاب اعلامیه تنظیم شده است
سازنده فعلی

16.

public object newlnstance (Object args)
پرتاب InstantiationException ،
استثناء غیرقانونی ،
استثناء غیرقانونی ،
InvocationTargetException
از سازنده ارائه شده توسط جریان استفاده می کند
یک شیء سازنده برای ایجاد و راه اندازی اولیه
نمونه جدیدی از کلاس که سازنده در آن است
اعلام کرد ، با استدلال های داده شده تصویب کرد.
پیوندی را به تازگی ایجاد شده و
یک شی اولیه شده طول آرایه args
باید با تعداد پارامترهای موجود در مطابقت داشته باشد
یک اعلان سازنده ، و انواع شیء عناصر آرایه باید قابل تخصیص باشند
انواع پارامترهای سازنده مربوطه -
در غیر این صورت یک استثنا حذف می شود
استثناء غیرقانونی

17.

بیایید یک مثال را در نظر بگیریم:
کلاس Myclass (
خصوصی int a؛
عمومی Myclass (int k) (a = k؛)
public int func (int a، int b) (بازگشت a + b؛)
}
کلاس عمومی Main (
public static void main (String args) (
تلاش كردن (
نام رشته = "Myclass"؛
کلاس mycl = Class.forName (نام) ؛
کلاس d = (int.class) ؛
سازنده c = mycl.getConstructor (d) ؛
Myclass ob = (Myclass) c.newInstance (شی جدید (
عدد صحیح جدید (10))) ؛
System.out.println (ob.func (3،5)) ؛ )
گرفتن (استثنا e) ()؛
}}

18.

کلاس AccessibleObject
کلاسهای Field ، Constructor و Method هستند
مشتق شده از کلاس AccessibleObject ،
که امکان حل یا
ممنوعیت بررسی علائم دسترسی سطح
زبانهایی مانند عمومی و خصوصی.
کلاس AccessibleObject متدهایی دارد
1.public void setAccessible (پرچم بولی)
پرچم دسترسی به شی را تنظیم می کند
با توجه به ارزش استدلال: true
یعنی شی دیگر اطاعت نمی کند
قوانین دسترسی تعیین شده در سطح
زبان (و همیشه در دسترس خواهد بود) ، غلط است
شی را مجبور می کند که داده را حفظ کند
سطح دسترسی.
اگر اختیار تغییر پرچم دسترسی
کافی نیست ، یک استثنا از نوع پرتاب می شود
استثناء امنیتی

19.

2. استاتیک عمومی
void setAccessible (آرایه AccessibleObject ،
پرچم بولی)
اجازه می دهد تا پرچم دسترسی را روی
اشیاء به عنوان یک آرایه منتقل می شوند.
اگر در طول پردازش بعدی
شیء یک استثنا از نوع را می اندازد
اشیاء SecurityException واقع شده اند
در آرایه قبلی ، مجموعه جدید را ذخیره کنید
مقادیر سطح دسترسی و سایر موارد
اجسام در همان حالت باقی می مانند.
3. public boolean isAccessible ()
مقدار فعلی پرچم دسترسی را برمی گرداند
به جسم

20.

کلاس آرایه
کلاس آرایه برای ایجاد آرایه استفاده می شود
به وسیله تأمل
دو روش برای ایجاد آرایه ها وجود دارد
newInstance
public object newlnstance (کلاس compType ، int length)
مرجعی را به آرایه جدیدی از نوع compType باز می گرداند
طول طول داده شده
public object newInstance (کلاس compType ، int dim)
مرجعی را به آرایه جدید چند بعدی از نوع بر می گرداند
compType که ابعاد آن با مقادیر مشخص شده است
عناصر آرایه پارامتر dim.
اگر dim خالی است یا طولانی تر از
تعداد مجاز ابعاد (معمولاً 255) ،

llegalArgumentException.

21.

بیایید چند نمونه را بررسی کنیم.
مثال 1 بیایید یک آرایه از نوع بایت تشکیل دهیم
بایت ba = (بایت)
Array.newlnstance (byte.class ، 13) ؛
این همان است که
بایت ba = بایت جدید؛
مثال 2
int dims = (4 ، 4) ؛
دو ماتریس = (دو برابر)
Array.newlnstance (double.class، dims)؛
این همان است که
دو ماتریس = دوبل جدید ؛

22.

کلاس Array متدهای get و set دارد.
اجازه دهید یک آرایه xa از مقادیر نوع int داده شود. سپس
عبارت xa [i] مطابقت دارد:
عدد صحیح n = Array.get (xa، i)
می توانید به عنصر آرایه مقدار زیر را اختصاص دهید:
xa [i] = 23 ؛ مثل این هست که
Array.set (xa، i، Integer جدید (23))؛
کلاس بسته بندی
فراخوانی متد getPackage از کلاس Class اجازه می دهد
دریافت یک شیء از کلاس Package حاوی
توضیحات بسته ای که شامل
کلاس (کلاس بسته به خودی خود در بسته قرار دارد
java.lang).
متد () getName شیء Package باز می گردد
نام کامل بسته فعلی

23.

کلاس پروکسی
کلاس پروکسی به شما امکان ایجاد پویا را می دهد
کلاس هایی که یک یا چند مورد را پیاده سازی می کنند
رابط ها
فرض کنید کلاس A وجود دارد ،
پیاده سازی برخی از رابط ها
ماشین جاوا در زمان اجرا می تواند
ایجاد کلاس پروکسی برای داده های داده شده
کلاس A ، یعنی کلاسی که
همه رابط های کلاس A را پیاده سازی می کند ، اما
فراخوانی همه روشهای اینها را جایگزین می کند
رابط هایی برای فراخوانی متد invoke ،
رابط InvocationHandler ، برای
که می توانید خود را تعریف کنید
پیاده سازی.

24.

با استفاده از فراخوانی متد یک کلاس پروکسی ایجاد می کند
Proxy.getProxyClass که ClassLoader و
یک آرایه از رابط ها ، و یک شی را برمی گرداند
کلاس java.lang.Class که با آن بارگذاری شده است
از پاس در ClassLoader و پیاده سازی شده در آرایه
رابط ها
تعدادی محدودیت در مورد پارامترهای ارسال شده وجود دارد:
1. همه اشیاء در آرایه رابط ها باید باشند
رابط ها آنها نمی توانند کلاس باشند یا
بدوی ها
2. آرایه رابط ها نمی توانند شامل دو یکسان باشند
اشیاء.
3. همه رابط ها در آرایه رابط ها باید باشند
توسط ClassLoader بارگذاری می شود که به متد منتقل می شود
getProxyClass.
4- همه رابط های غیر عمومی باید تعریف شوند
در همان بسته ، در غیر این صورت کلاس پروکسی ایجاد شده است
قادر به اجرای همه آنها نخواهد بود.

25.

5. هیچ دو رابط نمی تواند شامل شود
روشی با همین نام و
امضای پارامتر ، اما با متفاوت است
انواع بازگشت
6. طول آرایه رابط محدود است
65535 رابط بدون کلاس جاوا
نمی تواند بیش از 65535 را اجرا کند
رابط ها

26.

خواص کلاس پراکسی پویا
1. کلاس پروکسی عمومی است ، ارائه شده است
نهایی است و انتزاعی نیست
2. نام کلاس پیش فرض پروکسی نیست
تعریف می شود ، اما در Proxy شروع می شود. همه چيز
فضای نام با پروکسی شروع می شود
مختص کلاسهای پروکسی
(این مورد در نسخه های اخیر جاوا لازم نیست.)
3. کلاس پروکسی از
java.lang.reflect.Proxy.
4. کلاس پروکسی همه رابط ها را پیاده سازی می کند ،
به هنگام انتقال ، به ترتیب انتقال منتقل می شود.

27.

5. اگر کلاس پروکسی یک غیر عمومی را پیاده سازی کند
رابط ، سپس در بسته تولید می شود
که در آن این بسیار غیر عمومی است
رابط. به طور کلی ، بسته ای که در آن
کلاس پروکسی بدون تعریف ایجاد می شود.
6. روش Proxy.isProxyClass true برای برمی گرداند
کلاس های ایجاد شده با
Proxy.getProxyClass و برای کلاس های شیء ،
ایجاد شده با Proxy.newProxyInstance و
دروغ در غیر این صورت
این روش توسط زیر سیستم استفاده می شود
امنیت جاوا و شما باید بدانید که برای
کلاسی که به تازگی از آن به ارث رسیده است
java.lang.reflect.Proxy نادرست برمی گردد.

28.

خصوصیات نمونه ایجاد شده از کلاس پروکسی به شرح زیر است:
1. شیء کلاس پروکسی برای همه رابط ها آورده می شود ،
در آرایه رابط ها منتقل می شود. اگر IDemo یکی از
از رابط های منتقل شده ، سپس نمونه پروکسی عملیات
IDemo همیشه true و عملیات (IDemo) پروکسی را برمی گرداند
به درستی تکمیل خواهد شد
2. روش استاتیک Proxy.getInvocationHandler
تماس گیرنده ارسال شده در ایجاد را برمی گرداند
نمونه ای از کلاس پروکسی در صورت انتقال به داده
شیء متد نمونه ای از کلاس پروکسی نیست
یک استثنا IllegalArgumentException پرتاب می شود.
3. کلاس کنترل کننده تماس رابط را پیاده سازی می کند
InvocationHandler که در آن روش فراخوانی تعریف شده است ،
داشتن امضای زیر:
فراخوانی ابژه عمومی (پروکسی شی ، روش متد ،
object args) Throwable را پرتاب می کند

29.

بیایید یک مثال را در نظر بگیریم:
بسته javaapplication3 ؛
حساب رابط (
Double getBalance ()؛
void changeBalance (int sum) ؛
درصد خالی (در هر دو برابر) ؛)
کلاس MyAccount پیاده سازی حساب (
موجودی دوگانه خصوصی ؛
عمومی MyAccount () (موجودی = 0.0 ؛)
public double getBalance () (موجودی برگشتی؛)
public void changeBalance (int sum) (
مانده + = مجموع ؛)
درصد خالی عمومی (دو برابر در) (
تراز + = تراز * در / 100 ؛ )؛ )

30.

کلاس MyAccountProxy پیاده سازی می شود
InvocationHandler (
حساب خصوصی ac؛
عمومی MyAccountProxy (حساب acc) (ac = acc؛)
public static Account newInstance (حساب da) (
بازگشت (حساب) Proxy.newProxyInstance (
da.getClass (). getClassLoader () ،
da.getClass (). getInterfaces () ،
جدید MyAccountProxy (da)) ؛
}

31.

فراخوانی ابژه عمومی (پروکسی شی ،
روش روش ، آرگومان های شیء)
پرتاب Throwable (
if (method.getName () == "درصد") (
double d = ((Double) args) .doubleValue ()؛
اگر (د<0) d=0;
اگر (d> 30) d = 30 ؛
args = جدید Double (d)؛

دیگری (
return method.invoke (ac، args)؛ )
}
}

32.

کلاس عمومی Main (
public static void main (String args) (
MyAccount ma = new MyAccount ()؛
حساب
a = (حساب) MyAccountProxy.newInstance (ma)؛
a.changeBalance (150) ؛

a. درصد (20) ؛
System.out.println (a.getBalance ()) ؛
a. درصد (35) ؛
System.out.println (a.getBalance ())؛))

33.

بارگیری کلاس ها
سیستم زمان اجرا کلاس ها را به عنوان بارگذاری می کند
ظهور نیاز به آنها
ویژگی های عملکردی مراحل بوت
اساساً کلاسها بستگی دارد
پیاده سازی ماشین های مجازی جاوا ، اما در
در بیشتر موارد برای یافتن کلاس ،
توسط برنامه آدرس داده می شود اما بارگیری نمی شود
توسط سیستم اجرایی ، مکانیزم اعمال می شود
مشاهده مسیر جستجوی کلاس
ایجاد یک برنامه کاربردی که بتواند
بارگذاری کلاسها به روشهای دیگر
به طور پیش فرض ارائه شده است ، شما باید
از یک شیء کلاس ClassLoader استفاده کنید ،
قادر به دریافت بایت کد برای اجرای مورد نظر است
کلاس بندی کرده و آن را در محیط زمان اجرا بارگذاری کنید
سیستم های.

34.

کلاس ClassLoader یک کلاس انتزاعی است.
برای ایجاد کلاس لودر مخصوص خود ،
لازم است یک کلاس ایجاد شود که از آن ارث می برد
روش ClassLoader و override
کلاس محافظت شده findClass (نام رشته) را پرتاب می کند
ClassNotFoundException
که کد زیر را با داده شده پیدا می کند
نامگذاری شده و داده ها را در محیط بارگذاری می کند
ماشین مجازی با بازگشت یک شیء Class ،
نماینده کلاس یافت شده
شیء بارکننده قادر به واگذاری است
اختیار بارگذاری کلاسها در "والد"
لودر کلاس والد
بارگذار کلاس "والد" می تواند باشد
به عنوان استدلال به سازنده کلاس داده می شود
ClassLoader.

35.

ClassLoader محافظت شده ()
به طور ضمنی یک شیء ClassLoader ایجاد می کند
استفاده به عنوان "والد"
لودر سیستم classloader
(که می توان از طریق آن به دست آورد
با متد getSystemClassLoader تماس بگیرید).
ClassLoader محافظت شده (والد ClassLoader)
با استفاده از یک شیء ClassLoader ایجاد می کند
کلاس بارگذار "پدر و مادر" مشخص شده است.
قسمت اصلی کلاس ClassLoader
روش loadClass است

36.

public Сlass loadClass (نام رشته) پرتاب می کند
ClassNotFoundException
با کلاس داده شده ، شیء Class را برای کلاس برمی گرداند
نام و به صورت اختیاری این را بارگیری می کند
کلاس. اگر نمی توان کلاس را بارگیری کرد ،
یک استثنا از نوع پرتاب می شود
ClassNotFoundException.
طرح بارگذاری کلاس ارائه شده توسط روش
loadClass به طور پیش فرض است و معمولاً خیر
نادیده گرفته شده به این شکل است:
1. با فراخوانی یک متد بررسی کنید
findLoadedClass از کلاس ClassLoader ، نه
آیا کلاس مشخص شده قبلاً بارگیری شده است ؛ بعنوان بخشی از
ClassLoader جدولی از اشیاء را ارائه می دهد
کلاس برای همه کلاسهای بارگذاری شده توسط وسایل
لودر کلاس فعلی ؛ اگر کلاس بود
بارگیری قبل ، روش findLoadedClass
یک مرجع را به یک شیء کلاس موجود باز می گرداند.

37.

2. اگر کلاس بارگیری نشده باشد ، نامیده می شود
loadClass لودر "والد"
کلاس ها؛ اگر بوت لودر فعلی نیست
دارای "والد" است ، استفاده می شود
لودر کلاس سیستم ؛
3. اگر کلاس هنوز بارگیری نشده است ،
متد findClass انجام می شود
جستجو و بارگیری کلاس
بنابراین ، لازم است اجرا شود
نسخه های بومی روش های زیر
ClassLoader:

38.

کلاس هماهنگ شده محافظت شده
loadClass (نام رشته ، وضوح بولی)

کلاس محافظت شده findClass (نام رشته)
ClassNotFoundException را پرتاب می کند
محافظت شده java.net.URL findResource (نام رشته)
محافظت شده java.util.Enumeration
findResources (نام رشته) IOException را پرتاب می کند
(کلاس انتزاعی ClassLoader نشان می دهد
فقط پیاده سازی روش loadClass بر اساس
در مورد روشهای محافظت شده - findLoadedClass و findClass).

39.

بیایید به یک مثال نگاه کنیم.
کلاس PlayerLoader گسترش ClassLoader (
public class findClass (نام رشته) پرتاب می کند
ClassNotFoundException (
تلاش كردن (
byte buf = bytesForClass (نام) ؛
return defineClass (name، buf، 0، buf.length)؛
}
گرفتن (IOException e) (
پرتاب ClassNotFoundException جدید (e.toString ()) ؛
}
}
// ... اعلان متدها bytesForClass و دیگران
مواد و روش ها
}

40.

روش findClass معمولاً دو مورد را انجام می دهد
کارکرد.
ابتدا باید کد بایتی را تشخیص دهد
از کلاس داده شده و آن را در یک آرایه ذخیره کنید
نوع بایت - این وظیفه در مثال است
به روش bytesForСlass اختصاص داده شده است.
دوم ، از روش کاربردی استفاده می کند
defineСlass برای اجرای واقعی
بارگیری کلاس تعریف شده توسط بایت کد.
روش تعریف کلاس دارای فرم است

41.

کلاس پایانی DefinedClass (نام رشته ،
بایت داده ، int offset ، int طول) پرتاب می کند
ClassFormatError
شیء Class را برای کلاس با نام داده شده برمی گرداند
نام؛ نمایش دوتایی کلاس به
به عنوان یک داده آرایه
فقط بایت برای بارگذاری کلاس استفاده می شود ،
موجود در عناصر آرایه داده با شاخص
افست به افست + طول. اگر بایت از مشخص شده است
فاصله با قالب مورد نیاز مطابقت ندارد
توضیح کلاس ، شیء استثنا پرتاب می شود
از نوع ClassFormatError.
متد مسئول حفظ مرجع به شی است
کلاس برای کلاس بارگذاری شده در جدول بارگذاری شده
کلاس هایی که با متد findLoadedClass مشاهده می شوند.

42.

روش bytesForClass را در نظر بگیرید.
bytesForClass (String name) پرتاب می شود
lOException ، ClassNotFoundException (
FileInputStream in = null؛
تلاش كردن (


if (length == 0) پرتاب ClassNotFoundException جدید (نام) ؛
byte buf = بایت جدید؛

بازگشت buf ؛
}
سرانجام (
if (in! = null) in.close ()؛
}
}

43.

بنابراین ، کد کامل به این شکل است:
واردات java.lang.reflect. *؛
واردات java.io. *؛
کلاس MyClassLoader گسترش ClassLoader (
کلاس عمومیfindClass (نام رشته) پرتاب می کند
ClassNotFoundException (
byte buf = ReadFromBuffer (نام) ؛
if (name.equals ("MyInterface1")))

) else if (buf == null) (
بازگشت findSystemClass (نام) ؛
) دیگر (
return defineClass (name، buf، 0، buf.length)؛
}
}

44.

بایت محافظت شده ReadFromBuffer (نام رشته) پرتاب می کند
ClassNotFoundException (
FileInputStream in = null؛
تلاش كردن (
in = new FileInputStream (نام + ".class") ؛
int length = in.available ()؛ // تعداد بایت های موجود
اگر (طول == 0) پرتاب کنید
ClassNotFoundException جدید (نام) ؛
byte buf = بایت جدید؛
in.read (buf) ؛ // بایت را بخوانید
بازگشت buf ؛
}
catch (FileNotFoundException e) (بازگشت null؛)
catch (IOException e) (بازگشت null؛)
سرانجام (
try (if (in! = null) in.close ()؛)
گرفتن (IOException e) ()
}
}

45.

کلاس هماهنگ شده محافظت شده
loadClass (نام رشته ، حل بولین) پرتاب می کند
ClassNotFoundException (
نتیجه کلاس = findClass (نام) ؛
اگر (حل )olutionClass (نتیجه) ؛
نتیجه بازگشت ؛
}
}

46.

کلاس عمومی Main1 (
public static void main (String args) (
تلاش كردن (
نام رشته = "Myclass"؛
ClassLoader ld = MyClassLoader جدید ()؛
کلاس cl = Class.forName (نام ، true ، ld) ؛
سازنده s = cl.getConstructor (int.class) ؛
MyInterface1
ob = (MyInterface1) s.newInstance (
عدد صحیح جدید (8)) ؛
System.out.println (ob.func (3،5)) ؛
) گرفتن (استثنا e) ()؛
}
}

47.

رابط عمومی MyInterface1 (
public int func (int a، int b)؛
}
کلاس عمومی Myclass پیاده سازی MyInterface1 (
خصوصی int a؛
عمومی Myclass (int k) (a = k؛)
public int func (int a، int b) (بازگشت a + b؛)