ورود

View Full Version : تابع Main



suraty
جمعه 16 آبان 1393, 16:51 عصر
سلام.
من تازه با نرم افزار NetBeans آشنا شدم. یه سوالی داشتم. دلیل اینکه تابع Main در کلاس اصلی به صورت استاتیک تعریف میشه چیه.
public static void main(String[] args) {
این تابع موقع اجرا توسط چی و کجا فراخوانی میشه که باید استاتیک باشه؟
کجاست که نمیشه در اون یک شی جدید از این کلاس اصلی ساخت و تابع مین رو فراخوانی کرد؟

محمد فدوی
جمعه 16 آبان 1393, 21:08 عصر
این تابع مستقیما توسط JVM فراخوانی میشه و باید static باشه چون نیازی نیست که static نباشه.
در زبان‌های برنامه‌نویسی شیء گرای ناکامل (مثل ++C) این متد اصلا توی هیچ کلاسی قرار نمیگیره که بخواد static باشه یا نباشه. (البته درستش اینه که اینجا بش بگیم تابع. یه تفاوتای کوچیکی دارن)
اما توی زبان‌های برنامه‌نویسی شیءگرای کامل مثل Java (و #C) این متد به این صورت تعریف میشه.

cups_of_java
جمعه 16 آبان 1393, 21:13 عصر
می تونید هم اینطوری بگید اصن باید استاتیک باشه چون زمانی که هیچ کدی هنوز اجرا نشده و برنامه شما میخواد توسط ماشین مجازی جاوا تازه بووت و اجرا بشه هیچ شی ای درست نشده که تابع مین رو بشه داخل اون فرض کرد.



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

suraty
شنبه 17 آبان 1393, 10:06 صبح
منظورم اشاره به خاصیت متد استاتیک است که بدون احتیاج به ساخت شی جدید و با فراخوانی توسط نام کلاس می توان تابع را صدا زد. چرا جاوا در JVM یک شی جدید از کلاس اصلی نمی سازد و بعد متد مین که استاتیک هم نباشد را روی آن فراخوانی کند؟

محمد فدوی
شنبه 17 آبان 1393, 11:24 صبح
منظورم اشاره به خاصیت متد استاتیک است که بدون احتیاج به ساخت شی جدید و با فراخوانی توسط نام کلاس می توان تابع را صدا زد. چرا جاوا در JVM یک شی جدید از کلاس اصلی نمی سازد و بعد متد مین که استاتیک هم نباشد را روی آن فراخوانی کند؟

اولین مطلب اینه که اینا همه قرارداده! بله میشه در مورد خیلی چیزا سؤال پرسید. چرا اسمش باید main باشه؟ چرا start نباشه؟ اصلا چرا یه متد باشه؟ میتونست سازنده‌ی یه کلاس باشه... بالاخره این روش چیزیه از زمان بوجود اومدن زبان‌های ساخت‌یافته رواج پیدا کرده و در زبان‌های معروفی مثل C، VB6، CSharp و VB.net کمابیش یکسان دیده میشه. جاوا هم قرار نبوده در دنیای برنامه‌نویسی طرحی نو در اندازه! خصوصا که یکی از افتخارات جاوا اینه که بصورت C-like (مشابه زبان C) هست. در مورد Entry Point میتونی اینجا (http://en.wikipedia.org/wiki/Entry_point) بخونی.

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

مطلب بعد، همونطور که cups_of_java عزیز گفتن، تابع main درست در اولین نقطه‌ی شروع برنامه فراخوانی میشه. هر شیء در زیان‌های برنامه‌نویسی شیءگرای کامل نیاز به یه بلوک والد داره و حوزه‌ی تعریفش هم از روی همین بلوک تعریف میشه. حالا که برنامه میخواد شروع بشه، اون شیء کذایی که شما میفرمایید باید چه حوزه‌ی تعریفی داشته باشه؟ یادمون باشه تابع main بصورت Native فراخوانی میشه.

البته پیشنهاد شروع برنامه با یک کلاس توی خیلی از فریمورک‌ها (حتی خود جاوا) دیده میشه. اما معمولا معینیش این نیست که متد/تابع main حذف شده. معنیش اینه که اون فریمورک خودش تابع main رو برای ما نوشته و با اینکار کمی به ما کمک کرده.

cups_of_java
شنبه 17 آبان 1393, 11:40 صبح
چرا جاوا در JVM یک شی جدید از کلاس اصلی نمی سازد و بعد متد مین که استاتیک هم نباشد را روی آن فراخوانی کند؟

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

naghme1370
یک شنبه 12 اسفند 1397, 23:17 عصر
وقتی در تعریف یک متد کلمه static را بکار میبریم بدین معناست که میتوانیم آن متد را بدون اینکه از کلاس اش نمونه ای ساخته شود، فراخوانی کنیم. و فقط لازم است نام کلاسی که در آن قرار دارد را بدانیم.

در واقع با هر بار اجرای برنامه اولین متدی که فراخوانی میشود(بصورت خودکار و با کلیک بر روی دکمه استارت نه در قسمت کدنویسی!) متد main است....(چون متد main نطقه آغاز هر برنامه ای است) به همین دلیل بصورت static تعریف میشود که ما بتوانیم بدون نمونه سازی از کلاس اصلی(کلاسی که متد main در آن تعریف شده است.) آن متد را فراخوانی کنیم.