Command Prompt এ জাভা প্রোগ্রাম রান করবেন যেভাবে।

খুবই সহজ, মাত্র চারটি স্টেপ-

স্টেপ-১(ক)  ডেস্কটপে একটি ফোল্ডার বানাই, সেই ফোল্ডারে একটি জাভা ফাইল বানাই। (আমার ফোল্ডারের নাম JavaTest এবং ফাইলের নাম Echo.java)



স্টেপ-১(খ)  জাভা ফাইলে একটি জাভা main class বানাই। ফাইল এবং ক্লাসের নাম একই হওয়া লাগবে। 
*ফাইল ও ক্লাসের নাম একই হওয়া লাগবে।(আমার ক্লাসের নামও Echo)



স্টেপ-২ঃ Command Prompt ওপেন করি,  কারেন্ট ডিরেক্টরি হিসেবে ফোল্ডারটিকে সিলেক্ট করি এবং এন্টার চাপি।
কমান্ডঃ cd <your directory link>
আমি দিয়েছিঃ cd Desktop\JavaTest



স্টেপ-৩ঃ সিস্টেমকে JDK ফাইলগুলো কোথায় আছে তা দেখিয়ে দিই। নিচের কমান্ড লিখি, এন্টার চাপি। (JDK ইনস্টল করা না থাকলে খুজে পাবেন  না)
কমান্ডঃ set path="%path%";C:\Program Files\Java\jdk1.8.0_25\bin



যেখানে JDK ফাইলগুলো থাকে -


স্টেপ-৪ঃ 
জাভা ফাইলটিকে কম্পাইল করি -
কমান্ডঃ javac <your file name with extension>
আমি দিয়েছিঃ javac Echo.java


এই কমান্ড ডিরেক্টরিতে ঐ একই নামে একটি .class ফাইল তৈরী করবে। 
এখন .class ফাইলকে run করি।

কমান্ডঃ java <your fine name without extension>
আমি দিয়েছিঃ javac Echo
(এই কমান্ড দিয়ে এন্টার চাপলেই আউটপুট দেখাবে)


main() মেথডে প্যারামিটার pass করতে চাইলে শুধু .class ফাইলের নাম দিয়ে তারপর স্পেস দিয়ে আলাদা করে করে প্যারামিটারগুলো দিয়ে এন্টার দিলেই হবে। (নিচে ক্লাসের কোড আমি দিয়ে দিয়েছি)
public class Echo {
public static void main (String[] args) {
for (String s: args) {
System.out.println(s);
}
}
}
ধন্যবাদ :) 

জাভা বেসিকঃ ক্লাস ও অবজেক্টের প্রাথমিক আলোচনা


বুঝার পূর্বশর্তঃ
আগে প্রোগ্রামিং ল্যাংগুয়েজ C করে থাকলে, মাথা থেকে ঝেড়ে ফেলুন। C এর কোনো কিছুর সাথে তুলনাও করা যাবে না। এটার এ্যাপ্লিকেশন কি! ঐটার এ্যাপ্লিকেশন কি!! এই টাইপের ফাউ ওজনহীন কথা থেকে মস্তিষ্ককে দূরে রাখতে হবে।

একটা Analogy দিয়ে শুরু করি। ছবিতে একটি গাড়ির(Car) আর্কিটেকচারাল ডিজাইন দেখছি। এই ডিজাইনে গাড়ির বৈশিষ্টগুলোকে আমরা দুই ভাগে ভাগ করতে পারি।
    • কি কি পার্টস বা Property আছে ? 
    • পার্টসের কাজ কি কি বা Behavior কি কি?  
    Property বা পার্টস গুলো হচ্ছেঃ
    স্টিয়ারিং
    গ্যাস প্যাডেল
    হেড লাইট
    এয়ার কন্ডিশন সিস্টেম (ইত্যাদি)

    Behavior বা কাজ গুলো হচ্ছেঃ
    স্টিয়ারিং যেভাবে কাজ করে
    গ্যাস প্যাডেল যেভাবে কার্বুরেটরে গ্যাস পাঠায়
    হেড লাইট যেভাবে কাজ করে (ইত্যাদি)

    এখন যদি কোনো কোম্পানি এই ডিজাইন দেখে নিচের ছবির মত অনেক গুলো Car বানায়, তাহলে প্রত্যেকটি Car এ কি উপরের  Property এবং Behavior  গুলো থাকবে? মানে প্রত্যেকটি Car এ কি
    স্টিয়ারিং, গ্যাস প্যাডেল, হেড লাইট(ইত্যাদি) থাকবে?  উত্তর- হ্যাঁ থাকবে সব কয়টি Car এ Property গুলো অবশ্যই থাকবে। এবং একইভাবে প্রত্যেকটি Car এ তার ডিজাইনে ঠিক করা Behavior গুলো ও থাকবে।  



    ক্লাস ও অবজেক্টঃ জাভার দৃষ্টিকোণ থেকে বলতে গেলে উপরের আর্কিটেকচারাল ডিজাইন হচ্ছে Car class । আর সেই ডিজাইন বা class থেকে বানানো প্রত্যেকটি কার হচ্ছে Car ক্লাসের এক একটি Object।

    এখন তাহলে ক্লাস কিভাবে ডিক্লেয়ার করব? খুবই সোজা - কিওয়ার্ড class + আপনি ক্লাসের যে নাম রাখতে চান। দেখাযাক তাহলেঃ
    class MyCarClass{
    }
    
    আমরা তাহলে ক্লাস ডিক্লেয়ার করা শিখে গেছি। এখন দেখব কিভাবে ক্লাসে Property এবং Behavior যোগ করব। Java তে Property কে বলা হয় Instance variable (ক্ষেত্রভেদে আরো অনেক কিছু বলা হয় সেগুলো পরে জানব) এবং Behavior কে বলা হয় Method। 
    আমাদের MyCarClass এ এখন Instance Variable এবং Method যোগ করা যাক।
    class MyCarClass{
       int myVariable;
       void myMethod(){
       }
    }
    
    এখানে myVariable হচ্ছে  MyCarClass ক্লাসের Instance Variable যার ডাটা টাইপ int। এবং myMethod হচ্ছে MyCarClass ক্লাসের একটি মেথড যার রিটার্ণ টাইপ হচ্ছে void। মনে রাখতে হবে প্রত্যেকটি স্টেটমেন্ট এর পর ";" দিতে হবে। আর মেথডের জন্য এটি হচ্ছে সবচেয়ে বেসিক স্টাকচার। মেথডের কার্লি ব্র্যাকেট({ ও }) এর পর ";" হবে না।

    আরেকটি কোড দেখি -
    class MyCarClass{
       int oilInLiter;
       void refillOilMethod(){
          oilInLiter = 10;
       }
    }
    মনে রাখবেন class এর member গুলো যে কোনো Access modifier (Access modifier কে Access control ও বলা হয়) এর হোক না কেন। ঐ একই class এর অভ্যন্তরে এদের যে কোনোটি যে কোনোটিকে এক্সেস করতে পারবে।  
    ক্লাস বানানো শিখে গিয়েছি। এখন দেখি কোনো ক্লাসের Object কিভাবে বানাব। লক্ষ করি- 
    কিওয়ার্ড new + ক্লাসের নামে + () 
    নিচের কোড স্নিপেট দেখি -  
    আসুন স্টাকচারড ল্যাঙ্গুয়েজ "সি" এর একটু হেল্প নেওয়া যাক। সি'তে আমরা কোনো একটি ভেরিয়েবলকে ডিক্লেয়ার করি এবং সেটিকে ডাটা দিয়ে Initialize করি। অনেকটা এই রকম - 



    এখন জাভার অবজেক্টকে ডাটার সাথে তুলনা করুন। ডাটা  মনে করলে আমরা ডাটা পেয়ে যাই। এই ডাটা রাখার জন্যতো আমাদের এখন ভেরিয়েবল দরকার। জাভাবে কোনো ক্লাসের ভেরিয়েবলকে Reference Variable বলা হয়। Reference Variable ডিক্লেয়ার অনেকটা সি এর মত। 

    প্রথমে ক্লাসের নাম তারপর স্পেস দিয়ে Reference Variable এর আপনার দেওয়া নাম। মনে রাখবেন ক্লাস হচ্ছে ডাটা টাইপ আর অবজেক্ট হচ্ছে ঐই টাইপের রেফারেন্স ডাটা যেটি দিয়ে আমরা একটি রেফারেন্স ভেরিয়েবলকে Initialize করব। বা  Reference Variable যেটিকে হোল্ড করবে। নিচের কোড স্নিপেট দেখি -



    মনে রাখবেন একই ডিজাইন (Class) থেকে বানানো প্রত্যেকটি কারে(প্রত্যেকটি Object এ) একই টাইপের পার্টসগুলো (Instance variable গুলো) এবং পার্টসের Behavior গুলো (Method গুলো) থাকবে। যেভাবে দুটি কারের পার্টসগুলোর আলাদা অস্তিত্ব আছে, সেভাবেই দুটি Object এর Instance variable/Method পরস্পর থেকে আলাদা। 



    আমরা MyCarClass টাইপের দুটি Object যদি বানাই, তাহলে প্রত্যেকটি Object এ oilInLiter নামে একটি Instance Variable এবং refillOilMethod নামে একটি Method থাকবে। দুটি কারের হেডলাইট, স্টিয়ারিং যেমন আলাদা(একই টাইপের যন্ত্র হলেও) দুটি Object এর Instance Variable ও Method গুলোও আলাদা। 

    নিচের কোড দেখি-
    class MyCarClass{
       int oilInLiter;
       void refillOilMethod(){
          oilInLiter=10;
       }
    }
    //----------------------------------------------------------//
    MyCarClass refVar1 = new MyCarClass();
    MyCarClass refVar2 = new MyCarClass();
    
    এখানে revVar1 ও refVar2 দুটি আলাদা Object কে Refer করছে। এবং দুটি Object এর ই একটি Instance Variable ও একটি Method আছে।  revVar1, refVar2 এর Object দুটোর Instance Variable ও  Method একটি অন্যটি থেকে আলাদা। এই লাইনটি বুঝানোর জন্য এতক্ষনের আলোচনা। দয়াকরে না বুঝলে আরেকবার পড়ে ফেলুন, তারপর সামনে যান, যদি তাও না বুঝেন মন ফ্রেস করে আবার পড়ুন, যদি তাও না বুঝেন বাসার ছাদ থেকে লাফ দেওয়ার কোনো দরকার নেই। 

    একটা অবজেক্ট তার instance variable ও method গুলোকে কিভাবে এক্সেস করবে?সহজ সমাধান, জাস্ট- অবজেক্ট + . + method/instance variable
    refVar1.oilInLiter = 50;    // accessing instance variable
    refvar1.refillOilMethod();  // accessing method
    new Myclarclass().refillOilMethod();    //creating new object and accessing its method 
    Reference variable, refVar1 কে আগের কোডে initialize করা হয়েছিল MyCarClass টাইপের একটি Object দিয়ে মানে refVar1 এ সেভ আছে MyCarClass টাইপের একটি Object। দেখুন লাইন-১ ও লাইন-২ এ কথামত আমরা Object এর পর ডট(.) তারপর instance variable/method এর নাম দিয়েছি।

    লাইন-৩ এ কি হচ্ছে তাহলে? new Myclarclass() দিয়ে আমরা একটি নতুন অবজেক্ট বানিয়েছি তারপরে ডট দিয়েছি এবং তারপরে এই নতুন object এর refillOilMethod() মেথডকে এক্সেস করেছি।

    object দিয়ে ক্লাসের মেম্বার (instance variable/method) গুলোকে এক্সেস করা অনেকটা একটি গাড়ির পার্টস/ফাংশনগুলোকে এক্সেস করার মত। 

    এতক্ষন সব কোডকে আমরা ভেঙ্গেচুরে দেখলাম। সব কোডকে এখন একসাথে দেখব। তার আগে জেনে নেই জাভাতে main class কি? 
    এককথায়, যে ক্লাসে main method আছে তাকেই main class বলে। তাহলে এখন main method কি

    public static void main(String[] args){......} এই রকম স্টাকচারের method কে বলা হয় main method।

    ভয় পেয়েছি? public কি? static কি? এই সব আমরা পরের কোনো একটি টিউনে আলোচনা করব। এখন কষ্ট করে মনে রাখি এগুলো হচ্ছে জাভার কিওয়ার্ড। এবং main method কে এই স্টাকচারে লিখতে হবে। মনে রাখবেন, কোনো একটি জাভা সোর্স কোডের এক্সিকিউশন শুরু হয় main method থেকে। 


    এখন তাহলে একটি main method ও main class বানাই- 
    public class RandomClass{
       public static void main(String[] args){
       }
    }
    
    এখানে RandomClass একটি main class কারণ এই ক্লাসে একটি main method আছে। main method এ public এবং static কে অবশ্যই রিটার্ণ টাইপ void এর আগে বসতে হবে। কিন্তু এরা নিজেদের মধ্যে অবস্থান পরিবর্তন করতে পারবে। স্কয়ার ব্র্যাকেট "[]" ভেরিয়েবল args এর পরে লিখলেও সমস্যা নেই। ভেরিয়েবল args এর জায়গায় আপনি অন্য কোনো নাম দিলেও সমস্যা নেই। 
    নিচের কোড স্নিপেট দেখি, এই রকম লিখলেও কোনো সমস্যা হবে না -  
    public class RandomClass{
       static public void main(String var[]){
       }
    }
    
    আরো একটি জিনিস লক্ষ্য করি, কোডে আছে public class RandomClass{...}। এখানে public কিওয়ার্ড দিয়ে বলা হয়েছে RandomClass একটি public class অর্থ হচ্ছে RandomClass কে যে কেউ এক্সেস করতে পারবে। public হওয়ার কারণে RandomClass অন্য কোনো ক্লাস বা JVM এর কাছে ভিজিবল।  public কিওয়ার্ডকে Access modifier বলা হয়। মোট চারটি Access modifier আছে। এবং সেগুলো হচ্ছেঃ 
        1. public
        2. private
        3. protected এবং 
        4. default 
    বাকী ৩টির জন্য কিওয়ার্ড থাকলেও default এর জন্য কোনো কিওয়ার্ড নেই। যখন কোনো Access modifier থাকে না, তার মানে সেটি তখন default access যুক্ত।  Access modifier নিয়ে আমরা একটি টিউটোরিয়াল লিখবো, সেখানে বিস্তারিত আলোচনা করা হবে। (খুব বেশি interest থাকলে access modifier নিয়ে YouTube এ আমার channel এ ধারাবাহিক চারটি টিউটোরিয়াল আছে। লিংক কমেন্টে পাবেন)

    খুচরো কথা বেশি বলে কোনো লাভ নেই। এখন আমরা দুইটি class বানাবো যার একটি হবে main class। তাহলে কোড দেখা যাক-
    class MyCarClass{
       int oilInLiter=0;
       void refillOilMethod(){
          oilInLiter  = 15;
       }
       void checkOilMeter(){
          System.out.println("Oil status: " + oilInLiter + " Liter" );
       }
    }
    
    public class RandomClass{
       static public void main(String var[]){
          MyCarClass var1, var2;
          var1 = new MyCarClass();
          var2 = new MyCarClass();
          
          var1.checkOilMeter();
          var1.fefillOilMethod();
          var1.checkOilMeter();
    
          var2.oilInLiter = 20;
          var2.checkOilMeter();
       }
    }
    
    আমরা বলেছি java কোড main method থেকে এক্সিকিউট করা শুরু করে। তাই main method থেকে আমরা দেখা শুরু করব প্রত্যেকটি লাইনে কি হচ্ছে।

    দেখুন লাইন ১৩-১৫ আমরা ২টা Reference variable কে 
    MyCarClass টাইপের ২টা Object দিয়ে Initialize করেছি।



    লাইন-১৭ var1 এর Object দিয়ে checkOilMeter() মেথডকে কল করেছি।  checkOilMeter() মেথড instance variable, oilInLeter কে প্রিন্ট করে (লাইন ৬-৮ দ্রষ্ট্রব্য)। যেহেতু oilInLiter শূন্য দিয়ে initialize করা (লাইন-২ দ্রষ্ট্রব্য) তাই Oil status: 0 Liter এই লাইন প্রিন্ট করবে। 



    লাইন-১৮ তে var1 দিয়ে refillOilMethod() কে কল করেছি, যেটি oilInLiter কে 15 দিয়ে initialize করে (লাইন ৩-৫ দ্রষ্ট্রব্য)।  লাইন-১৯ checkOilMeter() কে আবার কল করেছে, এবং Oil status: 15 Liter করেছে। 



    লাইন-২১ এ var2 অবজেক্ট এর instance variable, oilInLiter কে initialize করেছে। বলতে পারেন var2 এর oilInLiter  এর value এখন কত? এটি হচ্ছে 0। যেটি লাইন-২ তে initialized হচ্ছে। আমরাতো আগেই বলেছি ভিন্ন দুইটি object এর member(instance variable/method) গুলোও ভিন্ন। এদের আলাদা অস্তিত্ব আছে। তাহলে আপনারাই বলুন করুন লাইন-২২ কি প্রিন্ট করবে?? 


    আপনাদের রেসপন্স আমার লিখার জন্য সহায়ক। আমাকে সামাজিক যোগাযোগ মাধ্যমে খুজে পাবেন। আপনাদের কোনো প্রশ্ন থাকলে করতে পারেন। ধন্যবাদ!