سؤال

توقيع الأسلوب لجافا رئيسي() الطريقة هي:

public static void main(String[] args){
    ...
}

هل هناك سبب لأن تكون هذه الطريقة ثابتة؟

هل كانت مفيدة؟

المحلول

الطريقة ثابتة لأنه بخلاف ذلك سيكون هناك غموض:الذي ينبغي أن يسمى منشئ؟خاصة إذا كان صفك يبدو كالتالي:

public class JavaClass{
  protected JavaClass(int x){}
  public void main(String[] args){
  }
}

يجب أن يتصل JVM new JavaClass(int)؟ماذا ينبغي أن تمر ل x?

إذا لم يكن الأمر كذلك، فيجب على JVM إنشاء مثيل JavaClass دون تشغيل أي طريقة منشئ؟أعتقد أنه لا ينبغي ذلك، لأن ذلك سيؤدي إلى حالة خاصة لفصلك بأكمله - في بعض الأحيان يكون لديك مثيل لم تتم تهيئته، وعليك التحقق منه بكل طريقة يمكن استدعاؤها.

هناك عدد كبير جدًا من حالات الحافة والغموض التي تجعل من المنطقي أن يضطر JVM إلى إنشاء مثيل لفئة قبل استدعاء نقطة الإدخال.لهذا main ثابت.

ليس لدي أي فكرة عن السبب main يتم وضع علامة دائما public رغم ذلك.

نصائح أخرى

هذه مجرد اتفاقية.في الواقع، حتى الاسم main() والوسائط التي تم تمريرها هي اصطلاحية بحتة.

عندما تقوم بتشغيل java.exe (أو javaw.exe على نظام التشغيل Windows)، فإن ما يحدث بالفعل هو بضع استدعاءات لواجهة Java الأصلية (JNI).تقوم هذه الاستدعاءات بتحميل ملف DLL الذي هو بالفعل JVM (هذا صحيح - java.exe ليس JVM).JNI هي الأداة التي نستخدمها عندما يتعين علينا الربط بين عالم الآلة الافتراضية وعالم C وC++ وما إلى ذلك...والعكس صحيح أيضًا - ليس من الممكن (على الأقل على حد علمي) تشغيل JVM دون استخدام JNI.

في الأساس، java.exe هو تطبيق C بسيط للغاية يقوم بتوزيع سطر الأوامر، وإنشاء مصفوفة سلسلة جديدة في JVM للاحتفاظ بهذه الوسائط، وتوزيع اسم الفئة الذي حددته على أنه يحتوي على main()، واستخدام استدعاءات JNI للعثور على main() نفسها، ثم تستدعي الطريقة main()، وتمرير مصفوفة السلسلة المنشأة حديثًا كمعلمة.يشبه هذا إلى حد كبير ما تفعله عند استخدام الانعكاس من Java - فهو يستخدم فقط استدعاءات الوظائف الأصلية ذات الأسماء المربكة بدلاً من ذلك.

سيكون من القانوني تمامًا أن تكتب نسختك الخاصة من java.exe (يتم توزيع المصدر مع JDK) وتجعله يفعل شيئًا مختلفًا تمامًا.في الواقع، هذا بالضبط ما نفعله مع جميع تطبيقاتنا المستندة إلى Java.

كل تطبيق من تطبيقات Java لديه مشغل خاص به.نحن نقوم بذلك في المقام الأول حتى نحصل على الرمز الخاص بنا واسم العملية، ولكنه أصبح مفيدًا في مواقف أخرى حيث نريد القيام بشيء ما إلى جانب استدعاء main() العادي لبدء الأمور (على سبيل المثال، في إحدى الحالات نقوم بذلك قابلية التشغيل المتداخل لـ COM، ونقوم بالفعل بتمرير مقبض COM إلى main() بدلاً من مصفوفة سلسلة).

لذلك، طويلة وقصيرة:السبب في كونه ثابتًا هو أن هذا مناسب.سبب تسميتها بـ "main" هو أنها يجب أن تكون شيئًا ما، وmain() هو ما فعلوه في أيام لغة C القديمة (وفي تلك الأيام، كان اسم الوظيفة كان مهم).أفترض أن java.exe كان من الممكن أن يسمح لك فقط بتحديد اسم طريقة رئيسية مؤهلة بالكامل، بدلاً من الفئة فقط (java com.mycompany.Foo.someSpecialMain) - ولكن هذا يزيد من صعوبة اكتشاف IDEs تلقائيًا لـ ' فئات قابلة للتشغيل في المشروع.

ال main() طريقة في C++, C# و Java ثابتة
لأنه يمكن بعد ذلك استدعاؤها بواسطة محرك وقت التشغيل بدون الاضطرار إلى إنشاء مثيل لأي كائنات ثم الكود الموجود في نص main() سوف تفعل بقية.

لماذا الفراغ العام الثابت الرئيسي (String[] args)؟

هذه هي الطريقة التي تم بها تصميم لغة Java وتصميم وكتابة Java Virtual Machine.

مواصفات لغة أوراكل جافا

الدفع الفصل 12 التنفيذ - القسم 12.1.4 استدعاء Test.main:

أخيرًا، بعد الانتهاء من تهيئة اختبار الفصل (الذي قد يحدث خلاله تحميل وربط وتهيئة أخرى)، يتم استدعاء الطريقة الرئيسية للاختبار.

يجب أن يتم الإعلان عن الطريقة الرئيسية بأنها عامة وثابتة وباطلة.يجب أن يقبل وسيطة واحدة عبارة عن مجموعة من السلاسل.يمكن الإعلان عن هذه الطريقة أيضًا

public static void main(String[] args)

أو

public static void main(String... args)

مواصفات الجهاز الظاهري لأوراكل جافا

الدفع الفصل الثاني مفاهيم لغة برمجة جافا - القسم 2.17 التنفيذ:

يبدأ جهاز Java الظاهري التنفيذ عن طريق استدعاء الطريقة الرئيسية لبعض الفئات المحددة وتمرير وسيطة واحدة إليها، وهي عبارة عن مجموعة من السلاسل.يؤدي هذا إلى تحميل الفئة المحددة (§2.17.2)، وربطها (§2.17.3) بالأنواع الأخرى التي تستخدمها، وتهيئتها (§2.17.4).يجب أن يتم الإعلان عن الطريقة الرئيسية بأنها عامة وثابتة وباطلة.

مصدر أوراكل OpenJDK

قم بتنزيل واستخراج الجرة المصدر ومعرفة كيفية كتابة JVM، راجع ذلك ../launcher/java.c, ، والذي يحتوي على رمز C الأصلي خلف الأمر java [-options] class [args...]:

/*
 * Get the application's main class.
 * ... ...
 */
if (jarfile != 0) {
    mainClassName = GetMainClassName(env, jarfile);

... ...

    mainClass = LoadClass(env, classname);
    if(mainClass == NULL) { /* exception occured */

... ...

/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                                   "([Ljava/lang/String;)V");

... ...

{    /* Make sure the main method is public */
    jint mods;
    jmethodID mid;
    jobject obj = (*env)->ToReflectedMethod(env, mainClass,
                                            mainID, JNI_TRUE);

... ...

/* Build argument array */
mainArgs = NewPlatformStringArray(env, argv, argc);
if (mainArgs == NULL) {
    ReportExceptionDescription(env);
    goto leave;
}

/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

... ...

دعونا نتظاهر ببساطة بذلك static لن تكون هناك حاجة كنقطة دخول التطبيق.

ستبدو فئة التطبيق بعد ذلك كما يلي:

class MyApplication {
    public MyApplication(){
        // Some init code here
    }
    public void main(String[] args){
        // real application code here
    }
}

الفرق بين كود البناء و main الطريقة ضرورية لأنه في OO يجب أن يتأكد المُنشئ فقط من وجود المثيل تمت تهيئته على وجه صحيح.بعد التهيئة، يمكن استخدام المثيل "للخدمة" المقصودة.إن وضع رمز التطبيق الكامل في المنشئ من شأنه أن يفسد ذلك.

لذلك فإن هذا النهج يجبر ثلاثة عقود مختلفة عند الطلب:

  • هناك يجب يكون المنشئ الافتراضي.وإلا فإن JVM لن يعرف أي مُنشئ يجب الاتصال به وما هي المعلمات التي يجب توفيرها.
  • هناك يجب يكون أ main طريقة1.حسنًا، هذا ليس مفاجئًا.
  • الفصل لا يجب يكون abstract.وإلا فلن يتمكن JVM من إنشاء مثيل له.

ال static النهج من ناحية أخرى يتطلب فقط واحد عقد:

  • يجب أن يكون هناك أ main طريقة1.

هنا لا abstract ولا يهم منشئين متعددين.

منذ أن تم تصميم Java لتكون لغة بسيطة للمستخدم ليس من المستغرب أيضًا أن يتم تصميم نقطة دخول التطبيق بطريقة بسيطة باستخدام واحد العقد وليس بطريقة معقدة باستخدام ثلاثة عقود مستقلة وهشة.

يرجى الملاحظة:هذه الحجة لا حول البساطة داخل JVM أو داخل JRE.هذه الحجة تدور حول البساطة بالنسبة لـ مستخدم.


1هنا يعتبر التوقيع الكامل بمثابة عقد واحد فقط.

إذا لم يكن الأمر كذلك، فما هو المنشئ الذي يجب استخدامه إذا كان هناك أكثر من واحد؟

يوجد المزيد من المعلومات حول تهيئة برامج Java وتنفيذها المتوفرة في مواصفات لغة جافا.

قبل أن يتم استدعاء الأسلوب الرئيسي، لا يتم إنشاء مثيل للكائنات.وجود الكلمة الأساسية الثابتة يعني أنه يمكن استدعاء الطريقة دون إنشاء أي كائنات أولاً.

لأنه بخلاف ذلك، فإنه سيحتاج إلى مثيل للكائن ليتم تنفيذه.ولكن يجب استدعاؤه من البداية، دون إنشاء الكائن أولاً، نظرًا لأن مهمة الدالة main() (bootstrap) عادةً هي تحليل الوسائط وإنشاء الكائن، عادةً باستخدام هذه الوسائط/معلمات البرنامج.

ما معنى public static void main(String args[])?

  1. public هو محدد وصول مما يعني أنه يمكن لأي شخص الوصول إليه/استدعاءه مثل JVM(Java Virtual Machine.
  2. static يسمح main() ليتم استدعاؤه قبل إنشاء كائن من الفئة.وهذا ضروري لأن main() يتم استدعاؤه بواسطة JVM قبل إنشاء أي كائن.نظرًا لأنه ثابت، فيمكن استدعاؤه مباشرة عبر الفصل.

    class demo {    
        private int length;
        private static int breadth;
        void output(){
            length=5;
            System.out.println(length);
        }
    
        static void staticOutput(){
            breadth=10; 
            System.out.println(breadth);
        }
    
        public static  void main(String args[]){
            demo d1=new demo();
            d1.output(); // Note here output() function is not static so here
            // we need to create object
            staticOutput(); // Note here staticOutput() function is  static so here
            // we needn't to create object Similar is the case with main
            /* Although:
            demo.staticOutput();  Works fine
            d1.staticOutput();  Works fine */
        }
    }
    

    وبالمثل، فإننا نستخدم الثبات في بعض الأحيان للطرق التي يحددها المستخدم، لذا لا نحتاج إلى إنشاء كائنات.

  3. void يشير إلى أن main() الطريقة التي يتم الإعلان عنها لا تُرجع قيمة.

  4. String[] args يحدد المعلمة الوحيدة في main() طريقة.

    args - معلمة تحتوي على مجموعة من الكائنات من نوع الفئة String.

اسمحوا لي أن أشرح هذه الأشياء بطريقة أبسط بكثير:

public static void main(String args[])

تبدأ جميع تطبيقات Java، باستثناء التطبيقات الصغيرة، في تنفيذها من main().

الكلمة الرئيسية public هو معدّل وصول يسمح باستدعاء العضو من خارج الفصل.

static يستخدم لأنه يسمح main() ليتم استدعاؤها دون الحاجة إلى إنشاء مثيل معين من تلك الفئة.

void يدل علي main() لا يرجع أي قيمة.

يتم إنشاء التطبيقات الصغيرة والمتوسطة والخوادم والفاصوليا بمختلف أنواعها ومن ثم يتم استدعاء أساليب دورة الحياة عليها.إن استدعاء main هو كل ما يتم فعله للفئة الرئيسية، لذلك ليست هناك حاجة للاحتفاظ بالحالة في كائن يتم استدعاؤه عدة مرات.من الطبيعي جدًا تثبيت main على فئة أخرى (على الرغم من أنها ليست فكرة رائعة)، الأمر الذي قد يعيق استخدام الفئة لإنشاء الكائن الرئيسي.

إنها مجرد اتفاقية، ولكنها ربما أكثر ملاءمة من البديل.باستخدام المفتاح الثابت، كل ما تحتاج إلى معرفته لاستدعاء برنامج Java هو اسم الفصل وموقعه.إذا لم تكن ثابتة، فسيتعين عليك أيضًا معرفة كيفية إنشاء مثيل لتلك الفئة، أو تتطلب أن يكون للفئة مُنشئ فارغ.

إذا لم تكن الطريقة main ثابتة، فستحتاج إلى إنشاء كائن من فئتك الرئيسية من خارج البرنامج.كيف تريد أن تفعل ذلك؟

عند تنفيذ Java Virtual Machine (JVM) باستخدام ملف java يأمر،

java ClassName argument1 argument2 ...

عندما تقوم بتنفيذ تطبيقك، فإنك تحدد اسم فئته كوسيطة لأمر Java، كما هو مذكور أعلاه

يحاول JVM استدعاء الطريقة الرئيسية للفئة التي تحددها

—في هذه المرحلة، لم يتم إنشاء أي كائنات للفئة.

إعلان main كثابت allows JVM ل invoke رئيسي without إنشاء instance الطبقة.

دعنا نعود إلى الأمر

ClassName هو command-line argument إلى JVM الذي يخبره بالفصل الذي سيتم تنفيذه.بعد ClassName، يمكنك أيضًا تحديد ملف list of Strings (مفصولة بمسافات) كوسيطات لسطر الأوامر التي سيمررها JVM إلى التطبيق الخاص بك.- يمكن استخدام مثل هذه الوسائط لتحديد الخيارات (على سبيل المثال، اسم الملف) لتشغيل التطبيق - ولهذا السبب يوجد معلمة تسمى String[] args رئيسيا

مراجع:Java™ كيفية البرمجة (الكائنات المبكرة)، الطبعة العاشرة

أعتقد أن الكلمة الأساسية "static" تجعل الطريقة الرئيسية طريقة فئة، وأساليب الفصل لها نسخة واحدة فقط منها ويمكن مشاركتها من قبل الجميع، كما أنها لا تتطلب كائنًا كمرجع.لذلك، عندما يتم تجميع فئة برنامج التشغيل، يمكن استدعاء الطريقة الرئيسية.(أنا فقط في المستوى الأبجدي لجافا، آسف إذا كنت مخطئا)

main() ثابت لأن؛في تلك المرحلة من دورة حياة التطبيق، تكون حزمة التطبيق إجرائية بطبيعتها نظرًا لعدم وجود كائنات تم إنشاء مثيل لها حتى الآن.

إنها صفحة نظيفة.التطبيق الخاص بك يعمل في هذه المرحلة، حتى بدون الإعلان عن أي كائنات (تذكر، هناك أنماط ترميز إجرائية و OO).أنت، كمطور، تقوم بتحويل التطبيق إلى حل موجه للكائنات عن طريق إنشاء مثيلات للكائنات الخاصة بك والاعتماد على التعليمات البرمجية المترجمة داخلها.

يعد التوجه الشيئي أمرًا رائعًا لملايين الأسباب الواضحة.ومع ذلك، فقد ولت الأيام التي كان فيها معظم مطوري VB يستخدمون بانتظام كلمات رئيسية مثل "goto" في التعليمات البرمجية الخاصة بهم."goto" هو أمر إجرائي في VB يتم استبداله بنظيره OO:استدعاء الطريقة.

يمكنك أيضًا النظر إلى نقطة الدخول الثابتة (الرئيسية) على أنها حرية خالصة.لو كانت Java مختلفة بما يكفي لإنشاء مثيل لكائن وتقديم هذا المثيل فقط لك أثناء التشغيل، فلن يكون لديك خيار سوى كتابة تطبيق إجرائي.على الرغم من أن الأمر قد يبدو غير قابل للتصور بالنسبة لـ Java، فمن الممكن أن يكون هناك العديد من السيناريوهات التي تتطلب أساليب إجرائية.

ربما يكون هذا ردًا غامضًا جدًا.تذكر أن "الفئة" ليست سوى مجموعة من التعليمات البرمجية المترابطة."المثال" هو جيل مستقل يعيش ويتنفس من تلك الفئة.

النموذج الأولي public static void main(String[]) هي اتفاقية محددة في JLS :

يجب أن يتم الإعلان عن الطريقة الرئيسية بأنها عامة وثابتة وباطلة.يجب أن تحدد معلمة رسمية (§8.4.1) نوعها المُعلن هو صفيف من السلسلة.

في مواصفات JVM 5.2.بدء تشغيل الآلة الافتراضية نستطيع القراءة:

يبدأ تشغيل جهاز Java الظاهري عن طريق إنشاء فئة أولية، والتي يتم تحديدها بطريقة تعتمد على التنفيذ، باستخدام محمل فئة التمهيد (§5.3.1).يقوم جهاز Java الظاهري بعد ذلك بربط الفئة الأولية وتهيئتها واستدعاءها طريقة الفئة العامة باطلة الرئيسية (سلسلة []).يؤدي استدعاء هذه الطريقة إلى تنفيذ المزيد من التنفيذ.قد يؤدي تنفيذ تعليمات آلة Java الافتراضية التي تشكل الطريقة الرئيسية إلى ربط (وبالتالي إنشاء) فئات وواجهات إضافية، بالإضافة إلى استدعاء طرق إضافية.

الشيء المضحك هو أنه في مواصفات JVM لم يذكر أن الطريقة الرئيسية يجب أن تكون ثابتة.لكن المواصفات تشير أيضًا إلى أن جهاز Java الظاهري يقوم بخطوتين قبل:

تتكون تهيئة فئة أو واجهة من تنفيذ طريقة تهيئة الفئة أو الواجهة الخاصة بها.

في 2.9.طرق خاصة :

أ طريقة تهيئة الطبقة أو الواجهة ويعرف :

تحتوي الفئة أو الواجهة على طريقة تهيئة فئة أو واجهة واحدة على الأكثر، وتتم تهيئتها (الفقرة 5.5) عن طريق استدعاء تلك الطريقة.طريقة التهيئة للفئة أو الواجهة لها اسم خاص <clinit>, ، ولا يأخذ أي حجج، وهو باطل.

و أ طريقة تهيئة الطبقة أو الواجهة يختلف عن طريقة تهيئة المثيل محددة على النحو التالي:

على مستوى جهاز Java الظاهري، يظهر كل مُنشئ مكتوب بلغة برمجة Java (JLS §8.8) كطريقة تهيئة مثيل لها الاسم الخاص <init>.

لذلك يقوم JVM بتهيئة أ طريقة تهيئة الطبقة أو الواجهة وليس طريقة تهيئة المثيل هذا هو في الواقع منشئ.لذلك لا يحتاجون إلى الإشارة إلى أن الطريقة الرئيسية يجب أن تكون ثابتة في مواصفات JVM لأن ذلك يعني ضمنيًا عدم إنشاء أي مثيل قبل استدعاء الطريقة الرئيسية.

تم مؤخرًا نشر سؤال مماثل على Programmers.SE

ليرة تركية؛ د جزء من الإجابة المقبولة هو،

في جافا، سبب public static void main(String[] args) هل هذا

  1. جوسلينج مطلوب
  2. الكود الذي كتبه شخص ذو خبرة في لغة C (وليس في Java)
  3. ليتم إعدامه من قبل شخص اعتاد على الجري بوستسكريبت على أخبار

http://i.stack.imgur.com/qcmzP.png

 
بالنسبة لـ C#، السبب هو مماثلة عابرة إذا جاز التعبير.احتفظ مصممو اللغة نقطة دخول البرنامج بناء الجملة مألوف للمبرمجين القادمين من جافا.كمهندس معماري C# يقول أندرس هيلسبيرج,

...كان نهجنا مع C# هو ببساطة تقديم بديل...الى مبرمجي جافا...

...

إنها مجرد اتفاقية.من المؤكد أن JVM يمكنه التعامل مع الأساليب الرئيسية غير الثابتة إذا كانت هذه هي الاتفاقية.بعد كل شيء، يمكنك تحديد مُهيئ ثابت في صفك، وإنشاء مثيل لمليار كائن قبل الوصول إلى الأسلوب main() الخاص بك.

ال public الكلمة الرئيسية هي معدل الوصول ، والذي يسمح للمبرمج بالتحكم في رؤية أعضاء الفصل.عندما يسبق أحد أعضاء الفصل public, ، يمكن الوصول إلى هذا العضو بواسطة رمز خارج الفصل الذي يتم الإعلان عنه.

على العكس من public يكون private, ، مما يمنع استخدام العضو بواسطة تعليمات برمجية محددة خارج فئته.

في هذه الحالة، main() يجب أن يعلن كما public, ، لأنه يجب أن يتم استدعاؤه بواسطة الكود خارج فئته عند بدء تشغيل البرنامج.

الكلمة الرئيسية static يسمحmain() ليتم استدعاؤها دون الحاجة إلى إنشاء مثيل معين للفئة.وهذا ضروري منذ ذلك الحين main() يتم استدعاؤه بواسطة مترجم Java قبل إنشاء أي كائنات.

الكلمة الرئيسية void ببساطة يخبر المترجم بذلك main() لا يُرجع قيمة.

نقطة الدخول الحقيقية لأي تطبيق هي الطريقة الثابتة.إذا كانت لغة Java تدعم طريقة مثيل باعتبارها "نقطة إدخال"، فسيحتاج وقت التشغيل إلى تنفيذها داخليًا كطريقة ثابتة تقوم بإنشاء مثيل للكائن متبوعًا باستدعاء طريقة المثيل.

بعد ذلك، سأقوم بفحص الأساس المنطقي لاختيار خيار محدد من الخيارات الثلاثة التالية:

  1. أ static void main() كما نراها اليوم.
  2. طريقة المثيل void main() دعا على كائن تم بناؤه حديثًا.
  3. استخدام مُنشئ النوع كنقطة إدخال (على سبيل المثال، إذا تم استدعاء فئة الإدخال Program, ، فإن التنفيذ سيتألف بشكل فعال من new Program()).

انفصال:

static void main()

  1. يستدعي المنشئ الثابت للفئة المرفقة.
  2. يستدعي الطريقة الثابتة main().

void main()

  1. يستدعي المنشئ الثابت للفئة المرفقة.
  2. إنشاء مثيل للفئة المرفقة عن طريق الاتصال الفعال new ClassName().
  3. يستدعي أسلوب المثيل main().

new ClassName()

  1. يستدعي المنشئ الثابت للفئة المرفقة.
  2. ينشئ مثيلًا للفئة (ثم لا يفعل شيئًا بها ويعود ببساطة).

الأساس المنطقي:

سأذهب في ترتيب عكسي لهذا واحد.

ضع في اعتبارك أن أحد أهداف تصميم Java كان التأكيد على (المطالبة عندما يكون ذلك ممكنًا) بممارسات البرمجة الشيئية الجيدة.في هذا السياق، منشئ الكائن تهيئة الكائن، ولكن لا ينبغي أن يكون مسؤولاً عن سلوك الكائن.ولذلك، فإن المواصفات التي أعطت نقطة دخول new ClassName() من شأنه أن يربك الوضع بالنسبة لمطوري Java الجدد من خلال فرض استثناء لتصميم المُنشئ "المثالي" في كل تطبيق.

بجعل main() طريقة المثال، تم حل المشكلة المذكورة أعلاه بالتأكيد.ومع ذلك، فإنه يخلق تعقيدًا من خلال مطالبة المواصفات بإدراج توقيع مُنشئ فئة الإدخال بالإضافة إلى توقيع main() طريقة.

في ملخص، تحديد أ static void main() ينشئ مواصفات بأقل قدر من التعقيد مع الالتزام بمبدأ وضع السلوك في الأساليب.بالنظر إلى مدى سهولة تنفيذ أ main() الطريقة التي تقوم في حد ذاتها ببناء مثيل لفئة وتستدعي طريقة مثيل، لا توجد ميزة حقيقية للتحديد main() كطريقة المثال.

ثابت - عندما يقوم JVM باستدعاء الطريقة الرئيسية، لا يوجد كائن موجود للفئة التي يتم استدعاؤها، لذلك يجب أن يكون لديه طريقة ثابتة للسماح بالاستدعاء من الفئة.

لا أعرف ما إذا كان JVM يستدعي الطريقة الرئيسية قبل إنشاء الكائنات ...ولكن هناك سبب أقوى بكثير لكون الطريقة main() ثابتة ...عندما يستدعي JVM الطريقة الرئيسية للفئة (على سبيل المثال، الشخص).يستدعيه عن طريق "الشخص الرئيسي ()".كما ترى، فإن JVM يستدعيه باسم الفئة.لهذا السبب من المفترض أن تكون الطريقة main() ثابتة وعامة بحيث يمكن الوصول إليها بواسطة JVM.

آمل أن يكون قد ساعد.إذا كان الأمر كذلك، اسمحوا لي أن أعرف عن طريق التعليق.

الأساليب الثابتة لا تتطلب أي كائن.يتم تشغيله بشكل مباشر بحيث يتم تشغيله بشكل مباشر.

يتم استخدام الكلمة الرئيسية الثابتة في الطريقة الرئيسية لأنه لا يوجد أي إنشاء مثيل يحدث في الطريقة الرئيسية.ولكن يتم إنشاء الكائن بدلاً من الاستدعاء، ونتيجة لذلك نستخدم الكلمة الأساسية الثابتة في الطريقة الرئيسية.في jvm، يتم إنشاء ذاكرة السياق عند تحميل الفصل فيها. وجميع الأعضاء الثابتين موجودون في تلك الذاكرة.إذا قمنا بإنشاء الثابت الرئيسي الآن، فسيكون موجودًا في الذاكرة ويمكن الوصول إليه بواسطة jvm (class.main(..)) حتى نتمكن من استدعاء الطريقة الرئيسية دون الحاجة إلى إنشاء كومة الذاكرة المؤقتة.

إنها مجرد اتفاقية كما نرى هنا:

طريقة يجب الإعلان عنها عامة وثابتة, ، يجب عدم إرجاع أي قيمة ، ويجب أن تقبل صفيف السلسلة كمعلمة.بشكل افتراضي ، فإن أول وسيطة غير خياط هي اسم الفصل الذي سيتم استدعاؤه.يجب استخدام اسم فئة مؤهل بالكامل.إذا تم تحديد خيار -jar ، فإن أول وسيطة غير خياط هي اسم أرشيف جار يحتوي على ملفات فئة وموارد للتطبيق ، مع الإشارة إلى فئة بدء التشغيل بواسطة رأس البيان من الفئة الرئيسية.

http://docs.Oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html#description

تعني الكلمات الأساسية العامة الثابتة أن مترجم جهاز Java الظاهري (JVM) يمكنه استدعاء الطريقة الرئيسية للبرنامج لبدء تشغيل البرنامج (عام) دون إنشاء مثيل للفئة (ثابت)، ولا يقوم البرنامج بإرجاع البيانات إلى مترجم Java VM (باطلة) عندما تنتهي.

مصدر:الأساسيات، الجزء الأول، الدرس الثاني:تطبيقات البناء

في الأساس، نجعل أعضاء البيانات ووظائف الأعضاء بمثابة بيانات ثابتة لا تؤدي أي مهمة تتعلق بكائن ما.وفي حالة الطريقة الرئيسية، فإننا نجعلها ثابتة لأنها لا علاقة لها بالكائن، حيث تعمل الطريقة الرئيسية دائمًا سواء كنا ننشئ كائنًا أم لا.

أي طريقة يتم تعريفها على أنها ثابتة في Java تنتمي إلى الفئة نفسها.مرة أخرى، لا يمكن الوصول إلى الطريقة الثابتة لفئة معينة إلا من خلال الإشارة إلى الفئة مثل Class_name.method_name();

لذلك لا يلزم إنشاء مثيل للفصل قبل الوصول إلى طريقة ثابتة.

لذلك تم الإعلان عن الطريقة الرئيسية () كـ static بحيث يمكن الوصول إليه دون إنشاء كائن من تلك الفئة.

نظرًا لأننا نحفظ البرنامج باسم الفئة التي توجد بها الطريقة الرئيسية (أو من حيث يجب أن يبدأ البرنامج تنفيذه، ينطبق ذلك على الفئات التي لا تحتوي على main() الطريقة () (المستوى المتقدم)).وذلك بالطريقة المذكورة أعلاه:

Class_name.method_name();

يمكن الوصول إلى الطريقة الرئيسية.

باختصار، عندما يتم تجميع البرنامج فإنه يبحث عن ملف main() طريقة وجود String الحجج مثل: main(String args[]) في الفئة المذكورة (أي.باسم البرنامج)، وبما أنه في البداية لم يكن لديه مجال لإنشاء مثيل لتلك الفئة، لذلك تم الإعلان عن الطريقة الرئيسية () على أنها ثابتة.

من java.sun.com (هناك المزيد من المعلومات على الموقع):

الطريقة الرئيسية ثابتة لمنح مترجم Java VM طريقة لبدء الفصل دون إنشاء مثيل لفئة التحكم أولاً.يتم إنشاء مثيلات فئة التحكم في الطريقة الرئيسية بعد بدء تشغيل البرنامج.

ما أفهمه دائمًا هو أن الطريقة الرئيسية، مثل أي طريقة ثابتة، يمكن استدعاؤها دون إنشاء مثيل للفئة المرتبطة، مما يسمح لها بالعمل قبل أي شيء آخر في البرنامج.إذا لم تكن ثابتة، فسيتعين عليك إنشاء كائن قبل استدعائه - مما يخلق مشكلة "الدجاجة والبيضة"، نظرًا لأن الطريقة الرئيسية هي عمومًا ما تستخدمه لإنشاء كائنات في بداية البرنامج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top