سمت راست این است که:

1. اگر یک کلاس ایجاد کنید و سازنده ای را با آرگومان ها در یک کلاس جدید تعریف کنید (کلاس AClass که فقط یک سازنده دارد که int i را می پذیرد)، کامپایلر دیگر سازنده را در پشت صحنه ایجاد نمی کند. بنابراین، این قرارداد کلاس AClass را که بدون آرگومان نمی‌توان مقداردهی اولیه کرد، از بین می‌برد. اگر مادران و طراحان بیشتری برای نظافت می خواهید، اکنون واضح بپرسید.

در غیر این صورت، محافظت از سازه سازنده برای تمیز کردن ممکن نخواهد بود، که بد خواهد بود.

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

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

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

کلاس عمومی AClass1()

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

این معادل این است:

کلاس عمومی AClass1 (عمومی AClass1 () ())

حالا بیایید BClass1 را شگفت زده کنیم:

کلاس عمومی BClass1 AClass1() را گسترش می دهد

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

کلاس عمومی BClass1 AClass1 را گسترش می دهد (BClass1 عمومی () (super (;))

طرح شما یک کلاس بدون سازنده در پشت ساختار ایجاد می کند:

کلاس عمومی (کلاس عمومی (int i) ())

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

AClass a = new AClass(); // کار نمی کند

آنچه برای خشتال لازم است

AClass a = جدید AClass(1);

ظاهراً هر سازنده BClass می تواند به عنوان مرجع برای هر سازنده AClass یا BClass استفاده شود. با این توضیحات، کامپایلر پارس خواهد کرد:

عمومی BClass AClass() را گسترش می دهد

بنابراین، اگر راهنمای طراح را برای تطبیق کلاس AClass امتحان کنید، به این معنی نیست:

عمومی BClass AClass را گسترش می دهد (BClass عمومی () (super (); // mercy؛ چنین سازنده ای در کلاس AClass وجود ندارد))

Prote، می‌توانید یک کلاس BClass با سازنده پشت آن با تعیین مقدار سازنده AClass ایجاد کنید:

کلاس عمومی BClass AClass را گسترش می دهد (BClass عمومی () (super(1);))

این اجباری است.

ظاهراً شیء نمونه ای از کلاس آواز است. برای این ایجاد، از کلمه کلیدی جدید استفاده می شود، به عنوان مثال:
شخص دانشجو = شخص جدید ("مایک")
یک شی جدید با استفاده از این کد ایجاد می شود شخصو نام او را نشان دهید - مایک. ردیف " مایک» به عنوان آرگومان به substructor ارسال شد شخص:

شخص (نام رشته) (this.name = نام؛)

این سازنده به شما امکان می دهد نام افراد را هنگام ایجاد یک شی وارد کنید.

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

  • سازنده ها همان نام های کلاس را ایجاد می کنند.
  • سازنده ها، مانند متدها، فهرستی از پارامترهای پذیرفته شده را تولید می کنند، اما نمی توانند نوع آن را تغییر دهند (name void).

در زیر نمایشنامه ها را شماره گیری کنید 7 قانون اساسی رباتیک با کیت های ساختمانی ، چیزی که به همه اجازه می دهد در کار خود رشد کنند.

  1. طراحان را می توان دوباره طراحی کرد:

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

کلاس Rectangle (عرض int؛ ارتفاع int؛ مستطیل () (عرض = 1؛ ارتفاع = 1؛) مستطیل (عرض int) (این. عرض = عرض؛ این. ارتفاع = عرض؛) مستطیل (عرض int، ارتفاع int) ( this.width=width;this.height=height;))

سه مجموعه ساخت و ساز مختلف وجود دارد مستطیلشما می توانید یک شی جدید را به سه روش مختلف ایجاد کنید:

Rectangle rect1 = new Rectangle(); Rectangle rect2 = new Rectangle(10); Rectangle rect3 = New Rectangle(10,20);

  1. طراح پشت صحنه:

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

برای مثال، بیایید کلاس Rectangle را به ترتیب زیر بنویسیم:

کلاس مستطیل (عرض، ارتفاع، مساحت داخلی () () محیط داخلی () ())

کامپایلر به طور خودکار یک سازنده را در پشت ساختار قرار می دهد: ectangle () ()

  1. کامپایلر یک سازنده بر اساس ساختار ایجاد می کند، زیرا کلاس قبلاً سازنده دارد:

بیایید نگاهی به سهام حمله بیندازیم:

کلاس Rectangle (عرض int؛ ارتفاع int؛ مستطیل (int عرض) (این. عرض = عرض؛ این. ارتفاع = عرض؛) مستطیل (عرض int، ارتفاع int) (این. عرض = عرض؛ این. ارتفاع = ارتفاع؛) )

هنگامی که می خواهید یک شی جدید ایجاد کنید: Rectangle rect1 = new Rectangle (); به نظر می رسد کامپایلر مشکل دارد زیرا نمی تواند سازنده بدون آرگومان پیدا کند.

  1. طراحان تسلیم نمی شوند:

هنگام در نظر گرفتن روش ها، سازنده ها ساکن نمی شوند. باسن:

کلاس Rectangle(Rectangle(int width, int height)()) کلاس مربع گسترش Rectangle()

نمی توان برای این تصویر پول خرج کرد: جعبه مربع = مربع جدید (10، 10);

  1. طراحان می توانند خصوصی باشند!

می توانید سازنده را خصوصی کنید تا از ایجاد یک نمونه جدید از کلاس کد خارجی جلوگیری کنید. چرا می توانید از مزیت یک سازنده خصوصی بهره مند شوید؟

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

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

هنگام نوشتن یک کلاس جدید: کلاس عمومی Person ()

کامپایلر هنگام قرار دادن سازنده در پشت صحنه، از جمله اصلاح کننده دسترسی لازم: public Preson ();

  1. اولین ردیف هر طراح مقصر دانستن یا برتری مجدد طراح همان کلاس یا طراح یک ابر کلاس دیگر است:

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

کلاس والد (والد (شماره int) ()) کلاس فرزند والد را گسترش می دهد (فرزند () ())

بیایید کار را به این نقطه برسانیم که کامپایلر یک فراخوانی super() را در سازنده کلاس وارد کند کودک:

Child () (super ()؛ // افزودن کامپایلر)

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

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

در نسخه به‌روزشده کلاس Body، متنی که در زیر مشاهده می‌کنید، شیء در آن نشان داده می‌شود آسیاب بلالهم برای کمک بیان اولیه و هم برای کمک سازنده.

idNUm طولانی عمومی؛

رشته عمومی نام= "<Без имени>";

مدارهای عمومی بدن = null;

خصوصی استاتیک طولانی nextID = 0;

idNUm = nextID++;

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

سازنده برای کلاس Body بدون پارامتر. مهم است که این کار را با دقت انجام دهید - مطمئن خواهید شد که مقدار فیلد idNum شی جدید ایجاد شده منحصر به کلاس است. نسخه خروجی کلاس جریمه کوچکی برای برنامه نویس back-end دارد، به عنوان مثال، با یک عملیات پیکربندی نادرست که مقداری را به فیلد idNum اختصاص می دهد، یا با تعدادی دستورالعمل برای افزایش به جای فیلد nextID، مرتبط است. منجر به این واقعیت می شود که تعدادی از اجسام Body با شماره سریال از یکدیگر جدا می شوند. نتیجه مشابه به وضوح Pomilkovy است، و بنابراین بخشی از قرارداد را برای کلاسی که در آن ارتباط برقرار می شود، نقض می کند:

"مقادیر idNum اشیاء مختلف در کلاس guilty منحصر به فرد خواهد بود."

با انتقال مسئولیت انتخاب مقادیر صحیح idNum به خود کلاس، می‌توانیم بارها و بارها به مزایای مشابهی دست یابیم. اکنون سازنده کلاس Body یک موجودیت واحد است که جایگزین فیلد nextID می شود و نیاز به دسترسی به قسمت بعدی دارد. بنابراین، ما می‌توانیم و باید اصلاح‌کننده nextID خصوصی را تغییر دهیم تا از امکان دسترسی به آن در مرزهای کلاس جلوگیری کنیم. پس از به دست آوردن این، یکی از خطرات بالقوه رحمت را که کوریستوواچم آینده کلاس ما را تهدید می کند خاموش خواهیم کرد.

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

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

Body sun = new Body(); // idNUm = 0

آفتاب. name = "Sonce";

Body earth = new Body(); // idNum = 1

earth.name = "زمین";

Earth.orbits = خورشید;

Process با استفاده از عملگر جدید با سازنده ای برای کلاس Body یک شی ایجاد می کند. بعد ازانتساب به نام و فیلدهای ویروس ها و مقادیر اولیه ارسال شده توسط ما.

پدیده فوق - وقتی در پس‌زمینه هستیم، در زمان نوشتن برنامه‌های اطلاع‌رسانی درباره نام یک جرم نجومی و درباره آن‌هایی که مدار مدار آن از اطراف آن جرم آسمانی می‌گذرد - بسیار نادر است. از این منظر، ایجاد سازنده دیگری که مقدار نام شی را می گیرد و به عنوان آرگومان به شی مرکزی ارسال می کند، کاملا معقول خواهد بود:

بدن (نام بدنه رشته، مدارهای بدن در اطراف) (

name = bodyName; orbits = orbitsAround;

همانطور که ممکن است توجه داشته باشید، یک سازنده از یک کلاس به سازنده دیگری در پشت عبارت this - اولین دستورالعمل ساخته شده در بدنه سازنده آغازگر تکامل می یابد. چنین گزاره ای نامیده می شود ویکلیک صریح سازنده.اگر سازنده، قبل از اینکه بخواهید به طور صریح آن را باز کنید، مجموعه ای از آرگومان ها را ارسال می کند، هنگام فراخوانی، مقصر انتقال است. اینکه کدام سازنده فراخوانی خواهد شد با تعداد آرگومان ها و مجموعه انواع آنها تعیین می شود. در این مورد، عبارت this به معنای فراخوانی سازنده بدون پارامتر است که به شما امکان می دهد مقدار idNum یک شی را تنظیم کنید و جابجایی فعلی فیلد استاتیک nextID را یک افزایش دهید. بازگشت به این امکان جلوگیری از تکرار کد مقداردهی اولیه idNum و تغییر nextID را فراهم می کند. اکنون کدی که به اشیاء ایجاد شده منتقل می شود بسیار ساده تر است:

Body sun = بدن جدید ("خورشید"، پوچ);

بدن زمین = بدن جدید ("زمین"، خورشید);

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

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

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

بدنه (String bodyName) (

this (bodyName, null);

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

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

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

· بدون کمک سازنده با پارامترها، هیچ کلاسی نمی تواند اشیاء خود را با مقادیر خروجی دلپذیر ارائه کند.

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

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

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

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

معنی به عنوان عمومی خواهد بود.

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

بدن (بدن دیگر) (

idNum = other.idNum;

نام= Other.name;

orbits = other.orbits;

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

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

متن طراحان به معما اجازه می دهد تا سرزنش را حذف کند.

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

1. دستورالعمل های طراح را درک کنید

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

در رایج ترین شکل، برای کلاس ClassName، سازنده پشت ساختار ظاهر زیر را دارد:

کلاسنام کلاس(... // سازنده حیرت زده شدنام کلاس()( // بدنه سازنده // ... } ... }
2. در چه مواردی سازنده به صورت خودکار در کلاس تولید می شود و در برخی موارد نه؟ لب به لب

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

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

کلاس CMyClass( بین المللید بین المللی GetD()( برگشتد ) خالی SetD( بین المللی nd) (d = nd؛))

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

// این به این دلیل است که کلاس دیگر سازنده آب را پیاده سازی نمی کند CMyClass mc = جدید CMyClass();

اگر می‌خواهید یک سازنده دیگر به بدنه کلاس CMyClass اضافه کنید (مثلاً سازنده‌ای با یک پارامتر)، سازنده پشت دستورالعمل‌ها به‌طور خودکار تولید نمی‌شود.

کلاس CMyClass( بین المللید // سازنده پشت دستورالعمل ها دیگر به طور خودکار تولید نمی شود CMyClass( بین المللی nd) (d = nd؛) بین المللی GetD()( برگشتد ) خالیتنظیم ( بین المللی nd) (d = nd؛))

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

// تصحیح کامپایل، زیرا در کلاس از قبل سازنده دیگری وجود دارد // CMyClass mc = new CMyClass (); CMyClass mc2 = جدید CMyClass (7)؛ // و این کد کار می کند

در نتیجه ردیف جدید ایجاد شده، کامپایل قابل مشاهده خواهد بود:

سازنده CMyClass() تعریف نشده است

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

کلاس CMyClass( بین المللید // بدیهی است که طراح برای اجرا مات شده است CMyClass() (d=0;) // سازنده خالی با 1 پارامتر، CMyClass( بین المللی nd) (d = nd؛) بین المللی GetD()( برگشتد ) خالیتنظیم ( بین المللی nd) (d = nd؛))

پس از چنین پیاده سازی، می توانید نمونه ای از یک کلاس را با استفاده از دو سازنده ایجاد کنید

CMyClass mc = جدید CMyClass(); // برای دستورات سازنده را فراخوانی کنید mc.d = 25; CMyClass mc2 = جدید CMyClass (5); // یک سازنده با 1 پارامتر فراخوانی کنید

3. دعوت از طراحان از دیگر طراحان. لب به لب

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

لب به لباین برنامه کلاس CPixel را نشان می دهد که یک پیکسل را روی صفحه نمایشگر پیاده سازی می کند.

// کلاسی که پیکسل را روی صفحه نمایشگر پیاده سازی می کند عمومی کلاس CPixel ( // کلاس های داخلی خصوصی بین المللی x، y; // مختصات پیکسل خصوصی بین المللیرنگ؛ // رنگ پیکسل // سازنده بدون پارامتر (سازنده پشت صحنه) CPixel() (x=y=color=0;) سازنده // با 2 پارامتر که فقط مختصات را مقداردهی اولیه می کند CPixel ( بین المللی _ایکس، بین المللی _y) (x = _x؛ y = _y؛ رنگ = 0؛) سازنده // با 1 پارامتر که فقط رنگ ها را مقداردهی اولیه می کند CPixel ( بین المللی _color) (color = _color؛ x = y = 0;) // سازنده با 3 پارامتر که به آن سازنده با 2 پارامتر گفته می شود CPixel ( بین المللی _ایکس، بین المللی _y، بین المللی _رنگ) ( // کلیک سازنده با 2 پارامتر: اولین عملیات و فقط یک بار این(_X, _y)؛ // این (_color); // کلیک طراح حصار را تکرار کنید این.color = _color; // امکانش وجود دارد) // روش دسترسی بین المللی GetX()( برگشتایکس؛ ) بین المللی GetY()( برگشت y; ) بین المللی GetColor()( برگشترنگ؛ ))

جایگزینی کلاس CPixel در سایر کدهای برنامه (روش ها)

CPixel cp1 = جدید CPixel(2,8); // سازنده wiklik با 2 پارامتر CPixel cp2 = جدید CPixel(3،5،8); // نماد سازنده که با سازنده دیگر متفاوت است بین المللید d = cp1.GetX(); // d = 2 d = cp2.GetColor(); // d = 8 d = cp2.GetY(); // d = 5 ...

4. چه نوع محدودیت هایی برای فراخوانی سازنده های دیگر از سازنده کلاس اعمال می شود؟

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

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

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

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

سازندگان چیست و چه چیز دیگری نیاز دارید؟

بیایید نگاهی به دو لبه بیندازیم. خودرو کلاس عمومی (مدل رشته‌ای؛ int maxSpeed؛ خالی استاتیک عمومی اصلی (String args) (Car bugatti = ماشین جدید (؛ بوگاتی. مدل = "Bugatti Veyron"؛ بوگاتی. maxSpeed ​​= 407;)) ما ماشین خود را ایجاد کردیم و مدل را روی حداکثر سرعت تنظیم کنید. با این حال، در یک پروژه واقعی، شی Car به وضوح بیش از 2 فیلد خواهد داشت. و مثلا 16 فیلد! کلاس عمومی خودرو (مدل رشته ای؛ // model int maxSpeed; //حداکثر سرعت، بیشینه سرعت//حجم موتور// نام مستعار حاکم// تعداد ساعات در کابین String SalonMaterial; // مواد داخلیبیمه بولی; // بیمه شده//کراینا ویروبنیک int trunkVolume; // پوشش تنهشتاب داخلی تا 100 کیلومتر؛ خالی ثابت عمومی (String args) (Car bugatti = ماشین جدید ()؛ بوگاتی. رنگ = "آبی"؛ بوگاتی. شتاب تا 100 کیلومتر = 3؛ بوگاتی. حجم موتور = 6.3؛ بوگاتی. سازنده کشور = "ایتالیا"؛ بوگاتی. مالکFirstName = " آمیگو "؛ بوگاتی. yearOfIssue = 2016 roku؛ بوگاتی. بیمه = واقعی؛ بوگاتی. قیمت = 2000000؛ بوگاتی. isNew = نادرست؛ بوگاتی. مکانهاInTheSalon = 2؛ بوگاتی. maxSpeed ​​= 407؛ بوگاتی. مدلی = "Bugatti. ;)) ما یک شی جدید ماشین ایجاد کرده ایم. یک مشکل: ما 16 میدان داریم اما فقط 12 میدان تولید می کنیم! سعی کنید بفهمید که چه چیزی را پشت کد فراموش کرده ایم! به همین راحتی نیست، درست است؟ در چنین شرایطی، برنامه نویس می تواند به راحتی هر زمینه ای را ببخشد و از مقداردهی اولیه بگذرد. در نتیجه، رفتار برنامه ملایم خواهد شد: کلاس عمومی Car (مدل رشته; // model int maxSpeed; //حداکثر سرعت، بیشینه سرعتچرخ های int; // عرض دیسک double engineVolume; //حجم موتوررنگ رشته؛ // color int yearOfIssue; // تاریخ انتشار String ownerFirstName; // نام Vlasnik صاحب رشتهLastName; // نام مستعار حاکمقیمت طولانی؛ // قیمت بولی جدید است. // nova chi ni int placesInTheSalon; // تعداد ساعات در کابین String SalonMaterial; // مواد داخلیبیمه بولی; // بیمه شدهتولید کننده رشته کشور; //کراینا ویروبنیک int trunkVolume; // پوشش تنهشتاب داخلی تا 100 کیلومتر؛ // شتاب تا 100 کیلومتر در سال در ثانیهخالی ثابت عمومی (String args) (Car bugatti = ماشین جدید ()؛ بوگاتی. رنگ = "آبی"؛ بوگاتی. شتاب تا 100 کیلومتر = 3؛ بوگاتی. حجم موتور = 6.3؛ بوگاتی. سازنده کشور = "ایتالیا"؛ بوگاتی. مالکFirstName = " آمیگو "؛ بوگاتی. yearOfIssue = 2016 roku؛ بوگاتی. بیمه = واقعی؛ بوگاتی. قیمت = 2000000؛ بوگاتی. isNew = نادرست؛ بوگاتی. مکانهاInTheSalon = 2؛ بوگاتی. maxSpeed ​​= 407؛ بوگاتی. مدلی = "Bugatti. ;System.out.println( "مدل بوگاتی ویرون. حجم موتور -"+ بوگاتی. حجم موتور + "، صندوق عقب -" + بوگاتی. trunkVolume + ", Salon of Zroblenie z"+ بوگاتی. salonMaterial + "، عرض دیسک -"+ بوگاتی. چرخ + ". Bula در سال 2018 توسط Rotsi Pan خریداری شد"+ بوگاتی. صاحب نام)؛ )) Visnovok در کنسول: مدل بوگاتی ویرون. حجم موتور - 6.3 صندوق عقب - 0، محفظه های داخلی با نول، عرض رینگ - 0. Bulka نصب شده در 2018 با نام nullخریدار شما که 2 میلیون دلار برای یک ماشین پرداخت کرده است، مشخصاً لیاقت چیزی را که آنها نامیده اند ندارد. panom nullو به طور جدی، در نتیجه، یک شیء به اشتباه ایجاد شده در برنامه ما ظاهر شد - یک ماشین با عرض رینگ 0 (یعنی بدون رینگ رانده شد)، یک صندوق عقب بزرگ، یک فضای داخلی ساخته شده از مواد ناشناخته، و همچنین به طور ناخودآگاه انتظار می رود که شما فقط می توانید ببینید، چگونه می توان چنین اشتباهی را در طول برنامه رباتیک "بازدید" کرد! شی برای یک جدید اول از همهخطاها به عنوان مثال مدل و حداکثر سیالیت نشان داده شده اند. در غیر این صورت اجازه ایجاد شی را ندهید. کنار آمدن با این وظایف آسان است توابع سازنده. بوها به دلیلی نام خود را از دست دادند. سازنده نوعی "چارچوب" برای کلاس ایجاد می کند که شی جدید کلاس مسئول آن است. بیایید به نسخه ساده‌تری از کلاس خودرو با دو فیلد بپردازیم تا کار را آسان‌تر کنیم. طبق درک ما، سازنده کلاس Car به این شکل خواهد بود: عمومی Car (مدل رشته، int maxSpeed) (this. Model = model; this. MaxSpeed ​​= maxSpeed;) و شی ایجاد شده اکنون به این شکل است: اصلی خالی ثابت عمومی (String args) (Car bugatti = ماشین جدید ("Bugatti Veyron"، 407)؛) نحوه ایجاد یک سازنده. این شبیه به روش اصلی است، اما این نوع مقداری ندارد که بچرخد. در این حالت، نام کلاس در سازنده، آن هم از حرف بزرگ، مشخص می شود. VIP ما ماشین دارد. علاوه بر این، در سازنده vikorist یک کلمه کلیدی جدید برای شما وجود دارد این. "This" در انگلیسی به معنای "این، این" است. این کلمه نشان دهنده یک شی خاص است. کد موجود در سازنده: public Car (String model, int maxSpeed) (this. Model = model; this. MaxSpeed ​​= maxSpeed;) را می توان به معنای واقعی کلمه ترجمه کرد: "مدل برای این ماشین (که در حال حاضر در حال ایجاد آن هستیم) = آرگومان مدل، کدام دستورالعمل در سازنده (مدل رشته‌ای، int maxSpeed) (این . مدل = مدل؛ این. MaxSpeed ​​= maxSpeed؛) اصلی خالی ثابت عمومی (String args) (Car bugatti = ماشین جدید ("Bugatti Veyron", 407)؛ سیستم. خارج. println(bugatti. model); System. out. println (bugatti. maxSpeed);)) به کنسول بنویسید: بوگاتی ویرون 407سازنده با موفقیت مقادیر مورد نیاز را اختصاص داد. شاید قدردان باشید که سازنده بسیار شبیه به روش اصلی است! بنابراین اینجاست: یک سازنده یک متد است، فقط کمی خاص :) بنابراین، درست مانند یک متد، ما پارامترهایی را به سازنده خود منتقل کردیم. و درست مانند فراخوانی یک متد، فراخوانی به سازنده ایجاد نمی شود مگر اینکه مشخص کنید: کلاس عمومی Car (مدل رشته ای؛ int maxSpeed؛ ماشین عمومی (مدل رشته، int maxSpeed) (این. Model = مدل؛ این. MaxSpeed = maxSpeed ​​;) public void main (String args) (Car bugatti = car new ()؛ // mercy!)) Bachish، طراح آنچه را که ما سعی در دستیابی به آن داشتیم تکمیل کرده است. حالا می توانید یک ماشین بدون سرعت یا بدون مدل بسازید! شباهت بین سازنده ها و متدها به همین جا ختم نمی شود. بنابراین درست مانند روش ها، سازنده ها نیز می توانند رونتاژواتی. متوجه شوید که 2 گربه در خانه شما زندگی می کنند. یکی از آنها را برای گربه گرفتی، و دیگری را وقتی بزرگ شدند از خیابان به خانه آوردی، و نمی دانی دقیقاً چند سرنوشت وجود داشته است. این بدان معنی است که برنامه ما باید دو نوع گربه ایجاد کند - با نام و پلک برای گربه اول و فقط با نام برای گربه دیگر. برای این منظور، سازنده قابل تصور مجدد است: کلاس عمومی Cat (نام رشته; int age; // برای اولین گربه // برای یک گربه دیگرعمومی گربه (نام رشته) (این. نام = نام؛) خالی استاتیک عمومی اصلی (آرگس رشته) (گربه بارسیک = گربه جدید ("بارسیک"، 5)؛ گربه streetCatNamedBob = گربه جدید ("باب"))) قبل از در نهایت، یک مورد دیگر را با پارامترهای "name" و "vk" فقط با نام به سازنده اضافه کردیم. این دقیقاً همان روشی است که ما روش ها را در درس های گذشته دوباره تصور کردیم. اکنون می توانیم با موفقیت نسبت به گربه ها کینه ایجاد کنیم :)

یادتان هست در ابتدای سخنرانی به ما گفتند که قبلا توسط طراحان فاسد شده اید، اما بدون توجه به چه کسی؟ درنتیجه بله. در سمت راست چیزی است که کلاس پوست در جاوا دارد: طراح پشت صحنه. او هیچ آرگومانی ندارد، اما هر بار هنگام ایجاد هر شیء از هر کلاس می‌پرسد. کلاس عمومی Cat (public static void main (String args) (Cat barsik = New Cat (;)) در نگاه اول، این قابل توجه نیست. خوب، آنها شی را ایجاد کردند و آن را ایجاد کردند، ربات طراح اینجا کجاست؟ برای رفع این مشکل، اجازه دهید فقط با دست خودمان یک سازنده خالی برای کلاس Cat بنویسیم و در وسط این عبارت را به کنسول خروجی خواهیم داد. همانطور که می بینید به این معنی است که طراح کار خود را کامل کرده است. کلاس عمومی گربه (گربه عمومی () (System. out. println ("آنها یک گربه خلق کردند!")؛) public static void main (String args) (Cat barsik = New Cat (); // محور در اینجا، با استفاده از سازنده برای دستورالعمل } } Visnovok در کنسول: آنها یک گربه خلق کردند! محور و تایید! طراح پشت لباس همیشه به صورت نامرئی در کلاس های شما حضور خواهد داشت. اما باید یک چیز دیگر در مورد او بدانید. اگر سازنده ای با آرگومان ایجاد کنید، سازنده پیش فرض کلاس را می شناسد.اثبات آن، در واقع، ما قبلاً بیشتر به دنبال آن بوده ایم. محور در این کد: کلاس عمومی Cat (نام رشته؛ سن int؛ گربه عمومی (نام رشته، سن int) (این. نام = نام؛ این. سن = سن؛) اصلی خالی ثابت عمومی (آرگس رشته) (Cat barsik = new Cat (); // mercy!)) ما نمی‌توانستیم یک گربه بدون نام و سن ایجاد کنیم، بنابراین یک سازنده برای Cat ایجاد کردیم: ردیف + شماره. سازنده پیش فرض بلافاصله پس از این znikاز کلاس بنابراین، حتما به خاطر داشته باشید: زیرا شما به تعدادی طراح در کلاس خود نیاز دارید، از جمله خالی، باید تمیز شود. به عنوان مثال، ما در حال ایجاد یک برنامه برای یک کلینیک دامپزشکی هستیم. کلینیک ما می خواهد کار خوبی انجام دهد و به گربه های بی خانمانی که نه نام و نه سن آنها را می دانیم کمک کند. بنابراین کد ما باید شبیه این باشد: کلاس عمومی Cat (نام رشته; int age; // برای گربه های خانگیگربه عمومی (نام رشته، سن int) (این. نام = نام؛ این. سن = سن؛) // برای گربه های خیابانی public Cat () () public static void main (String args) (Cat barsik = New Cat ("Barsik"، 5)؛ Cat streetCat = New Cat (;)) حال اگر به صراحت یک سازنده برای پیاده سازی نوشته باشیم، ما می توانیم گربه هایی از هر دو نوع ایجاد کنیم :) برای یک سازنده (و همچنین برای هر روش)، ترتیب آرگومان ها بسیار مهم است.در سازنده خود، آرگومان های نام و سن را در مکان ها تغییر می دهیم. کلاس عمومی گربه (نام رشته؛ سن بین‌المللی؛ گربه عمومی (سن int، نام رشته) (این. نام = نام؛ این. سن = سن؛) اصلی خالی ثابت عمومی (آرگس رشته) (گربه بارسیک = گربه جدید ("بارسیک" "، 10)؛ // رحمت!)) رحمت! سازنده به وضوح توضیح می دهد: هنگامی که یک شی Cat ایجاد می شود، شما مسئول انتقال هستید تعداد و ترتیب، به خود ترتیب. به همین دلیل است که کد ما کار نمی کند. این را به وضوح به خاطر بسپارید و هنگام ایجاد کلاس های خود به خاطر بسپارید: عمومی Cat (نام رشته، سن int) (this. Name = name; this. Age = سن؛) public Cat (int age، String name) (this. Age = age; این نام = نام؛) این دو سازنده کاملا متفاوت هستند! نحوه بیان آن در یک جمله در مورد تغذیه "نیاز به سازنده چیست؟"، می توانی بگویی: به طوری که اشیاء همیشه در حالت صحیح باشند. اگر شما یک طراح vikory هستید، تمام تغییرات شما به درستی پردازش می شود و هیچ ماشینی با سرعت 0 یا سایر اشیاء "نادرست" در برنامه وجود نخواهد داشت. vikoristanny آنها به وضوح اولین چیز برای خود برنامه نویس است. به محض اینکه معانی را قالب بندی کنید و آنها را تمرین کنید، ریزیک بزرگ به نوعی از قلم می افتد و رحم می کند. اما این اتفاق با سازنده نمی‌افتد: اگر با انتقال همه آرگومان‌های لازم به سازنده، یا با مخلوط کردن انواع آنها، کامپایلر بلافاصله یک اشتباه ایجاد می‌کند. Okremo varto در مورد کسانی که این خوب نیست که منطق برنامه خود را وسط یک سازنده قرار دهید. در سفارش شما برای چه کسی است؟ مواد و روش ها، که در آن می توانید تمام عملکردهای مورد نیاز خود را شرح دهید. بیایید ببینیم که چرا منطق سازنده ایده یکسان نیست: کلاس عمومی CarFactory (نام رشته؛ سن int؛ int carsCount؛ عمومی CarFactory (نام رشته، int سن، int carsCount) (این. نام = نام؛ این. سن = سن؛ این. carsCount = carsCount؛ System. out. println ( "بولا مهر و موم شده است" "در وسط می لرزد"+ (This. CarsCount / this. Age) + "cars in rik"); ) اصلی خالی استاتیک عمومی (String args) (CarFactory ford = new CarFactory ("Ford", 115, 50000000);)) ما یک کلاس داریم کارخانه ماشین، که یک کارخانه خودروسازی را توصیف می کند. در وسط سازنده، تمام فیلدها را مقداردهی اولیه می کنیم، و در اینجا منطق را قرار می دهیم: اطلاعات مربوط به کارخانه را در کنسول نمایش می دهیم. به نظر می رسد هیچ چیز بدی در آن وجود ندارد ، برنامه کاملاً کار کرد. Visnovok در کنسول: کارخانه خودروسازی ما فورد وان نام دارد و 115 سال پیش تاسیس شد و در این یک ساعت 50000000 خودرو ساخته شد و در اواسط سال 434782 خودرو روی رودخانه ساخته شد.اما در واقع ما در معرض تهدید اقدامات افزایش یافته قرار گرفتیم. و چنین کدهایی را می توان به راحتی به بخشش تقلیل داد. بدیهی است که اکنون ما در مورد فورد صحبت نمی کنیم، بلکه در مورد کارخانه جدید "Amigo Motors" صحبت می کنیم، که کمتر از 1000 خودرو دارد: کلاس عمومی CarFactory (نام رشته; int age; int carsCount; public CarFactory (نام رشته، int age , int carsCount) (این. نام = نام؛ این. سن = سن؛ این. carsCount = carsCount؛ سیستم. خارج. println ( "کارخانه ماشین ما نام دارد"+این نام)؛ سیستم. بیرون println( "بولا مهر و موم شده است"+این سن + "سرنوشت")؛ سیستم. بیرون println( "در این ساعت آسیب دیده است"+این carsCount + "cars"); سیستم. بیرون println( "در وسط می لرزد"+ (This. CarsCount / this. Age) + "cars in rik"); ) اصلی خالی ثابت عمومی (String args) (CarFactory ford = New CarFactory ("Amigo Motors"، 0 1000))) ورودی کنسول: کارخانه خودروسازی ما Amigo Motors Exception در موضوع "اصلی" java.lang نامیده می شود.ArithmeticException: / توسط صفر 0 سال پیش تاسیس شد در این ساعت، 1000 خودرو بر روی آن در CarFactory ساخته شد. (CarFactory.java:15) در CarFactory.main (CarFactory.java:23) فرآیند با کد خروج 1 به پایان رسیدما رسیدیم! برنامه با نوعی رحمت ناخودآگاه به پایان رسید. آیا سعی می کنید حدس بزنید دلیل چیست؟ دلیلش در منطقی است که در سازنده قرار دادیم. به طور خاص، محور در این ردیف: System. بیرون println( "در وسط می لرزد"+ (This. CarsCount / this. Age) + "cars in rik"); در اینجا تعداد ماشین آلات تولید شده در هر سن کارخانه را محاسبه و تقسیم می کنیم. و قطعات کارخانه ما جدید هستند (بنابراین 0 سنگ دارد) - در نتیجه تقسیم در 0 بیرون می آید که در ریاضیات مسدود شده است. در نتیجه برنامه با آرامش به پایان می رسد. چگونه بهای آن را پرداختیم؟تمام منطق را در متد بعدی قرار دهید و آن را به عنوان مثال printFactoryInfo() صدا بزنید. می توانید آبجکت CarFactory را به عنوان پارامتر به شما منتقل کنید. شما می توانید تمام منطق را در آنجا قرار دهید، و در همان زمان - پردازش عفوهای احتمالی, به دل ما، سنگ صفر است. به هر کدام مال خودش سازندگان برای طراحی صحیح شی مورد نیاز هستند.ما روش هایی برای منطق تجاری داریم. مخلوط کردن یکی با دیگری خوب نیست. محور یک دسته قهوه ای است، می توانید در مورد طراحان بیشتر بخوانید: