software - জাভা java runtime environment




স্ট্যাটিক এবং চূড়ান্ত মধ্যে পার্থক্য? (8)

আমি সবসময় জাভা static এবং final কীওয়ার্ড মধ্যে বিভ্রান্ত।

কিভাবে তারা ব্যতিক্রম ?


স্ট্যাটিক শব্দ 4 পরিস্থিতিতে ব্যবহার করা যেতে পারে

  • স্ট্যাটিক ভেরিয়েবল
  • স্ট্যাটিক পদ্ধতি
  • কোড স্ট্যাটিক ব্লক
  • স্ট্যাটিক নেস্টেড ক্লাস

এর প্রথম স্ট্যাটিক ভেরিয়েবল এবং স্ট্যাটিক পদ্ধতি তাকান।

স্ট্যাটিক পরিবর্তনশীল

  • এটি একটি পরিবর্তনশীল যা শ্রেণীভুক্ত এবং বস্তু (উদাহরণস্বরূপ) না।
  • স্ট্যাটিক ভেরিয়েবলগুলি কেবল একবারই শুরু হয়, নির্বাহের শুরুতে। এই ভেরিয়েবলগুলি কোনও ইনস্ট্যান্স ভেরিয়েবলগুলির সূচনা করার আগে প্রথমে শুরু করা হবে।
  • একটি একক কপি ক্লাসের সব দৃষ্টান্ত দ্বারা ভাগ করা হবে।
  • একটি স্ট্যাটিক পরিবর্তনশীল শ্রেণী ক্লাস দ্বারা সরাসরি অ্যাক্সেস করা যেতে পারে এবং কোন বস্তুর প্রয়োজন হয় না।
  • সিনট্যাক্স: Class.variable

স্ট্যাটিক পদ্ধতি

  • এটি এমন একটি পদ্ধতি যা বস্তুর অন্তর্গত এবং বস্তুর নয় (উদাহরণস্বরূপ)।
  • একটি স্ট্যাটিক পদ্ধতি শুধুমাত্র স্ট্যাটিক তথ্য অ্যাক্সেস করতে পারেন। এটি অ স্ট্যাটিক ডেটা (ইনস্ট্যান্স ভেরিয়েবল) অ্যাক্সেস করতে পারে না যদি না এটি ক্লাসের একটি উদাহরণ তৈরি / তৈরি করে।
  • একটি স্ট্যাটিক পদ্ধতি কেবল অন্যান্য স্ট্যাটিক পদ্ধতি কল করতে পারে এবং এটি থেকে একটি অ স্ট্যাটিক পদ্ধতি কল করতে পারে না যদি না এটি ক্লাসের একটি উদাহরণ তৈরি / তৈরি করে।
  • একটি স্ট্যাটিক পদ্ধতি ক্লাস ক্লাস দ্বারা সরাসরি অ্যাক্সেস করা যেতে পারে এবং কোন বস্তুর প্রয়োজন হয় না।
  • সিনট্যাক্স: Class.methodName()
  • একটি স্ট্যাটিক পদ্ধতি যাই হোক না কেন this বা super কীওয়ার্ড পড়ুন করতে পারেন।

স্ট্যাটিক ক্লাস

জাভা এছাড়াও আছে "স্ট্যাটিক নেস্টেড ক্লাস"। একটি স্ট্যাটিক নেস্টেড ক্লাস শুধুমাত্র এক যা বহিরাগত শ্রেণীর একটি উদাহরণ একটি রেফারেন্স নেই।

স্ট্যাটিক নেস্টেড ক্লাস উদাহরণ পদ্ধতি এবং স্ট্যাটিক পদ্ধতি থাকতে পারে।

জাভা শীর্ষ স্তরের স্ট্যাটিক ক্লাসের মতো কোন জিনিস নেই।

সাইড নোট:

কোনও তাত্ক্ষণিক সংঘটিত হওয়ার আগে এটি চালানোর জন্য একটি অ্যাপ্লিকেশনের জন্য অ্যাক্সেসযোগ্য হতে হবে, কারণ মূল পদ্ধতি static

final শব্দটি এমন একটি সত্তা সংজ্ঞায়িত করতে বিভিন্ন বিভিন্ন প্রসঙ্গে ব্যবহৃত হয় যা পরে পরিবর্তন করা যায় না।

  • একটি final ক্লাস subclassed করা যাবে না। এই নিরাপত্তা এবং দক্ষতার কারণে সম্পন্ন করা হয়। অনুযায়ী, জাভা স্ট্যান্ডার্ড লাইব্রেরি ক্লাসগুলির মধ্যে অনেকগুলি final , উদাহরণস্বরূপ java.lang.System এবং java.lang.String । একটি final ক্লাসে সব পদ্ধতি implicitly final

  • একটি final পদ্ধতি subclasses দ্বারা overridden করা যাবে না। এটি একটি উপশ্রেণী থেকে অপ্রত্যাশিত আচরণ প্রতিরোধ করার জন্য ব্যবহৃত হয় যা ক্লাসের ফাংশন বা সামঞ্জস্যের জন্য গুরুত্বপূর্ণ হতে পারে।

  • একটি final পরিবর্তনশীল শুধুমাত্র একটি ইনিশিয়েটিজার বা একটি অ্যাসাইনমেন্ট বিবৃতি মাধ্যমে, একবার শুরু করা যেতে পারে। ঘোষণার বিন্দুতে এটি আরম্ভ করার প্রয়োজন নেই: এটি একটি blank final পরিবর্তনশীল বলা হয়। ক্লাসের একটি ফাঁকা চূড়ান্ত উদাহরণ পরিবর্তনশীল অবশ্যই অবশ্যই ঘোষণা করা হয় এমন শ্রেণীটির প্রতিটি কন্সট্রাক্টরের শেষে অবশ্যই নির্দিষ্ট করা উচিত; একইভাবে, একটি ফাঁকা চূড়ান্ত স্ট্যাটিক পরিবর্তনশীল অবশ্যই অবশ্যই ঘোষণা করা হয় এমন শ্রেণীর স্ট্যাটিক ইনিশিয়েটিজারে অবশ্যই নির্দিষ্ট করা উচিত; অন্যথায়, উভয় ক্ষেত্রে একটি কম্পাইল-টাইম ত্রুটি ঘটে।

নোট: যদি পরিবর্তনশীল একটি রেফারেন্স হয়, এর মানে হল যে পরিবর্তনশীল অন্য বস্তুর উল্লেখ করতে পুনরায় আবদ্ধ করা যাবে না। কিন্তু এটি যে প্রসঙ্গটি উল্লেখ করে তা এখনও পরিবর্তনযোগ্য, যদি এটি মূলত পরিবর্তনযোগ্য হয়।

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


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

static একটি শ্রেণীর (গুণাবলী এবং পদ্ধতি) সদস্যদের জন্য এবং এটি উদাহরণস্বরূপ (অ স্ট্যাটিক) সদস্যদের বিপরীতে বোঝা উচিত। আমি জাভা টিউটোরিয়ালগুলিতে "ইনস্ট্যান্স এবং ক্লাস সদস্যদের বোঝার" পড়ার সুপারিশ করব। আমি static ব্লক ব্যবহার করা যেতে পারে কিন্তু আমি শুরু জন্য এটি সম্পর্কে চিন্তা করবেন না।

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


দুই সত্যিই অনুরূপ নয়। static ক্ষেত্র এমন ক্ষেত্র যা কোনও ক্লাসের কোন নির্দিষ্ট উদাহরণের সাথে সম্পর্কিত নয়

class C {
    public static int n = 42;
}

এখানে, static ফিল্ড n C কোন নির্দিষ্ট উদাহরণের সাথে যুক্ত নয় তবে সম্পূর্ণ শ্রেণীতে (এটির জন্য এটি ব্যবহার করতে Cn ব্যবহার করা যেতে পারে)। আপনি এখনও n ব্যবহার করার জন্য একটি উদাহরণ ব্যবহার করতে পারেন? হ্যাঁ - কিন্তু এটি বিশেষভাবে ভাল অনুশীলন করা হয় না।

অন্যদিকে final ইঙ্গিত দেয় যে একটি নির্দিষ্ট পরিবর্তনশীল এটি আরম্ভ হওয়ার পরে পরিবর্তন করতে পারে না।

class C {
    public final int n = 42;
}

এখানে, n পুনঃ-বরাদ্দ করা যাবে না কারণ এটি final । অন্য একটি পার্থক্য যে কোন পরিবর্তনশীল final ঘোষণা করা যেতে পারে, যখন প্রতি পরিবর্তনশীল স্ট্যাটিক ঘোষণা করা যাবে না।

এছাড়াও, ক্লাসগুলিকে final ঘোষণা করা যেতে পারে যা নির্দেশ করে যে তাদের বর্ধিত করা যাবে না:

final class C {}

class B extends C {}  // error!

একইভাবে, পদ্ধতিগুলিকে চূড়ান্ত ঘোষণা করা যেতে পারে যে তারা একটি বর্ধমান শ্রেণির দ্বারা অতিরিক্ত হতে পারে না:

class C {
    public final void foo() {}
}

class B extends C {
    public void foo() {}  // error!
}

সহজ পার্থক্য,

চূড়ান্ত : মানে ভেরিয়েবলের মান চূড়ান্ত এবং এটি কোথাও পরিবর্তন হবে না। যদি আপনি বলে যে চূড়ান্ত x = 5 এর অর্থ হল x পরিবর্তন করা যায় না তার মানটি সকলের জন্য চূড়ান্ত।

স্ট্যাটিক : এটি শুধুমাত্র একটি বস্তুর আছে মানে। অনুমান করুন আপনার x = 5 আছে, মেমরিতে x = 5 এবং তার উপস্থিত একটি বর্গের ভিতরে। যদি আপনি ক্লাসের একটি বস্তু বা উদাহরণ তৈরি করেন যার মানে একটি নির্দিষ্ট বাক্স যা সেই শ্রেণী এবং এর ভেরিয়েবল এবং পদ্ধতিগুলিকে প্রতিনিধিত্ব করে। এবং যদি আপনি অন্য কোনও বস্তু বা সেই ক্লাসের উদাহরণ তৈরি করেন তবে এর অর্থ হচ্ছে একই শ্রেণীর দুটি বাক্স রয়েছে যার মধ্যে মেমরির মধ্যে বিভিন্ন x থাকে। এবং আপনি যদি দুটি অবস্থানকে উভয় পজিশনে কল করেন এবং তাদের মান পরিবর্তন করেন তবে তাদের মান ভিন্ন হবে। বক্স 1 এর x আছে যার x = 5 এবং বক্স 2 আছে x = 6. কিন্তু যদি আপনি x স্ট্যাটিক তৈরি করেন তবে এটি আবার তৈরি করা যাবে না। আপনি শ্রেণির বস্তু তৈরি করতে পারেন কিন্তু সেই বস্তুর মধ্যে তাদের ভিন্ন x থাকবে না। যদি x স্ট্যাটিক হয় তবে বক্স 1 এবং বক্স 2 উভয়েই একই x থাকবে যার মান 5। হ্যাঁ আমি স্ট্যাটিকের মান পরিবর্তন করতে পারি যেখানে এটি চূড়ান্ত নয়। তাই যদি আমি বলি বক্স 1 এর মধ্যে x থাকে এবং আমি x = 5 এ তার মান পরিবর্তন করি এবং তারপরে আমি বক্স 2 এ আরেকটি বক্স তৈরি করি এবং আমি বক্স 2 x থেকে x = 6 এর মান পরিবর্তন করি। তারপর এক্স স্ট্যাটিক উভয় বাক্সে একই এক্স আছে। এবং উভয় বাক্সগুলি বাক্সের মান 6 হিসাবে দেবে কারণ বাক্স 2 5 থেকে 6 এর মানকে ওভাররাইট করে।

চূড়ান্ত এবং স্থির উভয় সম্পূর্ণ ভিন্ন। চূড়ান্ত যা চূড়ান্ত পরিবর্তন করা যাবে না। স্ট্যাটিক যা এক হিসাবে থাকবে কিন্তু পরিবর্তন করা যেতে পারে।

"এটি একটি উদাহরণ। মনে রাখবেন স্ট্যাটিক ভেরিয়েবল সবসময় তাদের ক্লাসের নাম দ্বারা ডাকা হয়। কারণ সেগুলি কেবল সেই ক্লাসের সমস্ত বস্তুর জন্য এক। সুতরাং ক্লাস A এর x = 5 আছে, আমি কল করতে এবং এটি এক্স = 6 দ্বারা পরিবর্তন করতে পারি; "


স্ট্যাটিক এমন একটি বিষয় যা কোনও শ্রেণীতে কোনও বস্তু কল করতে পারে, যা মূলত একটি বস্তুর প্রকারের অন্তর্গত।

একটি পরিবর্তনশীল একটি সম্পূর্ণ শ্রেণীর জন্য চূড়ান্ত হতে পারে, এবং এর মানে কেবল এটি আর পরিবর্তন করা যাবে না মানে। এটি শুধুমাত্র একবার সেট করা যেতে পারে এবং এটি আবার সেট করার চেষ্টা করলে এটি একটি ত্রুটি হ্রাস পাবে। এটি বেশ কয়েকটি কারণের জন্য উপকারী, সম্ভবত আপনি একটি ধ্রুবক ঘোষণা করতে চান, এটি পরিবর্তন করা যাবে না।

কিছু উদাহরণ কোড:

class someClass
{
   public static int count=0;
   public final String mName;

   someClass(String name)
   {
     mname=name;
     count=count+1;
   }

  public static void main(String args[])
  {
    someClass obj1=new someClass("obj1");
    System.out.println("count="+count+" name="+obj1.mName);
    someClass obj2=new someClass("obj2");
    System.out.println("count="+count+" name="+obj2.mName);
  }
}

উইকিপিডিয়াতে জাভা কীওয়ার্ডগুলির সম্পূর্ণ তালিকা রয়েছে।


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


চূড়ান্ত -

1) যখন আমরা একটি পরিবর্তনশীলকে " চূড়ান্ত " শব্দটি প্রয়োগ করি, তখন সেই পরিবর্তনশীলতার মানটি স্থির থাকে। (বা) একবার আমরা একটি পরিবর্তনশীল হিসাবে চূড়ান্ত হিসাবে ঘোষণা। যে পরিবর্তনশীল মান পরিবর্তন করা যাবে না।

2) এটি কার্যকর যখন একটি পরিবর্তনশীল মান একটি প্রোগ্রামের সময় সময় পরিবর্তন হয় না

স্ট্যাটিক -

1) যখন আমরা একটি পরিবর্তনশীল " স্ট্যাটিক " শব্দটি প্রয়োগ করি, এর মানে এটি ক্লাসের অন্তর্গত।
2) যখন আমরা কোনও পদ্ধতিতে " স্ট্যাটিক " শব্দটি প্রয়োগ করি, এর অর্থ হল ক্লাসের কোনও উদাহরণ তৈরি না করেই পদ্ধতিটি অ্যাক্সেস করা যায়


স্ট্যাটিক মানে এটি ক্লাসের অন্তর্গত নয়, এর মানে হল যে সেই পরিবর্তনশীল / পদ্ধতির কেবল একটি কপি রয়েছে যা কোন নির্দিষ্ট ক্লাসের সমস্ত ক্ষেত্রে ভাগ করা।

public class MyClass {
    public static int myVariable = 0; 
}

//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances

MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();

MyClass.myVariable = 5;  //This change is reflected in both instances

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

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

অতিরিক্ত পঠন স্ট্যাটিক বিষয়ের উপর, আমরা অন্যান্য ব্যবহার সম্পর্কে কথা বলছিলাম, এটি কখনও কখনও স্ট্যাটিক ব্লকগুলিতে ব্যবহৃত হয়। স্ট্যাটিক ভেরিয়েবলগুলি ব্যবহার করার সময় অবশ্যই এই ভেরিয়েবলগুলিকে ক্লাস ব্যবহার করার আগে সেট করা প্রয়োজন, তবে দুর্ভাগ্যবশত আপনি কোনও কনস্ট্রাক্টর পাবেন না। স্ট্যাটিক শব্দটি আসে যেখানে এই।

public class MyClass {

    public static List<String> cars = new ArrayList<String>();

    static {
        cars.add("Ferrari");
        cars.add("Scoda");
    }

}

public class TestClass {

    public static void main(String args[]) {
        System.out.println(MyClass.cars.get(0));  //This will print Ferrari
    }
}

উদাহরণস্বরূপ কনস্ট্রাক্টারের আগে বলা হয় এমন ইনস্ট্যান্সাইজার ব্লকগুলির সাথে আপনাকে বিভ্রান্ত হওয়া উচিত নয়।





java