জাভা প্রধান () পদ্ধতির পদ্ধতির স্বাক্ষরটি হ'ল:
public static void main(String[] args){
...
}
এই পদ্ধতিটি অচল হওয়ার কোনও কারণ আছে কি?
জাভা প্রধান () পদ্ধতির পদ্ধতির স্বাক্ষরটি হ'ল:
public static void main(String[] args){
...
}
এই পদ্ধতিটি অচল হওয়ার কোনও কারণ আছে কি?
উত্তর:
পদ্ধতিটি স্থির কারণ অন্যথায় অস্পষ্টতা থাকবে: কোন নির্মাণকারীকে ডাকা উচিত? বিশেষত যদি আপনার শ্রেণিটি এমন দেখাচ্ছে:
public class JavaClass{
protected JavaClass(int x){}
public void main(String[] args){
}
}
জেভিএম কল করা উচিত new JavaClass(int)? এটি কি জন্য পাস করা উচিত x?
যদি তা না হয়, JavaClassকোন কনস্ট্রাক্টর পদ্ধতি না চালিয়ে জেভিএম ইনস্ট্যান্ট করা উচিত ? আমি মনে করি এটি করা উচিত নয়, কারণ এটি আপনার পুরো শ্রেণীর বিশেষ ক্ষেত্রে ঘটবে - কখনও কখনও আপনার এমন নজির থাকে যা প্রাথমিকভাবে শুরু করা হয়নি, এবং আপনাকে যে পদ্ধতিতে ডাকা যেতে পারে সেগুলি পরীক্ষা করে দেখতে হবে।
এন্ট্রি পয়েন্ট বলার আগে জেভিএমকে কোনও শ্রেণি ইনস্ট্যান্ট করতে হবে তা বোঝার জন্য এটির জন্য অনেকগুলি প্রান্তের মামলা এবং অস্পষ্টতা রয়েছে। এজন্যই mainঅচল।
যদিও mainসবসময় চিহ্নিত করা হয় তা আমার কোনও ধারণা নেই public।
public static void mainএটি একটি এন্ট্রি পয়েন্টের চিহ্নিতকারী হিসাবে কাজ করে - একটি পাবলিক প্যারামিটারলেস কনস্ট্রাক্টর চিৎকার করে না "এটি সম্ভবত একটি এন্ট্রি পয়েন্ট!" একই পথে.
main। অদ্ভুতভাবে যথেষ্ট (আপনার জন্য), জেভিএম এটি ঠিকঠাক পরিচালনা করে।
এটি কেবল কনভেনশন। আসলে, এমনকি নামের প্রধান () এবং যুক্তিগুলি নিখুঁতভাবে কনভেনশন।
আপনি যখন java.exe (বা উইন্ডোতে javaw.exe) চালান, আসলে যা ঘটছে তা হল জাভা নেটিভ ইন্টারফেস (জেএনআই) কল calls এই কলগুলি সেই ডিএলএল লোড করে যা সত্যই জেভিএম (এটি ঠিক - java.exe জেভিএম নয়)। ভার্চুয়াল মেশিন ওয়ার্ল্ড, এবং সি, সি ++ ইত্যাদির বিশ্ব ব্রিজ করতে যখন আমরা ব্যবহার করি তখন জেএনআই হ'ল ... বিপরীতটিও সত্য - এটি সম্ভব নয় (অন্তত আমার জ্ঞানের কাছে) আসলে একটি পাওয়ার জন্য জেভিএম জেএনআই ব্যবহার না করে চলছে।
মূলত, java.exe একটি সুপার সিম্পল সি অ্যাপ্লিকেশন যা কমান্ড লাইনটি পার্স করে, JVM এ একটি নতুন স্ট্রিং অ্যারে তৈরি করে সেই যুক্তিগুলি ধরে রাখে, আপনি মেইন () হিসাবে চিহ্নিত শ্রেণীর নামটি বিশ্লেষণ করেন, JNI কলগুলি সন্ধান করতে ব্যবহার করেন প্রধান () পদ্ধতিটি নিজেই, তারপরে প্যারামিটার হিসাবে সদ্য নির্মিত স্ট্রিং অ্যারে পেরিয়ে প্রধান () পদ্ধতিটি আহ্বান করে। এটি জাভা থেকে প্রতিবিম্ব ব্যবহার করার সময় আপনি যা করেন তা খুব বেশি - এটি কেবল বিভ্রান্তিকরভাবে নেটিভ ফাংশন কল ব্যবহার করে।
আপনার নিজের জাভা.এক্সই সংস্করণটি লেখার পক্ষে উত্সটি আইনী হবে (উত্সটি জেডিকে দিয়ে বিতরণ করা হয়েছে) এবং এটি সম্পূর্ণ আলাদা কিছু করেছে। আসলে, আমরা আমাদের জাভা ভিত্তিক অ্যাপ্লিকেশনগুলির সাথে ঠিক এটি করি।
আমাদের প্রতিটি জাভা অ্যাপের নিজস্ব লঞ্চার রয়েছে। আমরা প্রাথমিকভাবে এটি করি তাই আমরা আমাদের নিজস্ব আইকন এবং প্রক্রিয়াটির নাম পাই তবে এটি অন্যান্য পরিস্থিতিতে কার্যকর হয়েছে যেখানে আমরা নিয়মিত মেইন () কলগুলি ছাড়া কিছু করতে চাই (উদাহরণস্বরূপ, একটি ক্ষেত্রে আমরা করছি) COM আন্তঃব্যবযোগিতা, এবং আমরা আসলে একটি স্ট্রিং অ্যারের পরিবর্তে মূল () এ একটি COM হ্যান্ডেলটি পাস করি।
সুতরাং, দীর্ঘ এবং সংক্ষিপ্ত: এটি স্থির হওয়ার কারণটি বি / সি যে সুবিধাজনক। একে 'প্রধান' বলা হওয়ার কারণটি হ'ল এটি কিছু হতে হয়েছিল এবং প্রধান () হ'ল সি এর পুরানো দিনগুলিতে তারা কী করেছিল (এবং সেই দিনগুলিতে ফাংশনের নামটি গুরুত্বপূর্ণ ছিল )। আমি মনে করি যে জাভা.এক্সই আপনাকে কেবলমাত্র ক্লাস (জাভা কম.এম.কম্পানি.ফু.সোম স্পেশালমেন) এর পরিবর্তে একটি সম্পূর্ণ যোগ্য প্রধান পদ্ধতির নাম উল্লেখ করতে পারত - তবে এটি আইডিইগুলিতে স্বয়ংক্রিয় সনাক্তকরণকে আরও শক্ত করে তোলে ' একটি প্রকল্পে প্রবর্তনযোগ্য ক্লাস।
java.exe)
staticনা যে main()ঘোষণাপত্রটি কেবল সম্মেলনের স্বার্থে। যদিও এটি 'মেন (') এবং অন্য কিছু নয় তবে এটি বাস্তবসম্মত।
mainঅ স্থিতিশীল তৈরি করতে পারে এবং এখনও ভাষার সীমানার মধ্যে ফিট করে। ডিজাইনারদের কাছ থেকে শ্রবণ না করে, আমাদের কেবল একমত হতে সম্মত হতে হবে। :)
main()পদ্ধতি C++, C#এবং Javaস্ট্যাটিক হয়
কারণ তারা তারপর রানটাইম ইঞ্জিন দ্বারা প্রার্থনা করা যেতে পারে ছাড়া শরীরের কোন বস্তু তারপর কোড instantiate করা হচ্ছে main()বাকি কাজগুলি করে দেবে।
public static void main...কেন কনভেনশন হতে পারে না যে অ্যাপ্লিকেশন এন্ট্রি পয়েন্ট শ্রেণিতে সর্বজনীন ডিফল্ট নির্মাতা থাকতে হবে?
static void mainফোন করতে ওভারলোড হয়েছে? মোটেই সমস্যা নয়।
staticপদ্ধতিগুলি । mainnew
এইভাবে জাভা ল্যাঙ্গুয়েজ ডিজাইন করা হয়েছে এবং জাভা ভার্চুয়াল মেশিনটি ডিজাইন এবং লিখিত হয়েছে।
অধ্যায় 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);
... ...
mainস্থির না হয় তবে এর অর্থ শ্রেণীর উদাহরণের রাজ্যটি অবশ্যই জানা উচিত এবং এটি নির্ধারণ করা আরও জটিল, কোনটি নির্মাণকারী প্রথমে ব্যবহার করবেন like
public static void main(String arguments[])- তথ্যসূত্র: ওক ০.২ স্পেক ।
Runnable। পুরো প্রক্রিয়াটিকে একইভাবে উপস্থাপন করা (যেমন Runnable.Runএন্ট্রি পয়েন্ট হিসাবে থাকা) অবশ্যই জাভাতে বোঝায়। অবশ্যই Runnableজাভা বেনামে পদ্ধতি নেই (এই কারণে) যে কারণে জাভায় একটি তর্কযুক্ত ত্রুটি রয়েছে। তবে যেহেতু এটি ইতিমধ্যে আছে ...
আসুন কেবল ভান করা যাক, staticএপ্লিকেশন এন্ট্রি পয়েন্ট হিসাবে এটি প্রয়োজন হবে না।
একটি অ্যাপ্লিকেশন শ্রেণি এর পরে দেখতে হবে:
class MyApplication {
public MyApplication(){
// Some init code here
}
public void main(String[] args){
// real application code here
}
}
কনস্ট্রাক্টর কোড এবং mainপদ্ধতির মধ্যে পার্থক্য প্রয়োজনীয় কারণ ওও ভাষায় কোনও কনস্ট্রাক্টর কেবল তা নিশ্চিত করতে হবে, উদাহরণস্বরূপ সঠিকভাবে আরম্ভ করা হয়েছে । আরম্ভের পরে, উদাহরণটি "পরিষেবা" এর জন্য ব্যবহার করা যেতে পারে। সম্পূর্ণ অ্যাপ্লিকেশন কোডটি কন্সট্রাক্টরে রাখলে তা নষ্ট হয়ে যায়।
সুতরাং এই পদ্ধতির প্রয়োগের উপর তিনটি পৃথক চুক্তি বাধ্য করবে :
mainপদ্ধতি 1 । ঠিক আছে, এটি আশ্চর্যজনক নয়।abstract। অন্যথায়, জেভিএম এটি ইনস্ট্যান্ট করতে পারে না couldstaticঅন্যদিকে পদ্ধতির শুধুমাত্র প্রয়োজন এক চুক্তি:
mainপদ্ধতি অবশ্যই 1 থাকতে হবে ।এখানে না abstractএকাধিক কনস্ট্রাক্টরের বিষয়টি গুরুত্বপূর্ণ।
যেহেতু জাভা একটি সহজ ভাষা হতে পরিকল্পনা করা হয়েছিল ব্যবহারকারীর জন্য এটা বিস্ময়কর নয় যে আবেদন এন্ট্রি পয়েন্ট ব্যবহার করে একটি সহজ উপায় ডিজাইন করা হয়েছে এক চুক্তি এবং ব্যবহার করে একটি জটিল পথে নাই তিনটি স্বাধীন ও ভঙ্গুর চুক্তি।
দয়া করে নোট করুন: এই যুক্তিটি JVM এর ভিতরে বা জেআরই এর ভিতরে সরলতার বিষয়ে নয় । এই যুক্তিটি ব্যবহারকারীর পক্ষে সরলতার বিষয়ে ।
mainপদ্ধতি যা public, staticএবং স্বাক্ষর হয়েছে void main(String[])। সে ব্যাপারে আমি সম্মত, পদ্ধতি একটি দৃষ্টান্ত পদ্ধতি করত, JRE হবে সামান্য আরো কাজ কিন্তু ধরনের কাজের একই হতে হবে, এবং জটিলতা না উল্লেখযোগ্যভাবে বেশী (পূর্ববর্তী উত্তর মন্তব্যে আলোচনা দেখুন)। আমি বিশ্বাস করি না যে এই পার্থক্যটি এন্ট্রি পয়েন্টকে স্থির করার সিদ্ধান্ত গ্রহণের জন্য গুরুত্বপূর্ণ, বিশেষত যেহেতু একটি উদাহরণ পদ্ধতির সমাধানের জন্য প্রয়োজনীয় পদ্ধতি রয়েছে এবং তা সহজেই ব্যবহারযোগ্য।
static public main(String[])পদ্ধতি একটি স্বাক্ষর এবং সেইজন্য একটি চুক্তি। অন্যথায় তিনটি স্বাধীন চুক্তি অনুসরণ করতে হবে।
Runnable। স্পষ্টতই, জাভা আশা করে যে বিকাশকারীরা সর্বদা সেই চুক্তিটি অনুসরণ করে, কেন এটি অ্যাপ্লিকেশন এন্ট্রি পয়েন্টের জন্য খুব বেশি হওয়া উচিত? ওটা কোন অর্থ প্রকাশ করে না.
Threadও Runnableকোনও কিছুই গোপন থাকে না, তিনি পরিষ্কারভাবে দেখতে পাচ্ছেন কী ঘটছে এবং কেবলমাত্র তার চুক্তি অনুসারে চুক্তিগুলিই প্রয়োগ করতে হবে তার পরিবর্তন আছে - তিনি নিয়ন্ত্রণে আছেন, সিস্টেম নয়।
যদি এটি না হয় তবে একাধিকজন থাকলে কনস্ট্রাক্টর ব্যবহার করা উচিত?
জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনে জাভা প্রোগ্রামগুলির সূচনা ও সম্পাদনা সম্পর্কিত আরও তথ্য রয়েছে ।
মূল পদ্ধতিটি বলার আগে কোনও বস্তু তাত্ক্ষণিকভাবে চালিত হয় না। স্ট্যাটিক কীওয়ার্ড থাকা মানে প্রথমে কোনও বস্তু তৈরি না করেই পদ্ধতিটি কল করা যায়।
আমাকে এই বিষয়গুলি আরও সহজ উপায়ে ব্যাখ্যা করতে দাও:
public static void main(String args[])
অ্যাপলেট ব্যতীত সমস্ত জাভা অ্যাপ্লিকেশনগুলি এখান থেকে তাদের প্রয়োগ শুরু করে main()।
শব্দ publicএকটি অ্যাক্সেস পরিবর্তক যা সদস্য বর্গ বাইরে থেকে বলা যেতে অনুমতি দেয়।
staticএটি ব্যবহার করা হয় কারণ এটি main()শ্রেণীর কোনও নির্দিষ্ট উদাহরণ ইনস্ট্যান্ট না করে কল করার অনুমতি দেয় ।
voidইঙ্গিত করে যে main()কোনও মান ফেরত দেয় না।
এর অর্থ কী public static void main(String args[])?
public এমন এক অ্যাক্সেস স্পেসিফার যার অর্থ যে কেউ এভিএস / জাভা ভার্চুয়াল মেশিনের মতো এটিকে অ্যাক্সেস / আবেদন করতে পারে।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 */
}
}
একইভাবে, আমরা ব্যবহারকারীর সংজ্ঞায়িত পদ্ধতিগুলির জন্য কিছু সময় স্থিতিশীল ব্যবহার করি যাতে আমাদের অবজেক্টগুলি তৈরি করতে না হয়।
voidইঙ্গিত দেয় যে main()পদ্ধতিটি ঘোষিত হচ্ছে কোনও মান দেয় না।
String[] argsmain()পদ্ধতিতে একমাত্র পরামিতি নির্দিষ্ট করে ।
args- একটি পরামিতি যা শ্রেণীর ধরণের অবজেক্টগুলির একটি অ্যারে ধারণ করে String।
অ্যাপলেট, মিডলেটস, সার্লেটস এবং বিভিন্ন ধরণের মটরশুটিগুলি তৈরি করা হয় এবং তারপরে তাদের উপর লাইফেসাইক্যাল পদ্ধতিগুলি ডাকা হয়। মূল বর্ধন করানো মূল কাজটি যা মূল শ্রেণীর সাথে করা হয় তাই একাধিকবার বলা হয় এমন কোনও বস্তুর মধ্যে রাষ্ট্রের অধিষ্ঠিত হওয়ার দরকার নেই। অন্য ক্লাসে মুখ্য পিন করা একেবারে স্বাভাবিক (যদিও এটি দুর্দান্ত ধারণা নয়), যা ক্লাসটি ব্যবহার করে মূল অবজেক্টটি তৈরি করার পথে আসে।
এটি কেবল একটি সম্মেলন, তবে বিকল্পের চেয়ে সম্ভবত আরও সুবিধাজনক। একটি স্থিতিশীল প্রধান সহ, আপনার একটি জাভা প্রোগ্রাম শুরু করার জন্য যা জানা দরকার তা হ'ল একটি শ্রেণীর নাম এবং অবস্থান। যদি এটি স্থির না হয়, তবে আপনাকে কীভাবে সেই শ্রেণিটি ইনস্ট্যান্ট করতে হবে তা জানতে হবে, বা শ্রেণীর ফাঁকা নির্মাতা থাকতে হবে।
আপনি যখন javaকমান্ডটি সহ জাভা ভার্চুয়াল মেশিন (JVM) চালাবেন ,
java ClassName argument1 argument2 ...
আপনি যখন নিজের অ্যাপ্লিকেশনটি কার্যকর করেন, আপনি উপরের মত জাভা কমান্ডের আর্গুমেন্ট হিসাবে শ্রেণীর নামটি নির্দিষ্ট করেন
জেভিএম আপনার নির্দিষ্ট করা শ্রেণীর মূল পদ্ধতিটি আহ্বান করার চেষ্টা করে
এই মুহুর্তে, শ্রেণীর কোনও বস্তু তৈরি করা হয়নি।
ঘোষণা
mainস্ট্যাটিক যেমনallowsকরতে জেভিএমinvokeপ্রধানwithoutএকটি তৈরিinstanceক্লাসের।
কমান্ড ফিরে আসি
ClassNamecommand-line argumentJVM এর কাছে এটি একটি ক্লাসটি কার্যকর করা উচিত tells ClassName অনুসরণ করে, আপনি list of StringsJVM আপনার আবেদনে পাস হবে এমন কমান্ড-লাইন আর্গুমেন্ট হিসাবে একটি (স্পেস দ্বারা পৃথক) নির্দিষ্ট করতে পারেন । অ্যাপ্লিকেশনটি চালানোর জন্য বিকল্পগুলি (উদাহরণস্বরূপ, একটি ফাইলের নাম) নির্দিষ্ট করতে খুব যুক্তি ব্যবহার করা যেতে পারে - এই কারণেই মূলটিতে একটি প্যারামিটার বলা String[] argsহয়
তথ্যসূত্র: জাভা Program কীভাবে প্রোগ্রাম করুন (প্রাথমিক বিষয়গুলি), দশম সংস্করণ
সম্প্রতি, অনুরূপ প্রশ্ন প্রোগ্রামারস.এসইতে পোস্ট করা হয়েছে
জাভা এবং সি # কেন তাদের প্রবেশ বিন্দু হিসাবে একটি স্থিতিশীল পদ্ধতি রাখার সিদ্ধান্ত নিয়েছে - প্রাথমিকভাবে বা মাধ্যমিক উত্স থেকে একটি নির্দিষ্ট উত্তর খুঁজছেন - এন্ট্রি পয়েন্টটি কোনও
Applicationশ্রেণীর উদাহরণ দ্বারা কোনও প্রয়োগের উদাহরণকে উপস্থাপন করার পরিবর্তে উপযুক্ত নির্মাতা?
টিএল; স্বীকৃত উত্তরের ডিআর অংশটি হ'ল,
জাভা সালে কারণে
public static void main(String[] args)যে
- গোসলিং চেয়েছিল
- সি তে অভিজ্ঞ কারও দ্বারা লিখিত কোড (জাভাতে নয়)
- কেউ নিষ্পন্ন করা হবে চলমান করার জন্য ব্যবহৃত পোস্টস্ক্রিপ্ট উপর খবর
সি # এর জন্য, যুক্তিটি ট্রান্সজিটিভলি অনুরূপ তাই কথা বলতে। ভাষা ডিজাইনাররা জাভা থেকে আগত প্রোগ্রামারদের জন্য প্রোগ্রামের এন্ট্রি পয়েন্ট সিনট্যাক্সকে পরিচিত রাখে । সি # স্থপতি আন্ডার হেজলসবার্গ যেমন লিখেছেন ,... সি # এর সাথে আমাদের দৃষ্টিভঙ্গিটি কেবল জাভা প্রোগ্রামারদের একটি বিকল্প প্রস্তাব দেওয়া ছিল ...
...
আমি মনে করি কীওয়ার্ড 'স্ট্যাটিক' মূল পদ্ধতিটিকে একটি শ্রেণিবদ্ধ করে তোলে এবং শ্রেণি পদ্ধতিতে এর একটি মাত্র অনুলিপি থাকে এবং এটি সবার দ্বারা ভাগ করা যায় এবং এছাড়াও, এটি রেফারেন্সের জন্য কোনও সামগ্রীর প্রয়োজন হয় না। সুতরাং যখন ড্রাইভার শ্রেণিটি সঙ্কলিত হয় তখন মূল পদ্ধতিটি আহ্বান করা যেতে পারে। (আমি ঠিক জাভা বর্ণমালার স্তরে আছি, আমি ভুল হলে দুঃখিত)
প্রধান () স্থির কারণ; অ্যাপ্লিকেশনটির জীবনচক্রের সেই মুহুর্তে, কোনও বস্তু এখনও তাত্ক্ষণিকভাবে না থাকায় অ্যাপ্লিকেশন স্ট্যাকটি প্রকৃতির পদ্ধতিগত।
এটি একটি পরিষ্কার স্লেট। আপনার অ্যাপ্লিকেশনটি এই মুহুর্তে চলছে, কোনও বস্তু ঘোষিত না করেও (মনে রাখবেন, পদ্ধতিগত এবং ওও কোডিং ধরণ রয়েছে)। আপনি, বিকাশকারী হিসাবে, আপনার বস্তুর উদাহরণ তৈরি করে এবং এর মধ্যে সংকলিত কোডের উপর নির্ভর করে অ্যাপ্লিকেশনটিকে একটি অবজেক্ট-ওরিয়েন্টেড সমাধানে পরিণত করেন।
লক্ষ লক্ষ সুস্পষ্ট কারণে অবজেক্ট-ওরিয়েন্টেড দুর্দান্ত। তবে, সেই দিনগুলি চলে গেছে যখন বেশিরভাগ ভিবি বিকাশকারীরা নিয়মিত তাদের কোডে "গোটো" এর মতো কীওয়ার্ড ব্যবহার করেন। "গেটো" ভিবিতে একটি প্রক্রিয়াগত কমান্ড যা এর ওও প্রতিরূপ দ্বারা পরিবর্তিত হয়: পদ্ধতি প্রার্থনা।
আপনি স্থিতিশীল এন্ট্রি পয়েন্টকে (মূল) খাঁটি স্বাধীনতা হিসাবে দেখতে পারেন। জাভা যদি কোনও অবজেক্ট ইনস্ট্যান্ট করার জন্য এবং কেবল সেই দৃষ্টান্ত আপনাকে দৌড়ানোর জন্য উপস্থাপন করার পক্ষে যথেষ্ট আলাদা হত তবে আপনার কাছে কোনও প্রক্রিয়াগত অ্যাপ্লিকেশন লেখার বিকল্প নেই। জাভা যতটা কল্পনা করতে পারে তত কল্পনা করা সম্ভব, এমন অনেক পরিস্থিতিতে রয়েছে যা পদ্ধতিগত পদ্ধতির জন্য ডাকে।
এটি সম্ভবত খুব অস্পষ্ট উত্তর। মনে রাখবেন, "শ্রেণি" হ'ল আন্ত-সম্পর্কিত কোডের সংগ্রহ। "ইনস্ট্যান্স" হ'ল এই শ্রেণীর এক বিচ্ছিন্ন, জীবিত এবং শ্বাস ফেলা স্বায়ত্তশাসিত প্রজন্ম।
mainপৌঁছানোর আগেই তাত্ক্ষণিক হয়। এবং যদি আপনি মেইনযুক্ত ক্লাসে একটি স্ট্যাটিক কনস্ট্রাক্টর অন্তর্ভুক্ত করেন তবে এটি mainএকইভাবে কার্যকর করা হবে ।
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 সুতরাং তাদের উল্লেখ করার দরকার নেই যে প্রধান পদ্ধতিটি জেভিএম বৈশিষ্ট্যে স্থির থাকতে হবে কারণ এটি দ্বারা বোঝানো হয়েছে যে মূল পদ্ধতিটি কল করার আগে কোনও উদাহরণ তৈরি করা হয়নি।
publicশব্দ একটি অ্যাক্সেস পরিবর্তক, যা প্রোগ্রামার বর্গ সদস্যদের দৃশ্যমানতা নিয়ন্ত্রণ করার অনুমতি দেয়। যখন কোনও শ্রেণীর সদস্য এর আগে থাকে public, তখন সেই সদস্যটি ক্লাসের বাইরে কোড দ্বারা এটি ঘোষিত হতে পারে।
বিপরীত publicহয় private, যা তার ক্লাসের কোড সংজ্ঞায়িত বাহিরে দ্বারা ব্যবহৃত হচ্ছে থেকে একজন সদস্য বাধা দেয়।
এই ক্ষেত্রে, main()অবশ্যই এটি হিসাবে ঘোষণা করা উচিত public, যেহেতু প্রোগ্রামটি শুরু হওয়ার সাথে সাথে অবশ্যই এটির শ্রেণীর বাইরে কোড দ্বারা কল করা উচিত।
শ্রেণীর কোনও নির্দিষ্ট উদাহরণ ইনস্ট্যান্ট না করে কীওয়ার্ডটি কল করার staticঅনুমতি দেয়
main()। এটি প্রয়োজনীয় কারণ যেহেতু main()কোনও বস্তু তৈরি হওয়ার আগে জাভা ইন্টারপ্রেটার বলে।
মূলশব্দটি voidসহজেই সংকলককে বলে যে main()কোনও মান দেয় না।
যে কোনও অ্যাপ্লিকেশনটিতে সত্যিকারের প্রবেশের বিন্দু একটি স্থির পদ্ধতি। যদি জাভা ভাষা "এন্ট্রি পয়েন্ট" হিসাবে কোনও উদাহরণ পদ্ধতির সমর্থন করে, তবে রানটাইমটিকে অভ্যন্তরীণভাবে এটি একটি স্থিতিশীল পদ্ধতি হিসাবে প্রয়োগ করা উচিত যা অবজেক্টের উদাহরণটি কল করার পরে অবজেক্টের একটি উদাহরণ তৈরি করে।
উপায়টি অতিক্রম করে, আমি নিম্নলিখিত তিনটি বিকল্পের একটি নির্দিষ্ট চয়ন করার যুক্তি পরীক্ষা করব:
static void main()আজ আমরা এটি দেখতে।void main()একটি সুনির্দিষ্টভাবে তৈরি করা অবজেক্টকে ডাকা একটি উদাহরণ পদ্ধতি ।Program, তবে কার্যকরভাবে কার্যকরভাবে গঠিত হবে new Program())।static void main()
main()।void main()
new ClassName()।main()।new ClassName()
আমি এটির জন্য বিপরীতে যাব।
মনে রাখবেন যে জাভার অন্যতম নকশা লক্ষ্য হ'ল ভাল অবজেক্ট-ভিত্তিক প্রোগ্রামিং অনুশীলনের উপর জোর দেওয়া (যখন সম্ভব তখন প্রয়োজন)। এই প্রসঙ্গে, একটি অবজেক্টের কনস্ট্রাক্টর অবজেক্টটি আরম্ভ করে তবে বস্তুর আচরণের জন্য দায়বদ্ধ হওয়া উচিত নয়। অতএব, একটি স্পেসিফিকেশন যা এন্ট্রি পয়েন্ট দিয়েছে তাতে new ClassName()প্রতিটি অ্যাপ্লিকেশনটিতে একটি "আদর্শ" কনস্ট্রাক্টরের ডিজাইনের ব্যতিক্রম জোর করে নতুন জাভা বিকাশকারীদের পরিস্থিতি গুলিয়ে ফেলবে।
করা হলে main()একটি দৃষ্টান্ত পদ্ধতি, উপরে সমস্যা অবশ্যই মীমাংসিত হয়। তবে এন্ট্রি ক্লাসের কনস্ট্রাক্টরের স্বাক্ষরের পাশাপাশি main()পদ্ধতির স্বাক্ষরের তালিকা তৈরি করার জন্য স্পেসিফিকেশনটির প্রয়োজনীয়তা তৈরি করে জটিলতা তৈরি করে ।
সংক্ষেপে বলা যায়, একটি নির্দিষ্ট static void main()সময় পদ্ধতি মধ্যে আচরণ স্থাপন নীতিকে লগ্ন অন্তত জটিলতা সঙ্গে একটি স্পেসিফিকেশন সৃষ্টি । এমন একটি main()পদ্ধতি প্রয়োগ করা কতটা সোজা কথা বিবেচনা করে যা নিজেই একটি শ্রেণীর উদাহরণ তৈরি করে এবং একটি উদাহরণ পদ্ধতি কল করে, উদাহরণ পদ্ধতি main()হিসাবে উল্লেখ করার কোনও সত্যিকারের সুবিধা নেই ।
main। mainনতুনদের পক্ষে খুব জটিল হওয়ার বিষয়ে আপনার যুক্তি অবিশ্বাস্য মনে হয়। বস্তুত, স্ট্যাটিক mainহয় খুব নতুনদের জন্য বিভ্রান্তিকর, আমার সন্দেহ একটি কন্সট্রাকটর আরো যাতে হবে। আপনি বলছেন যে "অবজেক্টের আচরণের জন্য একজন কনস্ট্রাক্টরকে দায়বদ্ধ করা উচিত নয়"। এটি আকর্ষণীয় শোনায় তবে আমি নিশ্চিত নই যে আমি রাজি হই। কেন হয় না? কী এটিকে বাধা দেয়?
স্থিতিশীল - যখন জেভিএম মূল পদ্ধতিতে কল দেয় তখন শ্রেণীর কল করার জন্য উপস্থিত কোনও অস্তিত্ব থাকে না সুতরাং ক্লাস থেকে প্রার্থনার অনুমতি দেওয়ার জন্য এটি স্ট্যাটিক পদ্ধতি থাকতে হবে।
আমি জানি না যে জেভিএম বস্তুগুলি ইনস্ট্যান্ট করার আগে প্রধান পদ্ধতিটি কল করে কিনা ... তবে মূল () পদ্ধতিটি স্থির হওয়ার আরও অনেক বেশি শক্তিশালী কারণ আছে ... যখন জেভিএম ক্লাসের মূল পদ্ধতিটি কল করে (বলুন) , ব্যক্তি)। এটি " পার্সন.মাইন () " দ্বারা প্রার্থনা করে । আপনি দেখুন, জেভিএম এটি শ্রেণীর নাম দ্বারা প্রার্থনা করে। এজন্য মূল () পদ্ধতিটি স্থির এবং সর্বজনীন হওয়ার কথা রয়েছে যাতে এটি জেভিএম দ্বারা অ্যাক্সেস করা যায়।
আশা করি এটি সাহায্য করেছে। যদি তা করে থাকে তবে আমাকে মন্তব্য করে জানান।
মূল পদ্ধতিতে স্ট্যাটিক কী শব্দটি ব্যবহৃত হয় কারণ মূল পদ্ধতিতে কোনও ইনস্ট্যান্টেশন নেই isn't তবে অবজেক্টটি অনুরোধের পরিবর্তে নির্মিত হয় ফলাফল হিসাবে আমরা স্থিত কী শব্দটি মূল পদ্ধতিতে ব্যবহার করি। Jvm প্রসঙ্গে মেমরি তৈরি হয় যখন শ্রেণি এতে লোড হয় nd এবং সমস্ত স্ট্যাটিক সদস্য সেই মেমরিতে উপস্থিত থাকে। এখন যদি আমরা মূল স্থিতিশীল করি তবে এটি মেমরির মধ্যে থাকবে এবং jvm (class.main (..)) এ অ্যাক্সেসযোগ্য হতে পারে তাই আমরা গাদা তৈরির প্রয়োজন ছাড়াও মূল পদ্ধতিকে কল করতে পারি।
এটি কেবল একটি সম্মেলন হিসাবে আমরা এখানে দেখতে পাচ্ছি:
পদ্ধতিটি অবশ্যই সর্বজনীন এবং স্থির হিসাবে ঘোষণা করা উচিত, এটির কোনও মান অবশ্যই ফেরত দেওয়া উচিত নয় এবং এটি অবশ্যই প্যারামিটার হিসাবে একটি স্ট্রিং অ্যারে গ্রহণ করতে হবে। ডিফল্টরূপে, প্রথম অ-বিকল্প যুক্তিটি হ'ল শ্রেণীর নামটি চাওয়া হয়। একটি সম্পূর্ণ দক্ষ শ্রেণীর নাম ব্যবহার করা উচিত। যদি -jजर বিকল্পটি সুনির্দিষ্ট করা হয়, তবে প্রথম অ-বিকল্পের আর্গুমেন্টটি জেআর আর্কাইভের নাম যা অ্যাপ্লিকেশনের জন্য শ্রেণি এবং সংস্থান ফাইল রয়েছে, যার সাথে মেন-ক্লাস ম্যানিফেস্ট শিরোনাম নির্দেশিত স্টার্টআপ ক্লাস রয়েছে।
http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html#description
পাবলিক স্ট্যাটিক অকার্যকর কীওয়ার্ডগুলির অর্থ জাভা ভার্চুয়াল মেশিন (জেভিএম) ইন্টারপ্রেটার ক্লাসের কোনও উদাহরণ (স্থির) তৈরি না করেই প্রোগ্রামটি শুরু করার জন্য প্রোগ্রামের প্রধান পদ্ধতিটি (জনসাধারণ) কল করতে পারে এবং প্রোগ্রামটি জাভা ভিএম ইন্টারপ্রেটারকে ডেটা ফেরায় না (অকার্যকর) এটি শেষ হলে।
মূলত আমরা সেই ডেটা সদস্য এবং সদস্য ফাংশনগুলিকে স্ট্যাটিক হিসাবে তৈরি করি যা কোনও বস্তুর সাথে সম্পর্কিত কোনও কাজ সম্পাদন করে না। এবং প্রধান পদ্ধতির ক্ষেত্রে, আমরা এটি স্ট্যাটিক হিসাবে তৈরি করছি কারণ এটি বস্তুর সাথে কিছুই করার নয় কারণ মূল পদ্ধতিটি সর্বদা চালিত হয় যে আমরা কোনও বস্তু তৈরি করছি কিনা তা নয়।
জাভাতে স্থিতিশীল হিসাবে ঘোষিত যে কোনও পদ্ধতি ক্লাসের অন্তর্গত। আবার নির্দিষ্ট শ্রেণির স্থির পদ্ধতিতে কেবল শ্রেণীর মতো উল্লেখ করে অ্যাক্সেস করা যায়Class_name.method_name();
সুতরাং স্থির পদ্ধতিতে অ্যাক্সেস করার আগে কোনও শ্রেণীর তাত্ক্ষণিক হওয়া দরকার না।
সুতরাং মূল () পদ্ধতিটি এমনভাবে ঘোষণা করা হয়েছে staticযাতে that শ্রেণীর কোনও অবজেক্ট তৈরি না করেই এটি অ্যাক্সেস করা যায়।
যেহেতু আমরা ক্লাসের নাম যেখানে প্রোগ্রামটি মূল পদ্ধতিটি উপস্থিত রয়েছে (বা যেখান থেকে প্রোগ্রামটির কার্যকরকরণ শুরু হওয়া উচিত, কোনও main()পদ্ধতি ছাড়াই ক্লাসগুলির জন্য প্রযোজ্য ) (অ্যাডভান্সড লেভেল) সংরক্ষণ করুন। সুতরাং উপরোক্ত উপায় দ্বারা:
Class_name.method_name();
প্রধান পদ্ধতি অ্যাক্সেস করা যেতে পারে।
সংক্ষেপে যখন প্রোগ্রামটি সংকলিত হয় তখন main()এটি Stringযুক্তিযুক্ত পদ্ধতিটির পদ্ধতি অনুসন্ধান করে : main(String args[])উল্লিখিত শ্রেণিতে (অর্থাত্ প্রোগ্রামটির নাম অনুসারে), এবং শুরু থেকেই এটির সেই শ্রেণিটি ইনস্ট্যান্ট করার কোনও সুযোগ নেই, তাই মূল () পদ্ধতি স্থির হিসাবে ঘোষণা করা হয়।
Java.sun.com থেকে (সাইটে আরও তথ্য রয়েছে):
প্রধান পদ্ধতি হ'ল জাভা ভিএম ইন্টারপ্রেটারকে প্রথমে কন্ট্রোল ক্লাসের উদাহরণ তৈরি না করে ক্লাস শুরু করার উপায় দেওয়া। প্রোগ্রামটি শুরু হওয়ার পরে নিয়ন্ত্রণ পদ্ধতিটির উদাহরণগুলি মূল পদ্ধতিতে তৈরি করা হয়।
আমার বোধগম্যতা সর্বদা সহজভাবে ছিল যে কোনও স্থির পদ্ধতির মতোই মূল পদ্ধতিটি সম্পর্কিত শ্রেণীর কোনও উদাহরণ তৈরি না করেই প্রোগ্রামটির অন্য কোনও কিছুর আগে চালানোর অনুমতি দেয়। যদি এটি স্থির না থাকে তবে আপনাকে কোনও বস্তু বলার আগে তা ইনস্ট্যান্ট করতে হবে - যা একটি 'মুরগী এবং ডিম' সমস্যা তৈরি করে, যেহেতু প্রোগ্রামের শুরুতে আপনি মূল পদ্ধতিটি সাধারণত যা ব্যবহার করেন।
Runnable) জাভা না এই নকশা ব্যবহার করুন। কেন এখানে (আপাত) ব্যতিক্রম?