در حال بارگذاری...

سازنده در Java

یک کلاس Box در Box.java بنویسید با فیلد int به نام size و سازندهٔ Box(int n) که size = n; را انجام می‌دهد. در Hall.java یک box بسازید با Box b = new Box(4);، بعد b.size را چاپ کنید. هر دو فایل را کامپایل کنید و java Hall را اجرا کنید. صفحه باید یک خط نشان دهد: 4. عددی که به new می‌دهید به سازنده می‌رسد و سازنده آن را روی شیء ذخیره می‌کند قبل از اینکه main ادامه دهد. گذاشتن فیلد در زمان ساخت — داخل سازنده — کار این صفحه است.

متدی که وقتی new می‌سازد اجرا می‌شود

سازنده هم‌نام کلاس است. نه void دارد و نه نوع برگشتی دیگری. وقتی main می‌نویسد new Box(4)، Java شیء را می‌سازد و همان سازنده را با 4 به‌عنوان n اجرا می‌کند. بعد از تمام‌شدن سازنده، متغیر شیء آماده‌شده را نگه می‌دارد. کل کار این صفحه همین است: مقدار را به new بدهید، بگذارید سازنده روی فیلد ذخیره کند، بعد فیلد را چاپ کنید تا ببینید ذخیره درست بوده است.
اول Box.java را بسازید. خط public class برابر public class Box است. نام کلاس قدیمی Cup یا Chip را اینجا نگه ندارید. داخل آکولاد int size; را اعلام کنید. بعد سازنده را بنویسید: Box(int n) { size = n; }. روی این صفحه نام پارامتر را با size یکی نگیرید تا انتساب بدون واژهٔ this روشن باشد. در Box.java هیچ main نیست. قبل از کامپایل ذخیره کنید.
خط فیلد به‌تنهایی 4 را داخل شیء نمی‌گذارد. بدنهٔ سازنده وقتی new صدا می‌زند این کار را می‌کند. اگر سازنده را ننویسید و فقط فیلد را اعلام کنید، بعداً new Box(4) جور نمی‌شود و javac از فراخوانی شکایت می‌کند. هر دو قطعه را در Box.java نگه دارید: فیلد و سازنده‌ای که داخلش می‌نویسد.

Box with constructor

java
public class Box {
    int size;

    Box(int n) {
        size = n;
    }
}

Hall عدد ۴ را به new Box می‌دهد

در همان پوشه Hall.java بسازید. خط public class آن public class Hall است. داخل main بنویسید Box b = new Box(4); بعد System.out.println(b.size);. آرگومان 4 به پارامتر سازندهٔ n می‌رود. روی این صفحه به خط جداگانهٔ b.size = 4; نیاز ندارید — سازنده خودش مقدار را ذخیره کرده است. خط چاپ هست تا بدون حدس ببینید سازنده چه کرده است.
Hall را کلاسی نگه دارید که main دارد. برای این درس main را داخل Box نگذارید. شکل دو فایل مثل صفحات اشیاء و فیلد است: یک فایل نوع را تعریف می‌کند، فایل دیگر می‌سازد و استفاده می‌کند. اگر نام فایل را عوض کنید ولی خط قدیمی public class Shelf بماند، javac تا وقتی نام‌ها دوباره جور نشوند قبول نمی‌کند.

Hall builds one box

java
public class Hall {
    public static void main(String[] args) {
        Box b = new Box(4);
        System.out.println(b.size);
    }
}

از پوشه‌ای که هر دو فایل آنجاست، javac Box.java Hall.java را اجرا کنید. می‌توانید وقتی هر دو کامل‌اند اول Box.java و بعد Hall.java را کامپایل کنید. وقتی پرانتز و آکولاد و نقطه‌ویرگول‌ها جور باشند، javac خودش خطی نمی‌نویسد. بعد java Hall را اجرا کنید — نه java Hall.java، و نه java Box. پسوند .java را از فرمان اجرا بردارید. کلاسی را شروع کنید که main دارد. همین فرمان‌ها در Windows و macOS کار می‌کند.
برنامه باید یک خط چاپ کند و بایستد: 4. منتظر تایپ شما نمی‌ماند. اگر ترمینال منتظر ورودی صفحه‌کلید ماند، هنوز صدای nextLine از تمرین قدیمی در فایلی مانده است. آن را پاک کنید و new Box(4) به‌همراه چاپ را در Hall نگه دارید، با سازنده در Box. نشانگر منتظر، مشکل سازنده نیست؛ کد ورودی قدیمی در جای اشتباه است.
اجرا را یک‌بار ببینید. Java از Hall.main شروع می‌کند. عبارت new Box(4) یک Box می‌سازد و Box(int n) را با n برابر 4 صدا می‌زند. بدنه size = n می‌نویسد، پس size همان شیء 4 می‌شود. بعد main مقدار b.size را چاپ می‌کند و صفحه 4 نشان می‌دهد. چیز دیگری نباید چاپ شود. اگر ok یا 3 یا ماندهٔ Cup دیدید، برنامهٔ Hall این صفحه را اجرا نمی‌کنید.
اگر new Box() را بدون آرگومان بنویسید در حالی که تنها سازنده به int نیاز دارد، javac رد می‌کند. فراخوانی را با فهرست پارامتر سازنده جور کنید. اگر قبل از نام سازنده void بگذارید، متد معمولی می‌شود نه سازنده، و new Box(4) آن بدنه را طوری که این صفحه می‌خواهد اجرا نمی‌کند. سربرگ باید شبیه Box(int n) باشد، نه void Box(int n)، و نه static int Box(int n).

مقایسه با مقداردهی بعد از new

روی صفحهٔ فیلد بعد از new Cup() می‌نوشتید c.fill = 3;. آن هنوز کار می‌کند. این صفحه ذخیره را به داخل سازنده می‌برد تا مقدار هنگام ساخت شیء گذاشته شود. دموی ماندهٔ Cup با c.fill = 3; درس دیگری است. برای این صفحه Box و Hall و new Box(4) را نگه دارید. اگر Hall هنوز c.fill = 3; دارد و در این پوشه کلاس Cup نیست، آن خط را بردارید. کامپایلر خودش Cup نمی‌سازد.
چاپ خود b با System.out.println(b); یک 4 تمیز نشان نمی‌دهد. برای دیدن عدد ذخیره‌شده b.size را چاپ کنید. ارجاع شیء به‌تنهایی مقدار فیلد نیست. این الگو را روی صفحهٔ فیلد دیدید؛ اینجا هم وقتی کار سازنده را چک می‌کنید همان را نگه دارید.
در برنامه‌های دیگر هنوز می‌توانید بعد از new فیلد را مقدار بدهید. این درس مسیر سازنده را انتخاب می‌کند تا اولین مقدار مفید در زمان ساخت برسد. روی این صفحه هر دو سبک را در یک دموی Hall قاطی نکنید. یک مسیر روشن کافی است: آرگومان به new، ذخیره در سازنده، چاپ فیلد.

دو box، دو size

هر new Box(...) سازنده را دوباره برای یک شیء جدا اجرا می‌کند. می‌توانید بنویسید Box a = new Box(2); و Box b = new Box(9);، بعد هر دو فیلد size را چاپ کنید. فراخوانی اول 2 را روی یک شیء می‌گذارد. فراخوانی دوم 9 را روی شیء دیگر می‌گذارد. دو شیء یک شکاف size مشترک ندارند.

Hall builds two boxes

java
public class Hall {
    public static void main(String[] args) {
        Box a = new Box(2);
        Box b = new Box(9);
        System.out.println(a.size);
        System.out.println(b.size);
    }
}

دوباره کامپایل و اجرا کنید: javac Box.java Hall.java، بعد java Hall. صفحه باید روی یک خط 2 و روی خط بعد 9 نشان دهد. هر فراخوانی سازنده آرگومان خودش را روی شیء خودش ذخیره کرده است. نوشتن Box b = a; شیء دوم نمی‌سازد — وقتی دو size می‌خواهید دو بار new Box(...) بزنید. کپی ارجاع با دو بار صدا زدن سازنده یکی نیست.
اگر هر دو خط یک عدد نشان دادند، چک کنید هر new آرگومان متفاوتی دارد و a.size و b.size را به همان ترتیب چاپ می‌کنید. اگر javac روی new دوم ایستاد، پرانتز جاافتاده یا نام کلاس اشتباه از فایل قدیمی را ببینید. غلط املای کوچک در فراخوانی دوم وقتی خط اول را کپی می‌کنید و آرگومان را عوض نمی‌کنید رایج است.

چه چیزی برای this می‌ماند

این صفحه با نام‌های متفاوت size = n; را به‌کار می‌برد. صفحهٔ بعدی — this — نشان می‌دهد وقتی نام‌ها برخورد کنند چطور از فیلد خود شیء حرف بزنید. اینجا با نام روشن پارامتر n بمانید. روی این صفحه this.size نسازید مگر از قبل بلد باشید؛ هدف درس فراخوانی سازنده از new است. واژهٔ this موضوع بعدی است، نه شرط ذخیرهٔ n داخل size امروز.
اگر هنگام کامپایل Hall.java، javac کلاس Box را پیدا نکرد، چک کنید Box.java در همان پوشه است و خط کلاس public class Box است. اگر صفحه 0 نشان داد، شاید سازنده انتساب ندارد، یا main هنوز شکل بدون آرگومان دارد که size را هیچ‌وقت نمی‌گذارد — Box(int n) { size = n; } و new Box(4) را نگه دارید. صفر روی صفحه معمولاً یعنی فیلد روی پیش‌فرض مانده چون ذخیره اجرا نشده است.
وقتی پوشه هنوز Cup.java یا Shelf.java از صفحهٔ فیلد دارد، یا دست نزنید یا فقط اگر فرمان کامپایل را گیج می‌کنند پاکشان کنید. Shelf قدیمی که هنوز c.fill می‌گذارد را کامپایل نکنید و انتظار صفحهٔ این درس را نداشته باشید. بعد از کامپایل جفت Box و Hall این درس، java Hall را اجرا کنید.

قبل از this

می‌توانید int size; را اعلام کنید، Box(int n) { size = n; } بنویسید، و از Hall با Box b = new Box(4); بسازید. هر دو فایل را کامپایل کنید و java Hall را اجرا کنید. صفحه 4 نشان می‌دهد. سازنده وقتی new شیء را می‌سازد اجرا می‌شود. عدد را در زمان ساخت دادید، سازنده روی فیلد ذخیره کرد، و چاپ ذخیره را ثابت کرد. صفحهٔ بعدی this است، جایی که راه دیگری برای نام‌بردن فیلدهای خود شیء داخل متدها و سازنده‌ها می‌آموزید.
سربرگ سازنده را بدون void نگه دارید. آرگومان را روی new نگه دارید. چاپ را روی b.size نگه دارید. این سه عادت نقطهٔ کنترل این صفحه است قبل از رفتن جلو.

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
5
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود