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

static در Java

یک کلاس Tag در Tag.java بنویسید با متد static به شکل static void ping() که ok چاپ می‌کند. در Yard.java از main صدا بزنید Tag.ping(); و روی این صفحه new Tag() ننویسید. هر دو فایل را کامپایل کنید و java Yard را اجرا کنید. صفحه باید یک خط نشان دهد: ok. متد مال نام کلاس Tag است، نه مال یک متغیر شیء. صدا زدن از راه نام کلاس کار این صفحه است.

متدی روی نام کلاس

روی صفحهٔ متدهای نمونه بعد از new Jar(3) می‌نوشتید j.bump(). آن فراخوانی به شیء نیاز داشت. متد static نیاز ندارد. می‌نویسید Tag.ping(); با نام کلاس. Java آن متد را بدون ساختن شیء Tag اول روی این صفحه اجرا می‌کند.
اول Tag.java را بسازید. خط public class برابر public class Tag است. نام کلاس قدیمی Jar یا Tin را اینجا نگه ندارید. داخل آکولاد یک متد بنویسید:
static void ping() { System.out.println("ok"); }
در دموی اول فیلد و سازنده نیست. در Tag.java هیچ main نیست. قبل از کامپایل ذخیره کنید. واژهٔ static در سربرگ متد قبل از void می‌نشیند. بدون static، بعداً فراخوانی Tag.ping(); از Yard با شکل متد نمونهٔ این صفحه جور نمی‌شود.

Tag with static ping

java
public class Tag {
    static void ping() {
        System.out.println("ok");
    }
}

Yard صدا می‌زند Tag.ping

در همان پوشه Yard.java بسازید. خط public class آن public class Yard است. داخل main یک فراخوانی بنویسید: Tag.ping();. روی این صفحه Tag t = new Tag(); ننویسید. مسیر درس را t.ping(); نگذارید. نام کلاس قبل از نقطه کافی است.
Yard را کلاسی نگه دارید که main دارد. برای این درس main را داخل Tag نگذارید. اگر فایل ماندهٔ Desk از صفحهٔ متدهای نمونه هنوز در پوشه است، برای این درس java Desk را اجرا نکنید — بعد از کامپایل Tag.java و Yard.java فرمان java Yard را بزنید.

Yard calls Tag.ping

java
public class Yard {
    public static void main(String[] args) {
        Tag.ping();
    }
}

از پوشه‌ای که هر دو فایل آنجاست، javac Tag.java Yard.java را اجرا کنید. می‌توانید وقتی هر دو کامل‌اند اول Tag.java و بعد Yard.java را کامپایل کنید. وقتی پرانتز و آکولاد و نقطه‌ویرگول‌ها جور باشند، javac خودش خطی نمی‌نویسد. بعد java Yard را اجرا کنید — نه java Yard.java، و نه java Tag. پسوند .java را از فرمان اجرا بردارید. کلاسی را شروع کنید که main دارد. همین فرمان‌ها در Windows و macOS کار می‌کند.
برنامه باید یک خط چاپ کند و بایستد: ok. منتظر تایپ شما نمی‌ماند. اگر ترمینال منتظر ورودی صفحه‌کلید ماند، هنوز صدای nextLine از تمرین قدیمی در فایلی مانده است. آن را پاک کنید و Tag.ping(); را در Yard نگه دارید، با static void ping در Tag.
اجرا را یک‌بار ببینید. Java از Yard.main شروع می‌کند. فراخوانی Tag.ping() متد static روی کلاس Tag را پیدا می‌کند و بدنه را اجرا می‌کند. بدنه ok چاپ می‌کند. شیئی ساخته نشد. صفحه ok نشان می‌دهد. چیز دیگری نباید چاپ شود. اگر 4 یا 5 دیدید، هنوز برنامهٔ قدیمی Desk از درس bump را اجرا می‌کنید.
اگر داخل Yard.main بنویسید ping(); بدون Tag. جلو، در این شکل javac رد می‌کند. متد static هنوز به نام کلاسش نیاز دارد (یا سبک import دقیقی که هنوز به‌کار نمی‌برید). Tag.ping(); را نگه دارید. اگر void را بدون static بگذارید، آن‌وقت Tag.ping(); برای متد نمونه نوع فراخوانی اشتباه است — static را برگردانید. سربرگ باید شبیه static void ping() باشد، نه فقط void ping()، و نه static int ping() برای این دموی چاپ.

Tag.ping و j.bump کنار هم

یک جدول کوتاه دو شکل فراخوانی را روشن نگه می‌دارد.

📊 static vs instance call

فراخوانی اول به شیء نیاز دارد؟
Tag.ping(); نه — نام کلاس کافی است
j.bump(); بله — بعد از Jar j = new Jar(3);
static void ping() متد روی کلاس
void bump() متد روی هر شیء
جدول فقط یادآوری است. خطی که روی این صفحه نگه می‌دارید Tag.ping(); در Yard است، با static void ping() در Tag.

مقایسه با متدهای نمونه

روی صفحهٔ متدهای نمونه، j.bump() مقدار fill یک jar را عوض می‌کرد. آن هنوز کار می‌کند. این صفحه فیلدی عوض نمی‌کند. فقط از یک متد static مقدار ok چاپ می‌کند تا فراخوانی با نام کلاس را ببینید. دموی ماندهٔ Jar j = new Jar(3); j.bump(); درس دیگری است. برای این صفحه Tag و Yard و Tag.ping(); را نگه دارید.
در روزهای دیگر هنوز می‌توانید شیء بسازید. این درس عمداً مسیر static را انتخاب می‌کند. روی این صفحه در یک دموی Yard، j.bump() و Tag.ping() را قاطی نکنید. یک مسیر روشن کافی است: static روی متد، نام کلاس قبل از فراخوانی، چاپ ok. وقتی بعداً هر دو سبک را در یک برنامه لازم دارید، هر فراخوانی را صادق نگه دارید — شیء قبل از متد نمونه، نام کلاس قبل از متد static — تا خواننده ببیند کدام نوع را خواستید.

برای این فراخوانی به new Tag نیاز ندارید

چون ping از نوع static است، Yard قبل از فراخوانی شیء Tag تخصیص نمی‌دهد. نوشتن Tag t = new Tag(); و بعد t.ping(); در بسیاری از چیدمان‌ها برای متد static ممکن است کامپایل شود، اما شکل درس این صفحه نیست. فقط با Tag.ping(); بمانید. اگر صفحه 4 یا 5 نشان داد، هنوز دموی قدیمی Desk bump اجرا می‌شود — به java Yard بروید.
اگر javac بگوید نماد ping روی Tag پیدا نشد، چک کنید سربرگ متد static دارد و هر دو فایل در یک پوشه‌اند. اگر java Tag اجرا شد و کار مفیدی نکرد، کلاس اشتباه را شروع کرده‌اید — Yard را شروع کنید که main دارد.

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

این صفحه یک کلاس public و یک متد static با دید بسته در همان پوشه به‌کار می‌برد. صفحهٔ بعدی — access — واژه‌هایی مثل public و private روی اعضا نشان می‌دهد. اینجا با فراخوانی static بمانید. روی این صفحه private static نسازید مگر از قبل بلد باشید؛ هدف درس Tag.ping(); با static void ping() است.
وقتی پوشه هنوز Jar.java یا Desk.java دارد، یا دست نزنید یا فقط اگر فرمان کامپایل را گیج می‌کنند پاکشان کنید. بعد از کامپایل جفت Tag و Yard این درس، java Yard را اجرا کنید.

قبل از access

می‌توانید در Tag بنویسید static void ping() { System.out.println("ok"); } و از Yard بدون شیء صدا بزنید Tag.ping();. هر دو فایل را کامپایل کنید و java Yard را اجرا کنید. صفحه ok نشان می‌دهد. متد static روی نام کلاس اجرا شد. صفحهٔ بعدی access است، جایی که کنترل می‌کنید کدام نام‌ها را کلاس‌های دیگر ببینند.
static را روی متد نگه دارید. نام کلاس را قبل از فراخوانی نگه دارید. main را در Yard نگه دارید. این سه عادت نقطهٔ کنترل این صفحه است قبل از رفتن جلو.

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

آماده شروع

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

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

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

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

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