জাভা মূল পদ্ধতি স্থির কেন?


505

জাভা প্রধান () পদ্ধতির পদ্ধতির স্বাক্ষরটি হ'ল:

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

এই পদ্ধতিটি অচল হওয়ার কোনও কারণ আছে কি?


1
এই ক্ষেত্রে, আমাদের পদ্ধতি স্বাক্ষরটি বলা উচিত নয় , কারণ এই শব্দটি কেবল পদ্ধতির নাম এবং এর পরামিতিগুলিকে বোঝায়
অ্যান্ড্রু টবিলকো

জাভা ইচ্ছাকৃতভাবে কোনও সি প্রোগ্রামারের সাথে পরিচিত হওয়ার জন্য ডিজাইন করা হয়েছে। এটি সি সম্মেলনের খুব কাছেই।
থরবজর্ন রাভন অ্যান্ডারসন

উত্তর:


337

পদ্ধতিটি স্থির কারণ অন্যথায় অস্পষ্টতা থাকবে: কোন নির্মাণকারীকে ডাকা উচিত? বিশেষত যদি আপনার শ্রেণিটি এমন দেখাচ্ছে:

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

জেভিএম কল করা উচিত new JavaClass(int)? এটি কি জন্য পাস করা উচিত x?

যদি তা না হয়, JavaClassকোন কনস্ট্রাক্টর পদ্ধতি না চালিয়ে জেভিএম ইনস্ট্যান্ট করা উচিত ? আমি মনে করি এটি করা উচিত নয়, কারণ এটি আপনার পুরো শ্রেণীর বিশেষ ক্ষেত্রে ঘটবে - কখনও কখনও আপনার এমন নজির থাকে যা প্রাথমিকভাবে শুরু করা হয়নি, এবং আপনাকে যে পদ্ধতিতে ডাকা যেতে পারে সেগুলি পরীক্ষা করে দেখতে হবে।

এন্ট্রি পয়েন্ট বলার আগে জেভিএমকে কোনও শ্রেণি ইনস্ট্যান্ট করতে হবে তা বোঝার জন্য এটির জন্য অনেকগুলি প্রান্তের মামলা এবং অস্পষ্টতা রয়েছে। এজন্যই mainঅচল।

যদিও mainসবসময় চিহ্নিত করা হয় তা আমার কোনও ধারণা নেই public


4
একটি ইন্টারফেস প্রয়োগ করা তাত্ক্ষণিক সমস্যার সমাধান করে না।
জ্যাকব ক্রোল

26
আমি ব্যক্তিগতভাবে এটি পছন্দ করি যে public static void mainএটি একটি এন্ট্রি পয়েন্টের চিহ্নিতকারী হিসাবে কাজ করে - একটি পাবলিক প্যারামিটারলেস কনস্ট্রাক্টর চিৎকার করে না "এটি সম্ভবত একটি এন্ট্রি পয়েন্ট!" একই পথে.
জ্যাকব ক্রোল

5
@ এডউইনডালোরজো - প্রবেশ পয়েন্ট ক্লাসটি তাত্ক্ষণিকভাবে বাধ্য করে কী লাভ হবে? স্থিতিশীল পদ্ধতিতে কল করা ক্লাসের উপর সর্বনিম্ন বোঝা রাখে। এটি যদি আপনার ডিজাইনের জন্য আরও অর্থবোধ করে তবে এটিকে নিজেই ইনস্ট্যান্ট করতে বিনামূল্যে।
ডেভিড হার্কনেস

18
"কোন কনস্ট্রাক্টর বলা উচিত?" কীভাবে কীভাবে এটি অনুমেয়ীয়ভাবে সমস্যা? সিদ্ধান্ত নেওয়ার জন্য একই "সমস্যা" উপস্থিত রয়েছে main। অদ্ভুতভাবে যথেষ্ট (আপনার জন্য), জেভিএম এটি ঠিকঠাক পরিচালনা করে।
কনরাড রুডল্ফ

9
মূল পদ্ধতিটি সর্বদা সর্বজনীন কারণ এটি রানটাইম ইঞ্জিন, জেভিএম দ্বারা অ্যাক্সেস করতে হবে।
gthm

398

এটি কেবল কনভেনশন। আসলে, এমনকি নামের প্রধান () এবং যুক্তিগুলি নিখুঁতভাবে কনভেনশন।

আপনি যখন java.exe (বা উইন্ডোতে javaw.exe) চালান, আসলে যা ঘটছে তা হল জাভা নেটিভ ইন্টারফেস (জেএনআই) কল calls এই কলগুলি সেই ডিএলএল লোড করে যা সত্যই জেভিএম (এটি ঠিক - java.exe জেভিএম নয়)। ভার্চুয়াল মেশিন ওয়ার্ল্ড, এবং সি, সি ++ ইত্যাদির বিশ্ব ব্রিজ করতে যখন আমরা ব্যবহার করি তখন জেএনআই হ'ল ... বিপরীতটিও সত্য - এটি সম্ভব নয় (অন্তত আমার জ্ঞানের কাছে) আসলে একটি পাওয়ার জন্য জেভিএম জেএনআই ব্যবহার না করে চলছে।

মূলত, java.exe একটি সুপার সিম্পল সি অ্যাপ্লিকেশন যা কমান্ড লাইনটি পার্স করে, JVM এ একটি নতুন স্ট্রিং অ্যারে তৈরি করে সেই যুক্তিগুলি ধরে রাখে, আপনি মেইন () হিসাবে চিহ্নিত শ্রেণীর নামটি বিশ্লেষণ করেন, JNI কলগুলি সন্ধান করতে ব্যবহার করেন প্রধান () পদ্ধতিটি নিজেই, তারপরে প্যারামিটার হিসাবে সদ্য নির্মিত স্ট্রিং অ্যারে পেরিয়ে প্রধান () পদ্ধতিটি আহ্বান করে। এটি জাভা থেকে প্রতিবিম্ব ব্যবহার করার সময় আপনি যা করেন তা খুব বেশি - এটি কেবল বিভ্রান্তিকরভাবে নেটিভ ফাংশন কল ব্যবহার করে।

আপনার নিজের জাভা.এক্সই সংস্করণটি লেখার পক্ষে উত্সটি আইনী হবে (উত্সটি জেডিকে দিয়ে বিতরণ করা হয়েছে) এবং এটি সম্পূর্ণ আলাদা কিছু করেছে। আসলে, আমরা আমাদের জাভা ভিত্তিক অ্যাপ্লিকেশনগুলির সাথে ঠিক এটি করি।

আমাদের প্রতিটি জাভা অ্যাপের নিজস্ব লঞ্চার রয়েছে। আমরা প্রাথমিকভাবে এটি করি তাই আমরা আমাদের নিজস্ব আইকন এবং প্রক্রিয়াটির নাম পাই তবে এটি অন্যান্য পরিস্থিতিতে কার্যকর হয়েছে যেখানে আমরা নিয়মিত মেইন () কলগুলি ছাড়া কিছু করতে চাই (উদাহরণস্বরূপ, একটি ক্ষেত্রে আমরা করছি) COM আন্তঃব্যবযোগিতা, এবং আমরা আসলে একটি স্ট্রিং অ্যারের পরিবর্তে মূল () এ একটি COM হ্যান্ডেলটি পাস করি।

সুতরাং, দীর্ঘ এবং সংক্ষিপ্ত: এটি স্থির হওয়ার কারণটি বি / সি যে সুবিধাজনক। একে 'প্রধান' বলা হওয়ার কারণটি হ'ল এটি কিছু হতে হয়েছিল এবং প্রধান () হ'ল সি এর পুরানো দিনগুলিতে তারা কী করেছিল (এবং সেই দিনগুলিতে ফাংশনের নামটি গুরুত্বপূর্ণ ছিল )। আমি মনে করি যে জাভা.এক্সই আপনাকে কেবলমাত্র ক্লাস (জাভা কম.এম.কম্পানি.ফু.সোম স্পেশালমেন) এর পরিবর্তে একটি সম্পূর্ণ যোগ্য প্রধান পদ্ধতির নাম উল্লেখ করতে পারত - তবে এটি আইডিইগুলিতে স্বয়ংক্রিয় সনাক্তকরণকে আরও শক্ত করে তোলে ' একটি প্রকল্পে প্রবর্তনযোগ্য ক্লাস।


66
+1: অত্যন্ত আকর্ষণীয় (বিশেষত একটি রীতিনীতি লেখার অংশ java.exe)
অ্যাডাম পেন্টার

9
আকর্ষণীয়, আমি "এটি কেবল কনভেনশন" এর সাথে একমত নই। উত্তরের অংশ। ওপির প্রাথমিক প্রশ্নটি ঘোষণায় স্থির হওয়ার কারণ ছিল। আমি মনে করি staticনা যে main()ঘোষণাপত্রটি কেবল সম্মেলনের স্বার্থে। যদিও এটি 'মেন (') এবং অন্য কিছু নয় তবে এটি বাস্তবসম্মত।
জ্যারেড

2
@ ডেভিড তাই হয়েছে। আমি প্রকৃতপক্ষে জড়িত লোকদের মধ্যে একটির কাছ থেকে উত্তর পছন্দ করতাম - তবে এটি ছিল খুব দূরে। দুর্ভাগ্যক্রমে অন্যান্য উত্তরগুলির বেশিরভাগ অ্যাড-হক যুক্তিতে একটি অনুশীলন। এটি একটি (সম্ভবত) অ-প্রযুক্তিগত কারণকে ভুল কারণ হিসাবে ভুল প্রযুক্তিগত বিবরণ আবিষ্কার না করার নম্রতা ছাড়াও বেশ আকর্ষণীয় বিশদ দেয়।
কনরাড রুডলফ

2
@ জ্যারেড - তাদের কোনও সার্বজনীন নো-আরগ নির্মাতা প্রয়োজন হতে পারে এবং mainঅ স্থিতিশীল তৈরি করতে পারে এবং এখনও ভাষার সীমানার মধ্যে ফিট করে। ডিজাইনারদের কাছ থেকে শ্রবণ না করে, আমাদের কেবল একমত হতে সম্মত হতে হবে। :)
ডেভিড হার্কনেস

4
@ বেনভয়েগ্ট আপনি jvm dll পেতে লোডলাইবারি () কল করুন) তারপরে আপনি getprocaddress ("JNI_CreateJavaVM") কল করেন, তারপরে আপনি JNI_CreateJavaVM ফাংশনটি ( ডকস.অরাকল . com / javase / 1.4.2 / docs / guide / jni / spec/… ) শুরু করেন। একবার ভিএম লোড হয়ে গেলে আপনি সঠিক শ্রেণীর সন্ধানের জন্য স্ট্যান্ডার্ড জেএনআই কলগুলি ব্যবহার করেন, স্থির মূল পদ্ধতিটি লোড করুন এবং এটিতে অনুরোধ করুন। সেখানে ভুল ব্যাখ্যা দেওয়ার জন্য খুব বেশি জায়গা নেই। জেএনআই হ'ল একেবারে কীভাবে আপনি ভিএম লোড করেন। আপনি কেবল ক্লায়েন্ট সাইড জেএনআই লিখতে অভ্যস্ত হতে পারেন স্থানীয় কীওয়ার্ড, জাভা-জজনি ইত্যাদি ব্যবহার করে ... তবে এটি জেএনআইয়ের অর্ধেক মাত্র।
কেভিন ডে

188

main()পদ্ধতি C++, C#এবং Javaস্ট্যাটিক হয়
কারণ তারা তারপর রানটাইম ইঞ্জিন দ্বারা প্রার্থনা করা যেতে পারে ছাড়া শরীরের কোন বস্তু তারপর কোড instantiate করা হচ্ছে main()বাকি কাজগুলি করে দেবে।


1
ঠিক আছে তবে রানটাইম ক্লাসের একটি অবজেক্ট ইনস্ট্যান্ট করতে পারে না? এবং তারপরে মূল পদ্ধতিটি কল করবেন? কেন?
আন্দ্রে রেনিয়া

12
আপনার মূল শ্রেণীর ওভারলোডড কনস্ট্রাক্টরগুলি থাকলে কীভাবে জেভিএম জানতে পারে কোন নির্মাণকারীকে কল করতে হবে? এটি কোন পরামিতিগুলি পাস করবে?
জ্যাকব ক্রোল

1
@ নোয়া আপনি যখন পিতামাতার ক্লাসটি বলছেন তখন কি আপনি মূল পদ্ধতিটি সহকারে ক্লাসটি বোঝাচ্ছেন? কারণ যদি তা হয় তবে "পিতামাতা শ্রেণি" শব্দটি এখানে বরং বিভ্রান্তিকর, এবং অন্যথায় এটি আমার কাছে কোনও অর্থ রাখবে না। এছাড়াও, যদি আমরা কনভেনশন দ্বারা ব্যবহার করি তবে public static void main...কেন কনভেনশন হতে পারে না যে অ্যাপ্লিকেশন এন্ট্রি পয়েন্ট শ্রেণিতে সর্বজনীন ডিফল্ট নির্মাতা থাকতে হবে?
এডউইন ডালোরজো

2
@ জ্যাকব জেভিএম কীভাবে জানতে পারবে কোনটি static void mainফোন করতে ওভারলোড হয়েছে? মোটেই সমস্যা নয়।
কনরাড রুডল্ফ

4
@ নামরাথা: হ্যাঁ, আপনি কিছু মিস করছেন। এটি ঠিক সত্য নয় যে "স্থিতিশীল পদ্ধতি অ স্থির পদ্ধতিটিকে উল্লেখ করতে পারে না"। সঠিক বিবৃতিটি হ'ল: "কোনও স্থিতিশীল অ পদ্ধতি ব্যবহার করার সময় প্রতিটি স্থির পদ্ধতি অবশ্যই একটি অবজেক্ট সরবরাহ করতে পারে"। এবং দেখুন, যেমন কোনও বস্তু তৈরি করতে ঘন ঘন ব্যবহার করা staticপদ্ধতিগুলি । mainnew
বেন ভয়েগট

38

পাবলিক স্ট্যাটিক শূন্য মূল (স্ট্রিং [] আরগস) কেন?

এইভাবে জাভা ল্যাঙ্গুয়েজ ডিজাইন করা হয়েছে এবং জাভা ভার্চুয়াল মেশিনটি ডিজাইন এবং লিখিত হয়েছে।

ওরাকল জাভা ভাষার স্পেসিফিকেশন

অধ্যায় 12 সম্পাদন পরীক্ষা দেখুন - বিভাগ 12.1.4 টেস্ট.মাইন কল করুন :

পরিশেষে, ক্লাস টেস্টের জন্য ইনিশিয়ালাইজেশন শেষ হওয়ার পরে (যার সময়ে অন্যান্য ফলস্বরূপ লোডিং, লিঙ্কিং এবং প্রারম্ভিককরণের ঘটনা ঘটতে পারে), টেস্টের মেথড মেইনটি চাওয়া হয়।

পদ্ধতিটির মূলটি অবশ্যই সর্বজনীন, স্থির এবং অকার্যকর হিসাবে ঘোষণা করতে হবে। এটি অবশ্যই একটি একক যুক্তি গ্রহণ করবে যা স্ট্রিংগুলির একটি অ্যারে। এই পদ্ধতিটি হয় হিসাবে ঘোষণা করা যেতে পারে

public static void main(String[] args)

অথবা

public static void main(String... args)

ওরাকল জাভা ভার্চুয়াল মেশিনের স্পেসিফিকেশন

পরীক্ষা করে দেখুন অধ্যায় 2 জাভা প্রোগ্রামিং ভাষা ধারণা - অনুচ্ছেদ 2.17 এক্সেকিউশন :

জাভা ভার্চুয়াল মেশিনটি নির্দিষ্ট কয়েকটি শ্রেণীর মেথড মেইনকে ইনভেস্ট করে এবং এটিকে একটি একক আর্গুমেন্ট দিয়ে স্ট্রাকচারের অ্যারে হিসাবে চালিয়ে শুরু করে। এটি নির্দিষ্ট শ্রেণিকে লোড হতে পারে (.12.17.2), এটি ব্যবহার করা অন্যান্য ধরণের (§2.17.3) সাথে সংযুক্ত (এবং initial2.17.4) initial পদ্ধতিটির মূলটি অবশ্যই সর্বজনীন, স্থির এবং অকার্যকর হিসাবে ঘোষণা করতে হবে।

ওরাকল ওপেনজেডিকে সূত্র

উত্স জারেটি ডাউনলোড করুন এবং নিষ্কাশন করুন এবং দেখুন কীভাবে JVM লিখিত আছে, চেক আউট করুন ../launcher/java.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);

... ...

4
এখানে সমস্যাটি হ'ল প্রচুর উল্লেখ (+1) সহ এটির মূল রূপটিতে এটি আসলে খুব ভাল উত্তর। তবে, আমি কোনও স্ট্র্যাটিক পদ্ধতিতে প্রবেশকারী বিন্দু বা কনস্ট্রাক্টর বা উদাহরণ পদ্ধতির পরিবর্তে নকশার সিদ্ধান্তের যুক্তি সম্পর্কে জানতে আগ্রহী ।
কনরাড রুডলফ

1
ভাষা এবং জেভিএম স্পেসিফিকেশন ডিজাইন সম্পর্কিত প্রশ্নগুলির জন্য @ কনরাডরুডল্ফ, সম্ভবত আপনি ওরাকল থেকে মূল উত্সটির সাথে যোগাযোগ করতে পারেন এবং দেখতে পারেন যে আপনি কোনও ইতিবাচক প্রতিক্রিয়া পেতে পারেন কিনা।
ইয়র্কউ

2
সাধারণত যখন কোনও পদ্ধতির ফলাফলের গণনা কেবল তার পরামিতিগুলির উপর নির্ভর করে, যাতে এটি কোনও অবজেক্টের অভ্যন্তরীণ অবস্থার উপর নির্ভর করে না, এটি স্থির থাকতে পারে। এবং কোড রক্ষণাবেক্ষণ / পুনরায় ব্যবহারযোগ্যতার জন্য এটি স্থির হিসাবে সেট করার পরামর্শ দেওয়া হয়। যদি পদ্ধতিটি mainস্থির না হয় তবে এর অর্থ শ্রেণীর উদাহরণের রাজ্যটি অবশ্যই জানা উচিত এবং এটি নির্ধারণ করা আরও জটিল, কোনটি নির্মাণকারী প্রথমে ব্যবহার করবেন like
ইয়ভেস মার্টিন 21

@ কনরাডরুডল্ফ মজার বিষয় হল, ওকের (জাভার পূর্বসূর) ইতিমধ্যে একটি অনুরূপ প্রোটোটাইপ থাকার জন্য মূল পদ্ধতির প্রয়োজন ছিল: public static void main(String arguments[])- তথ্যসূত্র: ওক ০.২ স্পেক
Assylias

2
@ হ্যাঁ এটি হতে পারে। এটির দরকার নেই, যদি অন্য ডিজাইনটি বোঝায়। আমি এখানে মন্তব্য মধ্যে কিছু ভাল আর্গুমেন্ট শুনেছি কিন্তু আমি এখনও মনে করি যে একটি প্রক্রিয়া খুব একটি থ্রেড (এটা মত কার্যকরভাবে হয় হয় ), এবং জাভা একটি থ্রেড সাধারণত একটি দৃষ্টান্ত হিসাবে প্রতিনিধিত্ব করা হয় Runnable। পুরো প্রক্রিয়াটিকে একইভাবে উপস্থাপন করা (যেমন Runnable.Runএন্ট্রি পয়েন্ট হিসাবে থাকা) অবশ্যই জাভাতে বোঝায়। অবশ্যই Runnableজাভা বেনামে পদ্ধতি নেই (এই কারণে) যে কারণে জাভায় একটি তর্কযুক্ত ত্রুটি রয়েছে। তবে যেহেতু এটি ইতিমধ্যে আছে ...
কনরাড রুডল্ফ

36

আসুন কেবল ভান করা যাক, staticএপ্লিকেশন এন্ট্রি পয়েন্ট হিসাবে এটি প্রয়োজন হবে না।

একটি অ্যাপ্লিকেশন শ্রেণি এর পরে দেখতে হবে:

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

কনস্ট্রাক্টর কোড এবং mainপদ্ধতির মধ্যে পার্থক্য প্রয়োজনীয় কারণ ওও ভাষায় কোনও কনস্ট্রাক্টর কেবল তা নিশ্চিত করতে হবে, উদাহরণস্বরূপ সঠিকভাবে আরম্ভ করা হয়েছে । আরম্ভের পরে, উদাহরণটি "পরিষেবা" এর জন্য ব্যবহার করা যেতে পারে। সম্পূর্ণ অ্যাপ্লিকেশন কোডটি কন্সট্রাক্টরে রাখলে তা নষ্ট হয়ে যায়।

সুতরাং এই পদ্ধতির প্রয়োগের উপর তিনটি পৃথক চুক্তি বাধ্য করবে :

  • সেখানে আবশ্যক একটি ডিফল্ট কন্সট্রাকটর হও। অন্যথায়, JVM কোন কনস্ট্রাক্টরকে কল করতে হবে এবং কোন পরামিতি সরবরাহ করা উচিত তা জানত না।
  • সেখানে আবশ্যক একটি হতে mainপদ্ধতি 1 । ঠিক আছে, এটি আশ্চর্যজনক নয়।
  • বর্গ না হতে abstract। অন্যথায়, জেভিএম এটি ইনস্ট্যান্ট করতে পারে না could

staticঅন্যদিকে পদ্ধতির শুধুমাত্র প্রয়োজন এক চুক্তি:

  • একটি mainপদ্ধতি অবশ্যই 1 থাকতে হবে ।

এখানে না abstractএকাধিক কনস্ট্রাক্টরের বিষয়টি গুরুত্বপূর্ণ।

যেহেতু জাভা একটি সহজ ভাষা হতে পরিকল্পনা করা হয়েছিল ব্যবহারকারীর জন্য এটা বিস্ময়কর নয় যে আবেদন এন্ট্রি পয়েন্ট ব্যবহার করে একটি সহজ উপায় ডিজাইন করা হয়েছে এক চুক্তি এবং ব্যবহার করে একটি জটিল পথে নাই তিনটি স্বাধীন ও ভঙ্গুর চুক্তি।

দয়া করে নোট করুন: এই যুক্তিটি JVM এর ভিতরে বা জেআরই এর ভিতরে সরলতার বিষয়ে নয় । এই যুক্তিটি ব্যবহারকারীর পক্ষে সরলতার বিষয়ে ।


1 এখানে সম্পূর্ণ স্বাক্ষর কেবল একটি চুক্তি হিসাবে গণ্য।


1
আসলে, প্রয়োজনীয়তা আরো জটিল হয়: একটি হওয়া আবশ্যক mainপদ্ধতি যা public, staticএবং স্বাক্ষর হয়েছে void main(String[])। সে ব্যাপারে আমি সম্মত, পদ্ধতি একটি দৃষ্টান্ত পদ্ধতি করত, JRE হবে সামান্য আরো কাজ কিন্তু ধরনের কাজের একই হতে হবে, এবং জটিলতা না উল্লেখযোগ্যভাবে বেশী (পূর্ববর্তী উত্তর মন্তব্যে আলোচনা দেখুন)। আমি বিশ্বাস করি না যে এই পার্থক্যটি এন্ট্রি পয়েন্টকে স্থির করার সিদ্ধান্ত গ্রহণের জন্য গুরুত্বপূর্ণ, বিশেষত যেহেতু একটি উদাহরণ পদ্ধতির সমাধানের জন্য প্রয়োজনীয় পদ্ধতি রয়েছে এবং তা সহজেই ব্যবহারযোগ্য।
কনরাড রুডল্ফ

3
@ কনরাড রুডল্ফ: আমার বক্তব্য জেআরইর কাজটি করবে না। আমার বক্তব্যটি ভাষার প্রতিটি ব্যবহারকারীকে প্রয়োজনীয় হিসাবে আরও চুক্তিগুলি অনুসরণ করতে বাধ্য করার বিষয়ে । এই অর্থে একটি static public main(String[])পদ্ধতি একটি স্বাক্ষর এবং সেইজন্য একটি চুক্তি। অন্যথায় তিনটি স্বাধীন চুক্তি অনুসরণ করতে হবে।
এএইচ

1
আহ। আমি এখনও দ্বিমত পোষণ করছি যে এটি যদিও কোনও পার্থক্য করে। এন্ট্রি পয়েন্ট ক্লাসগুলি ভালভাবে প্রয়োগ করতে পারে Runnable। স্পষ্টতই, জাভা আশা করে যে বিকাশকারীরা সর্বদা সেই চুক্তিটি অনুসরণ করে, কেন এটি অ্যাপ্লিকেশন এন্ট্রি পয়েন্টের জন্য খুব বেশি হওয়া উচিত? ওটা কোন অর্থ প্রকাশ করে না.
কনরাড রুডলফ

3
@ কনরাডরুডল্ফ: কোনও বৈপরীত্য নেই: একটি ক্ষেত্রে সিস্টেমটি ব্যবহারকারীকে তিনটি চুক্তি করতে বাধ্য করবে। সন্দেহজনক যে চুক্তিগুলি, যা সংকলকটির মাধ্যমে চেকযোগ্য নয় এবং যা ব্যবহারকারীর দৃষ্টিকোণ থেকে স্বাধীন। ব্যবহারকারীর কাছ থেকে স্বাভাবিক ThreadRunnableকোনও কিছুই গোপন থাকে না, তিনি পরিষ্কারভাবে দেখতে পাচ্ছেন কী ঘটছে এবং কেবলমাত্র তার চুক্তি অনুসারে চুক্তিগুলিই প্রয়োগ করতে হবে তার পরিবর্তন আছে - তিনি নিয়ন্ত্রণে আছেন, সিস্টেম নয়।
এএইচ

2
এটি এখানে সেরা উত্তর। এটি লজ্জাজনক যে অনেক ব্যবহারকারী কেবল পৃষ্ঠায় শীর্ষ 2 বা 3 টি উত্তর পড়বেন; এবং খুব শীঘ্রই এটির কোনও জায়গায় আসার সম্ভাবনা নেই। এটি আরম্ভের জন্য কেবলমাত্র একজন কনস্ট্রাক্টরের গুরুত্বপূর্ণ পয়েন্টটির উল্লেখ করেছে - এবং সুতরাং এটি কোনও স্টাইলে কোড তৈরির কোনও ধারণা রাখে না যেখানে কনস্ট্রাক্টর পুরো অ্যাপ্লিকেশনটি চালায়।
দাউদ ইবনে করিম


12

মূল পদ্ধতিটি বলার আগে কোনও বস্তু তাত্ক্ষণিকভাবে চালিত হয় না। স্ট্যাটিক কীওয়ার্ড থাকা মানে প্রথমে কোনও বস্তু তৈরি না করেই পদ্ধতিটি কল করা যায়।


ভুল। বা কমপক্ষে খুব অপ্রস্তুত। পাবলিক ক্লাস মেইন {স্ট্যাটিক অবজেক্ট অবজেক্ট = নতুন অবজেক্ট () {{System.out.println ("অবজেক্ট তৈরি করা হয়েছে"); }}; পাবলিক স্ট্যাটিক অকার্যকর প্রধান (স্ট্রিং [] আরগস) {System.out.println ("মূল"); }}
এলজেঞ্জো

সুষ্ঠু মন্তব্য। প্রযুক্তিগতভাবে, আমার বলা উচিত ছিল যে মেইন পদ্ধতিটি বলার আগে, মূল পদ্ধতিযুক্ত শ্রেণিটি তাত্ক্ষণিকভাবে চালু করা হয় না।
ব্ল্যাকওয়াস্প

12

কারণ অন্যথায়, এটি কার্যকর করতে বস্তুর একটি উদাহরণ প্রয়োজন। তবে প্রথমে অবজেক্টটি তৈরি না করেই স্ক্র্যাচ থেকে ডাকতে হবে, কারণ আর্গুমেন্টগুলি পার্স করা এবং অবজেক্টটি তৈরি করা সাধারণত মূল () ফাংশন (বুটস্ট্র্যাপ) এর কাজ, সাধারণত এই আর্গুমেন্ট / প্রোগ্রাম পরামিতি ব্যবহার করে।


10

আমাকে এই বিষয়গুলি আরও সহজ উপায়ে ব্যাখ্যা করতে দাও:

public static void main(String args[])

অ্যাপলেট ব্যতীত সমস্ত জাভা অ্যাপ্লিকেশনগুলি এখান থেকে তাদের প্রয়োগ শুরু করে main()

শব্দ publicএকটি অ্যাক্সেস পরিবর্তক যা সদস্য বর্গ বাইরে থেকে বলা যেতে অনুমতি দেয়।

staticএটি ব্যবহার করা হয় কারণ এটি main()শ্রেণীর কোনও নির্দিষ্ট উদাহরণ ইনস্ট্যান্ট না করে কল করার অনুমতি দেয় ।

voidইঙ্গিত করে যে main()কোনও মান ফেরত দেয় না।


9

এর অর্থ কী public static void main(String args[])?

  1. public এমন এক অ্যাক্সেস স্পেসিফার যার অর্থ যে কেউ এভিএস / জাভা ভার্চুয়াল মেশিনের মতো এটিকে অ্যাক্সেস / আবেদন করতে পারে।
  2. staticmain()শ্রেণীর কোনও অবজেক্ট তৈরি হওয়ার আগে তাকে কল করার অনুমতি দেয় । এটি neccesary কারণ 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[] argsmain()পদ্ধতিতে একমাত্র পরামিতি নির্দিষ্ট করে ।

    args- একটি পরামিতি যা শ্রেণীর ধরণের অবজেক্টগুলির একটি অ্যারে ধারণ করে String


6

অ্যাপলেট, মিডলেটস, সার্লেটস এবং বিভিন্ন ধরণের মটরশুটিগুলি তৈরি করা হয় এবং তারপরে তাদের উপর লাইফেসাইক্যাল পদ্ধতিগুলি ডাকা হয়। মূল বর্ধন করানো মূল কাজটি যা মূল শ্রেণীর সাথে করা হয় তাই একাধিকবার বলা হয় এমন কোনও বস্তুর মধ্যে রাষ্ট্রের অধিষ্ঠিত হওয়ার দরকার নেই। অন্য ক্লাসে মুখ্য পিন করা একেবারে স্বাভাবিক (যদিও এটি দুর্দান্ত ধারণা নয়), যা ক্লাসটি ব্যবহার করে মূল অবজেক্টটি তৈরি করার পথে আসে।


5

এটি কেবল একটি সম্মেলন, তবে বিকল্পের চেয়ে সম্ভবত আরও সুবিধাজনক। একটি স্থিতিশীল প্রধান সহ, আপনার একটি জাভা প্রোগ্রাম শুরু করার জন্য যা জানা দরকার তা হ'ল একটি শ্রেণীর নাম এবং অবস্থান। যদি এটি স্থির না হয়, তবে আপনাকে কীভাবে সেই শ্রেণিটি ইনস্ট্যান্ট করতে হবে তা জানতে হবে, বা শ্রেণীর ফাঁকা নির্মাতা থাকতে হবে।


এটি কোনও সম্মেলন নয়; এটি ভাষা নির্দিষ্টকরণের অংশ; রানটাইম কোনও স্থিতিশীল প্রধান পদ্ধতি ব্যতীত বৈধ প্রবেশের পয়েন্ট হিসাবে কোনও শ্রেণি সনাক্ত করবে না।
রব

2
ভাষা বৈশিষ্ট্য নিজেই সম্মেলন অনুসরণ করে। জাভা ডিজাইনারদের কোনও স্ট্যাটিক মেইন প্রয়োজনের পক্ষে পছন্দ করার কোনও প্রকৃত প্রয়োজন নেই। তবে লোগান যেমন ব্যাখ্যা করেছেন, বিকল্পগুলি আরও জটিল।
ডেভিড আরনো

@ ডেভিড আর্নো এটি আরও বেশি অর্থবোধ করে বলবে যে সম্মেলনটি ভাষার নির্দিষ্টকরণের অনুসরণ করে।
লর্ন

5

যদি মূল পদ্ধতিটি অচল না হয় তবে আপনাকে প্রোগ্রামের বাইরে থেকে আপনার মূল শ্রেণীর একটি বিষয় তৈরি করতে হবে। আপনি কিভাবে এটি করতে চান?


5

আপনি যখন javaকমান্ডটি সহ জাভা ভার্চুয়াল মেশিন (JVM) চালাবেন ,

java ClassName argument1 argument2 ...

আপনি যখন নিজের অ্যাপ্লিকেশনটি কার্যকর করেন, আপনি উপরের মত জাভা কমান্ডের আর্গুমেন্ট হিসাবে শ্রেণীর নামটি নির্দিষ্ট করেন

জেভিএম আপনার নির্দিষ্ট করা শ্রেণীর মূল পদ্ধতিটি আহ্বান করার চেষ্টা করে

এই মুহুর্তে, শ্রেণীর কোনও বস্তু তৈরি করা হয়নি।

ঘোষণা mainস্ট্যাটিক যেমন allowsকরতে জেভিএম invokeপ্রধান withoutএকটি তৈরি instanceক্লাসের।

কমান্ড ফিরে আসি

ClassNamecommand-line argumentJVM এর কাছে এটি একটি ক্লাসটি কার্যকর করা উচিত tells ClassName অনুসরণ করে, আপনি list of StringsJVM আপনার আবেদনে পাস হবে এমন কমান্ড-লাইন আর্গুমেন্ট হিসাবে একটি (স্পেস দ্বারা পৃথক) নির্দিষ্ট করতে পারেন । অ্যাপ্লিকেশনটি চালানোর জন্য বিকল্পগুলি (উদাহরণস্বরূপ, একটি ফাইলের নাম) নির্দিষ্ট করতে খুব যুক্তি ব্যবহার করা যেতে পারে - এই কারণেই মূলটিতে একটি প্যারামিটার বলা String[] argsহয়

তথ্যসূত্র: জাভা Program কীভাবে প্রোগ্রাম করুন (প্রাথমিক বিষয়গুলি), দশম সংস্করণ


4

সম্প্রতি, অনুরূপ প্রশ্ন প্রোগ্রামারস.এসইতে পোস্ট করা হয়েছে

  • কেন জাভা এবং সি # তে স্থির প্রধান পদ্ধতিটি কনস্ট্রাক্টরের চেয়ে?

    জাভা এবং সি # কেন তাদের প্রবেশ বিন্দু হিসাবে একটি স্থিতিশীল পদ্ধতি রাখার সিদ্ধান্ত নিয়েছে - প্রাথমিকভাবে বা মাধ্যমিক উত্স থেকে একটি নির্দিষ্ট উত্তর খুঁজছেন - এন্ট্রি পয়েন্টটি কোনও Applicationশ্রেণীর উদাহরণ দ্বারা কোনও প্রয়োগের উদাহরণকে উপস্থাপন করার পরিবর্তে উপযুক্ত নির্মাতা?

টিএল; স্বীকৃত উত্তরের ডিআর অংশটি হ'ল,

জাভা সালে কারণে public static void main(String[] args)যে

  1. গোসলিং চেয়েছিল
  2. সি তে অভিজ্ঞ কারও দ্বারা লিখিত কোড (জাভাতে নয়)
  3. কেউ নিষ্পন্ন করা হবে চলমান করার জন্য ব্যবহৃত পোস্টস্ক্রিপ্ট উপর খবর

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

 
সি # এর জন্য, যুক্তিটি ট্রান্সজিটিভলি অনুরূপ তাই কথা বলতে। ভাষা ডিজাইনাররা জাভা থেকে আগত প্রোগ্রামারদের জন্য প্রোগ্রামের এন্ট্রি পয়েন্ট সিনট্যাক্সকে পরিচিত রাখে । সি # স্থপতি আন্ডার হেজলসবার্গ যেমন লিখেছেন ,

... সি # এর সাথে আমাদের দৃষ্টিভঙ্গিটি কেবল জাভা প্রোগ্রামারদের একটি বিকল্প প্রস্তাব দেওয়া ছিল ...

...


3

আমি মনে করি কীওয়ার্ড 'স্ট্যাটিক' মূল পদ্ধতিটিকে একটি শ্রেণিবদ্ধ করে তোলে এবং শ্রেণি পদ্ধতিতে এর একটি মাত্র অনুলিপি থাকে এবং এটি সবার দ্বারা ভাগ করা যায় এবং এছাড়াও, এটি রেফারেন্সের জন্য কোনও সামগ্রীর প্রয়োজন হয় না। সুতরাং যখন ড্রাইভার শ্রেণিটি সঙ্কলিত হয় তখন মূল পদ্ধতিটি আহ্বান করা যেতে পারে। (আমি ঠিক জাভা বর্ণমালার স্তরে আছি, আমি ভুল হলে দুঃখিত)


সমস্ত পদ্ধতিতে 'এর কেবল একটি অনুলিপি থাকে'।
মারকুইস

3

প্রধান () স্থির কারণ; অ্যাপ্লিকেশনটির জীবনচক্রের সেই মুহুর্তে, কোনও বস্তু এখনও তাত্ক্ষণিকভাবে না থাকায় অ্যাপ্লিকেশন স্ট্যাকটি প্রকৃতির পদ্ধতিগত।

এটি একটি পরিষ্কার স্লেট। আপনার অ্যাপ্লিকেশনটি এই মুহুর্তে চলছে, কোনও বস্তু ঘোষিত না করেও (মনে রাখবেন, পদ্ধতিগত এবং ওও কোডিং ধরণ রয়েছে)। আপনি, বিকাশকারী হিসাবে, আপনার বস্তুর উদাহরণ তৈরি করে এবং এর মধ্যে সংকলিত কোডের উপর নির্ভর করে অ্যাপ্লিকেশনটিকে একটি অবজেক্ট-ওরিয়েন্টেড সমাধানে পরিণত করেন।

লক্ষ লক্ষ সুস্পষ্ট কারণে অবজেক্ট-ওরিয়েন্টেড দুর্দান্ত। তবে, সেই দিনগুলি চলে গেছে যখন বেশিরভাগ ভিবি বিকাশকারীরা নিয়মিত তাদের কোডে "গোটো" এর মতো কীওয়ার্ড ব্যবহার করেন। "গেটো" ভিবিতে একটি প্রক্রিয়াগত কমান্ড যা এর ওও প্রতিরূপ দ্বারা পরিবর্তিত হয়: পদ্ধতি প্রার্থনা।

আপনি স্থিতিশীল এন্ট্রি পয়েন্টকে (মূল) খাঁটি স্বাধীনতা হিসাবে দেখতে পারেন। জাভা যদি কোনও অবজেক্ট ইনস্ট্যান্ট করার জন্য এবং কেবল সেই দৃষ্টান্ত আপনাকে দৌড়ানোর জন্য উপস্থাপন করার পক্ষে যথেষ্ট আলাদা হত তবে আপনার কাছে কোনও প্রক্রিয়াগত অ্যাপ্লিকেশন লেখার বিকল্প নেই। জাভা যতটা কল্পনা করতে পারে তত কল্পনা করা সম্ভব, এমন অনেক পরিস্থিতিতে রয়েছে যা পদ্ধতিগত পদ্ধতির জন্য ডাকে।

এটি সম্ভবত খুব অস্পষ্ট উত্তর। মনে রাখবেন, "শ্রেণি" হ'ল আন্ত-সম্পর্কিত কোডের সংগ্রহ। "ইনস্ট্যান্স" হ'ল এই শ্রেণীর এক বিচ্ছিন্ন, জীবিত এবং শ্বাস ফেলা স্বায়ত্তশাসিত প্রজন্ম।


7
এটি ভুল। প্রচুর পরিমাণে বস্তু mainপৌঁছানোর আগেই তাত্ক্ষণিক হয়। এবং যদি আপনি মেইনযুক্ত ক্লাসে একটি স্ট্যাটিক কনস্ট্রাক্টর অন্তর্ভুক্ত করেন তবে এটি mainএকইভাবে কার্যকর করা হবে ।
কনরাড রুডল্ফ

2

এটি কেবল একটি সম্মেলন। জেভিএম অবশ্যই এটি অবিচলিত মূল পদ্ধতির সাথে মোকাবিলা করতে পারত যদি তা কনভেনশন হত। সর্বোপরি, আপনি আপনার ক্লাসে একটি স্ট্যাটিক ইনিশিয়ালাইজার সংজ্ঞায়িত করতে পারেন এবং আপনার মূল () পদ্ধতিতে আসার আগে একটি জিলিয়ন অবজেক্ট ইনস্ট্যান্ট করতে পারেন।


2

Protoype public static void main(String[])একটি কনভেনশন সংজ্ঞায়িত হয় JLS :

পদ্ধতিটির মূলটি অবশ্যই সর্বজনীন, স্থির এবং অকার্যকর হিসাবে ঘোষণা করতে হবে। এটি অবশ্যই একটি আনুষ্ঠানিক প্যারামিটার (§8.4.1) নির্দিষ্ট করতে হবে যার ঘোষিত প্রকারটি স্ট্রিংয়ের অ্যারে।

জেভিএম স্পেসিফিকেশন 5.2। ভার্চুয়াল মেশিন স্টার্ট-আপ আমরা পড়তে পারি:

জাভা ভার্চুয়াল মেশিনটি একটি প্রাথমিক ক্লাস তৈরি করে শুরু হয়, যা বুটস্ট্র্যাপ শ্রেণীর লোডার (§5.3.1) ব্যবহার করে প্রয়োগ-নির্ভর পদ্ধতিতে নির্দিষ্ট করা হয়। জাভা ভার্চুয়াল মেশিন তারপরে প্রাথমিক শ্রেণীর সাথে লিঙ্ক দেয়, এটি সূচনা করে এবং পাবলিক ক্লাস পদ্ধতিটি শূন্য মূল (স্ট্রিং []) কে আহ্বান করে । এই পদ্ধতির প্রার্থনাটি আরও সমস্ত কার্যকর করে। মূল পদ্ধতিটি গঠন করে জাভা ভার্চুয়াল মেশিনের নির্দেশাবলী কার্যকর করা অতিরিক্ত ক্লাস এবং ইন্টারফেসের সংযোগ স্থাপন করতে পারে (এবং ফলস্বরূপ সৃষ্টি), পাশাপাশি অতিরিক্ত পদ্ধতির ডাকতে পারে।

মজার বিষয়, জেভিএম স্পেসিফিকেশনে এটি উল্লেখ করা হয়নি যে মূল পদ্ধতিটি অচল থাকতে হবে। তবে অনুমানটি আরও বলেছে যে জাভা ভার্চুয়াল মেশিনটি 2 টি পদক্ষেপের আগে সম্পাদন করে:

কোনও শ্রেণি বা ইন্টারফেসের সূচনাতে এর শ্রেণি বা ইন্টারফেস প্রারম্ভিককরণ পদ্ধতি কার্যকর করা থাকে।

২.৯ সালে বিশেষ পদ্ধতি :

একটি শ্রেণি বা ইন্টারফেস প্রারম্ভিককরণ পদ্ধতিটি সংজ্ঞায়িত করা হয়:

কোনও শ্রেণি বা ইন্টারফেসের সর্বাধিক এক শ্রেণি বা ইন্টারফেস প্রারম্ভিককরণ পদ্ধতি থাকে এবং সেই পদ্ধতিটি শুরু করে (§5.5) আরম্ভ করা হয়। কোনও শ্রেণি বা ইন্টারফেসের সূচনা পদ্ধতির বিশেষ নাম রয়েছে <clinit>, কোনও যুক্তি গ্রহণ করে না এবং তা বাতিল and

এবং কোনও শ্রেণি বা ইন্টারফেস প্রারম্ভিককরণ পদ্ধতি অনুসরণ হিসাবে সংজ্ঞায়িত একটি উদাহরণ সূচনা পদ্ধতির থেকে পৃথক :

জাভা ভার্চুয়াল মেশিনের স্তরে, জাভা প্রোগ্রামিং ভাষা (JLS §8.8) তে লিখিত প্রত্যেক কন্সট্রাকটর একটি দৃষ্টান্ত আরম্ভের পদ্ধতি বিশেষ নাম আছে হিসাবে প্রদর্শিত হবে <init>

সুতরাং জেভিএম একটি শ্রেণি বা ইন্টারফেস প্রারম্ভিককরণ পদ্ধতি আরম্ভ করে না কোনও উদাহরণ সূচনা পদ্ধতি যা আসলে একজন নির্মাণকারী const সুতরাং তাদের উল্লেখ করার দরকার নেই যে প্রধান পদ্ধতিটি জেভিএম বৈশিষ্ট্যে স্থির থাকতে হবে কারণ এটি দ্বারা বোঝানো হয়েছে যে মূল পদ্ধতিটি কল করার আগে কোনও উদাহরণ তৈরি করা হয়নি।


2

publicশব্দ একটি অ্যাক্সেস পরিবর্তক, যা প্রোগ্রামার বর্গ সদস্যদের দৃশ্যমানতা নিয়ন্ত্রণ করার অনুমতি দেয়। যখন কোনও শ্রেণীর সদস্য এর আগে থাকে public, তখন সেই সদস্যটি ক্লাসের বাইরে কোড দ্বারা এটি ঘোষিত হতে পারে।

বিপরীত publicহয় private, যা তার ক্লাসের কোড সংজ্ঞায়িত বাহিরে দ্বারা ব্যবহৃত হচ্ছে থেকে একজন সদস্য বাধা দেয়।

এই ক্ষেত্রে, main()অবশ্যই এটি হিসাবে ঘোষণা করা উচিত public, যেহেতু প্রোগ্রামটি শুরু হওয়ার সাথে সাথে অবশ্যই এটির শ্রেণীর বাইরে কোড দ্বারা কল করা উচিত।

শ্রেণীর কোনও নির্দিষ্ট উদাহরণ ইনস্ট্যান্ট না করে কীওয়ার্ডটি কল করার staticঅনুমতি দেয় main()। এটি প্রয়োজনীয় কারণ যেহেতু main()কোনও বস্তু তৈরি হওয়ার আগে জাভা ইন্টারপ্রেটার বলে।

মূলশব্দটি voidসহজেই সংকলককে বলে যে main()কোনও মান দেয় না।


1

যে কোনও অ্যাপ্লিকেশনটিতে সত্যিকারের প্রবেশের বিন্দু একটি স্থির পদ্ধতি। যদি জাভা ভাষা "এন্ট্রি পয়েন্ট" হিসাবে কোনও উদাহরণ পদ্ধতির সমর্থন করে, তবে রানটাইমটিকে অভ্যন্তরীণভাবে এটি একটি স্থিতিশীল পদ্ধতি হিসাবে প্রয়োগ করা উচিত যা অবজেক্টের উদাহরণটি কল করার পরে অবজেক্টের একটি উদাহরণ তৈরি করে।

উপায়টি অতিক্রম করে, আমি নিম্নলিখিত তিনটি বিকল্পের একটি নির্দিষ্ট চয়ন করার যুক্তি পরীক্ষা করব:

  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. শ্রেণীর একটি উদাহরণ তৈরি করে (তারপরে এটি কিছুই করে না এবং কেবল ফিরে আসে)।

নীতি:

আমি এটির জন্য বিপরীতে যাব।

মনে রাখবেন যে জাভার অন্যতম নকশা লক্ষ্য হ'ল ভাল অবজেক্ট-ভিত্তিক প্রোগ্রামিং অনুশীলনের উপর জোর দেওয়া (যখন সম্ভব তখন প্রয়োজন)। এই প্রসঙ্গে, একটি অবজেক্টের কনস্ট্রাক্টর অবজেক্টটি আরম্ভ করে তবে বস্তুর আচরণের জন্য দায়বদ্ধ হওয়া উচিত নয়। অতএব, একটি স্পেসিফিকেশন যা এন্ট্রি পয়েন্ট দিয়েছে তাতে new ClassName()প্রতিটি অ্যাপ্লিকেশনটিতে একটি "আদর্শ" কনস্ট্রাক্টরের ডিজাইনের ব্যতিক্রম জোর করে নতুন জাভা বিকাশকারীদের পরিস্থিতি গুলিয়ে ফেলবে।

করা হলে main()একটি দৃষ্টান্ত পদ্ধতি, উপরে সমস্যা অবশ্যই মীমাংসিত হয়। তবে এন্ট্রি ক্লাসের কনস্ট্রাক্টরের স্বাক্ষরের পাশাপাশি main()পদ্ধতির স্বাক্ষরের তালিকা তৈরি করার জন্য স্পেসিফিকেশনটির প্রয়োজনীয়তা তৈরি করে জটিলতা তৈরি করে ।

সংক্ষেপে বলা যায়, একটি নির্দিষ্ট static void main()সময় পদ্ধতি মধ্যে আচরণ স্থাপন নীতিকে লগ্ন অন্তত জটিলতা সঙ্গে একটি স্পেসিফিকেশন সৃষ্টি । এমন একটি main()পদ্ধতি প্রয়োগ করা কতটা সোজা কথা বিবেচনা করে যা নিজেই একটি শ্রেণীর উদাহরণ তৈরি করে এবং একটি উদাহরণ পদ্ধতি কল করে, উদাহরণ পদ্ধতি main()হিসাবে উল্লেখ করার কোনও সত্যিকারের সুবিধা নেই ।


1
এই শুধু প্রশ্ন ভিক্ষা হয়। জাভাতে যাইহোক কোনও অ্যাপ্লিকেশন লোডার দরকার যা কল করার আগে ভারী উত্তোলন করে mainmainনতুনদের পক্ষে খুব জটিল হওয়ার বিষয়ে আপনার যুক্তি অবিশ্বাস্য মনে হয়। বস্তুত, স্ট্যাটিক mainহয় খুব নতুনদের জন্য বিভ্রান্তিকর, আমার সন্দেহ একটি কন্সট্রাকটর আরো যাতে হবে। আপনি বলছেন যে "অবজেক্টের আচরণের জন্য একজন কনস্ট্রাক্টরকে দায়বদ্ধ করা উচিত নয়"। এটি আকর্ষণীয় শোনায় তবে আমি নিশ্চিত নই যে আমি রাজি হই। কেন হয় না? কী এটিকে বাধা দেয়?
কনরাড রুডলফ

1

স্থিতিশীল - যখন জেভিএম মূল পদ্ধতিতে কল দেয় তখন শ্রেণীর কল করার জন্য উপস্থিত কোনও অস্তিত্ব থাকে না সুতরাং ক্লাস থেকে প্রার্থনার অনুমতি দেওয়ার জন্য এটি স্ট্যাটিক পদ্ধতি থাকতে হবে।


1

আমি জানি না যে জেভিএম বস্তুগুলি ইনস্ট্যান্ট করার আগে প্রধান পদ্ধতিটি কল করে কিনা ... তবে মূল () পদ্ধতিটি স্থির হওয়ার আরও অনেক বেশি শক্তিশালী কারণ আছে ... যখন জেভিএম ক্লাসের মূল পদ্ধতিটি কল করে (বলুন) , ব্যক্তি)। এটি " পার্সন.মাইন () " দ্বারা প্রার্থনা করে । আপনি দেখুন, জেভিএম এটি শ্রেণীর নাম দ্বারা প্রার্থনা করে। এজন্য মূল () পদ্ধতিটি স্থির এবং সর্বজনীন হওয়ার কথা রয়েছে যাতে এটি জেভিএম দ্বারা অ্যাক্সেস করা যায়।

আশা করি এটি সাহায্য করেছে। যদি তা করে থাকে তবে আমাকে মন্তব্য করে জানান।


0

স্থির পদ্ধতিতে কোনও বস্তুর প্রয়োজন হয় না। এটি সরাসরি তাই সরাসরি চালায়।


0

মূল পদ্ধতিতে স্ট্যাটিক কী শব্দটি ব্যবহৃত হয় কারণ মূল পদ্ধতিতে কোনও ইনস্ট্যান্টেশন নেই isn't তবে অবজেক্টটি অনুরোধের পরিবর্তে নির্মিত হয় ফলাফল হিসাবে আমরা স্থিত কী শব্দটি মূল পদ্ধতিতে ব্যবহার করি। Jvm প্রসঙ্গে মেমরি তৈরি হয় যখন শ্রেণি এতে লোড হয় nd এবং সমস্ত স্ট্যাটিক সদস্য সেই মেমরিতে উপস্থিত থাকে। এখন যদি আমরা মূল স্থিতিশীল করি তবে এটি মেমরির মধ্যে থাকবে এবং jvm (class.main (..)) এ অ্যাক্সেসযোগ্য হতে পারে তাই আমরা গাদা তৈরির প্রয়োজন ছাড়াও মূল পদ্ধতিকে কল করতে পারি।


0

এটি কেবল একটি সম্মেলন হিসাবে আমরা এখানে দেখতে পাচ্ছি:

পদ্ধতিটি অবশ্যই সর্বজনীন এবং স্থির হিসাবে ঘোষণা করা উচিত, এটির কোনও মান অবশ্যই ফেরত দেওয়া উচিত নয় এবং এটি অবশ্যই প্যারামিটার হিসাবে একটি স্ট্রিং অ্যারে গ্রহণ করতে হবে। ডিফল্টরূপে, প্রথম অ-বিকল্প যুক্তিটি হ'ল শ্রেণীর নামটি চাওয়া হয়। একটি সম্পূর্ণ দক্ষ শ্রেণীর নাম ব্যবহার করা উচিত। যদি -jजर বিকল্পটি সুনির্দিষ্ট করা হয়, তবে প্রথম অ-বিকল্পের আর্গুমেন্টটি জেআর আর্কাইভের নাম যা অ্যাপ্লিকেশনের জন্য শ্রেণি এবং সংস্থান ফাইল রয়েছে, যার সাথে মেন-ক্লাস ম্যানিফেস্ট শিরোনাম নির্দেশিত স্টার্টআপ ক্লাস রয়েছে।

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


ভাষার নিয়ম, আপনি বলতে চাইছেন।
মার্কুইস

0

পাবলিক স্ট্যাটিক অকার্যকর কীওয়ার্ডগুলির অর্থ জাভা ভার্চুয়াল মেশিন (জেভিএম) ইন্টারপ্রেটার ক্লাসের কোনও উদাহরণ (স্থির) তৈরি না করেই প্রোগ্রামটি শুরু করার জন্য প্রোগ্রামের প্রধান পদ্ধতিটি (জনসাধারণ) কল করতে পারে এবং প্রোগ্রামটি জাভা ভিএম ইন্টারপ্রেটারকে ডেটা ফেরায় না (অকার্যকর) এটি শেষ হলে।

উত্স: প্রয়োজনীয়, পার্ট 1, পাঠ 2: বিল্ডিং অ্যাপ্লিকেশন


0

মূলত আমরা সেই ডেটা সদস্য এবং সদস্য ফাংশনগুলিকে স্ট্যাটিক হিসাবে তৈরি করি যা কোনও বস্তুর সাথে সম্পর্কিত কোনও কাজ সম্পাদন করে না। এবং প্রধান পদ্ধতির ক্ষেত্রে, আমরা এটি স্ট্যাটিক হিসাবে তৈরি করছি কারণ এটি বস্তুর সাথে কিছুই করার নয় কারণ মূল পদ্ধতিটি সর্বদা চালিত হয় যে আমরা কোনও বস্তু তৈরি করছি কিনা তা নয়।


0

জাভাতে স্থিতিশীল হিসাবে ঘোষিত যে কোনও পদ্ধতি ক্লাসের অন্তর্গত। আবার নির্দিষ্ট শ্রেণির স্থির পদ্ধতিতে কেবল শ্রেণীর মতো উল্লেখ করে অ্যাক্সেস করা যায়Class_name.method_name();

সুতরাং স্থির পদ্ধতিতে অ্যাক্সেস করার আগে কোনও শ্রেণীর তাত্ক্ষণিক হওয়া দরকার না।

সুতরাং মূল () পদ্ধতিটি এমনভাবে ঘোষণা করা হয়েছে staticযাতে that শ্রেণীর কোনও অবজেক্ট তৈরি না করেই এটি অ্যাক্সেস করা যায়।

যেহেতু আমরা ক্লাসের নাম যেখানে প্রোগ্রামটি মূল পদ্ধতিটি উপস্থিত রয়েছে (বা যেখান থেকে প্রোগ্রামটির কার্যকরকরণ শুরু হওয়া উচিত, কোনও main()পদ্ধতি ছাড়াই ক্লাসগুলির জন্য প্রযোজ্য ) (অ্যাডভান্সড লেভেল) সংরক্ষণ করুন। সুতরাং উপরোক্ত উপায় দ্বারা:

Class_name.method_name();

প্রধান পদ্ধতি অ্যাক্সেস করা যেতে পারে।

সংক্ষেপে যখন প্রোগ্রামটি সংকলিত হয় তখন main()এটি Stringযুক্তিযুক্ত পদ্ধতিটির পদ্ধতি অনুসন্ধান করে : main(String args[])উল্লিখিত শ্রেণিতে (অর্থাত্ প্রোগ্রামটির নাম অনুসারে), এবং শুরু থেকেই এটির সেই শ্রেণিটি ইনস্ট্যান্ট করার কোনও সুযোগ নেই, তাই মূল () পদ্ধতি স্থির হিসাবে ঘোষণা করা হয়।


প্রোগ্রামটি কার্যকর করা হয়, সংকলিত না হলে এটি ঘটে।
মারকুইস

0

Java.sun.com থেকে (সাইটে আরও তথ্য রয়েছে):

প্রধান পদ্ধতি হ'ল জাভা ভিএম ইন্টারপ্রেটারকে প্রথমে কন্ট্রোল ক্লাসের উদাহরণ তৈরি না করে ক্লাস শুরু করার উপায় দেওয়া। প্রোগ্রামটি শুরু হওয়ার পরে নিয়ন্ত্রণ পদ্ধতিটির উদাহরণগুলি মূল পদ্ধতিতে তৈরি করা হয়।

আমার বোধগম্যতা সর্বদা সহজভাবে ছিল যে কোনও স্থির পদ্ধতির মতোই মূল পদ্ধতিটি সম্পর্কিত শ্রেণীর কোনও উদাহরণ তৈরি না করেই প্রোগ্রামটির অন্য কোনও কিছুর আগে চালানোর অনুমতি দেয়। যদি এটি স্থির না থাকে তবে আপনাকে কোনও বস্তু বলার আগে তা ইনস্ট্যান্ট করতে হবে - যা একটি 'মুরগী ​​এবং ডিম' সমস্যা তৈরি করে, যেহেতু প্রোগ্রামের শুরুতে আপনি মূল পদ্ধতিটি সাধারণত যা ব্যবহার করেন।


তবে এটি "প্রোগ্রামের অন্য কোনও কিছুর আগে" চালায় না । পুরো যুক্তিটি একটি ত্রুটিযুক্ত বিষয় এবং আরও কী এটি এটির প্রথম উল্লেখ নয়, এমনকি দ্বিতীয় বা তৃতীয়ও নয়।
কনরাড রুডলফ

আমি দুঃখিত যে আমার উত্তরটি অন্যেরা যা বলেছে তার পুনরাবৃত্তি করে; আমি কেবল আমার বোধগম্যতার জন্য এবং আমি অনলাইনে যা খুঁজে পেতে পারি তার উত্তর দিয়েছি। যে ফলাফলগুলি আমি দেখেছি তার মধ্যে প্রধান পদ্ধতিটি স্থির কেন তা নিয়ে অন্য কোনও কারণ নেই; কোথাও কোথাও গভীরভাবে লুকানো না থাকলে সম্ভবত এটিই কেবল উত্তর। জাভা সম্পর্কে আমার উপলব্ধি মোটামুটি প্রাথমিক, তবে আমি উপরের কারণটি শুনেছি (অধ্যাপকগণ, পাঠ্যপুস্তক ইত্যাদির কাছ থেকে) এবং অন্য কোনওটিই নয়।
জেসি এম

@ জেস এম আপনার মন্তব্যটি তখনই কার্যকর হবে যদি আপনি প্রথমে অন্যান্য উত্তরগুলি পড়াও বিবেচনা না করেন। যাইহোক, এটি করা খুব দূরের জিনিস নয়। যেমন আপনি নিজের উল্লেখ করেছেন, আপনার বোঝাপড়াটি মোটামুটি বেসিক তাই এটি খুব সম্ভবত যে ইতিমধ্যে অন্য কেউ আরও দক্ষতার সাথে প্রশ্নের উত্তর দিয়েছিল। এবং আপনার উত্তরটি আরও ভাল দেখতে আপনার মন্তব্যটি একটি যুক্তিযুক্ত বলে মনে হচ্ছে। এটি একটি অসাধারণ দাবি যে আপনার জাভা পাঠ্যপুস্তক এবং অধ্যাপকরা আছেন যা আপনি যা দাবি করেন তা মনে করে এবং সত্যই আমি বিশ্বাস করি তারা যা করে do (কোনও রেফারেন্স?)
লিওআর

1
@ কনরাড রুডল্ফ শীর্ষ মন্তব্যগুলি বেশ যুক্তিসঙ্গত বলে মনে হচ্ছে। মুখ্য () প্রোগ্রামটিতে একটি এন্ট্রি পয়েন্ট হিসাবে ব্যবহৃত হয় এবং জাভা ওয়েবসাইটটিতে বেশ কয়েকটি উল্লেখ রয়েছে যে এটি সি / সি ++ এর মূল () ফাংশনটি কীভাবে করবে তার অনুরূপ বলে মনে করা হচ্ছে। জাভা হ'ল সমস্ত অবজেক্টস, বস্তুর তাত্পর্য এড়াতে এটি স্থির থাকতে হবে be এটি স্থির রাখার ফলে এটি রানটাইমগুলিতে জেভিএম-এ লোড এবং এক্সিকিউটেবল হতে দেয়। আমি কেবল পূর্ববর্তী উত্তরগুলিকে পুনর্গঠন করছি, তবে আপনি কী সন্তোষজনক উত্তর বিবেচনা করবেন তা আমি ভাবছি। আমি মনে করি আপনি সবচেয়ে ভাল পাবেন "তারা এভাবেই চেয়েছিল" how জাভাটি তৈরি হওয়ার তারিখটি মনে রাখবেন।
ট্রেভর-ই

1
@ জেসি স্পট-অন। এটি সম্পূর্ণভাবে সম্ভব যে এটি নিছক সম্মেলনের বিষয় (যদিও আমি আশা করি এটি এটি নয়, এটি এমন বিরক্তিকর উত্তর হবে)। এই প্রশ্নের প্রতি আমার আসল আগ্রহটি কারণ আমি ভেবেছিলাম যে "চলমান অ্যাপ্লিকেশন" অবজেক্টটি উপস্থাপনের জন্য একটি যথাযথ উদাহরণ ব্যবহার করা এবং এ ক্লাসের একটি পদ্ধতি (বা নির্মাণকারী) হওয়া এন্ট্রি পয়েন্টটি অনেক বেশি স্পষ্ট নকশা হবে, কারণ জাভা get এর যান থেকে ওরিয়েন্টেড অবজেক্ট হতে হবে পরিকল্পনা করা হয়েছিল এবং যেহেতু আপাতদৃষ্টিতে অনুরূপ বস্তু (থ্রেড মাধ্যমে Runnable) জাভা না এই নকশা ব্যবহার করুন। কেন এখানে (আপাত) ব্যতিক্রম?
কনরাড রুডল্ফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.