স্থির শ্রেণি সূচনা কখন ঘটে?


110

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

আমি যদি স্থির পদ্ধতি বলি? এটি কি সমস্ত স্থির ব্লকগুলি চালায়? পদ্ধতির আগে?


স্ট্যাটিক সূচনাকারী ব্লক জন্য অনুরূপ: stackoverflow.com/questions/2007666/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


156

প্রথম শ্রেণীর নীচের ঘটনাগুলির মধ্যে একটি ঘটনার আগেই কোনও শ্রেণির স্ট্যাটিক ইনিশিয়ালশন সাধারণত ঘটে যায়:

  • শ্রেণীর একটি উদাহরণ তৈরি করা হয়েছে,
  • শ্রেণীর একটি স্থিতিশীল পদ্ধতি আহ্বান করা হয়,
  • শ্রেণীর একটি স্থির ক্ষেত্র নির্ধারিত হয়,
  • একটি অ স্থির স্ট্যাটিক ক্ষেত্র ব্যবহৃত হয়, বা
  • শীর্ষ-স্তরের শ্রেণির জন্য, ক্লাসের মধ্যে বর্ণিতভাবে বাসা বাঁধার একটি স্টেটমেন্ট স্টেটমেন্ট কার্যকর করা হয় 1

জেএলএস দেখুন 12.4.1

Class.forName(fqn, true, classLoader)শর্ট ফর্মটি ব্যবহার করে বা শর্ট ফর্মটি প্রয়োগ করে (যদি এটি ইতিমধ্যে আরম্ভ না করা হয়) শুরু করতে বাধ্য করাও সম্ভবClass.forName(fqn)


1 - জাভা 8 এর মাধ্যমে জাভা 6 এর জন্য জেএলএসে চূড়ান্ত বুলেট পয়েন্ট উপস্থিত ছিল, তবে স্পষ্টতই এটি স্পষ্টতই একটি ভুল ছিল। শেষ পর্যন্ত এটি জাভা 9 জেএলএসে সংশোধন করা হয়েছিল: উত্স দেখুন


9
যদিও একটি সাধারণ ক্ষতি আছে। আদিম এবং Stringগুলি প্রতিস্থাপিত হয় এবং রেফারেন্স হয় না। আপনি যদি class Other { public static final int VAL = 10; }কোনও শ্রেণীর একটি থেকে রেফারেন্স দেন MyClass { private int = Other.VAL; }তবে ক্লাসটি Otherলোড হবে না। পরিবর্তে, সংকলক সংকলনের সময় চূড়ান্ত ক্ষেত্রটি সহজেই প্রতিস্থাপন করবে।
রাফায়েল শীতকালীন

6
@RafaelWinterhalter - হ্যাঁ ... যে ধ্রুবক স্ট্যাটিক ক্ষেত্র কেস।
স্টিফেন সি

2
@ রাফায়েলওয়ান্টারহাল্টার, এটি সমস্ত 'স্ট্যাটিক ফাইনাল' আদিম বা Stringভেরিয়েবলগুলির ক্ষেত্রে সত্য নয় , কেবল ধ্রুবক অভিব্যক্তি দ্বারা সূচনা করা হয়েছিল।
লিউ ব্লাচ

1
হ্যাঁ, এবং ক্ষেত্রটি এমনকি হওয়ার দরকার নেই staticযখন এটি সাধারণ ঘটনা।
রাফায়েল

1
এটি একই প্রোগ্রামিং ভাষা। হ্যাঁ.
স্টিফেন সি

14

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

উদাহরণ বিবেচনা করুন:

public class Test {

   static String sayHello()  {
      return a;
   }

   static String b = sayHello(); // a static method is called to assign value to b.
                                 // but its a has not been initialized yet.

   static String a = "hello";

   static String c = sayHello(); // assignes "hello" to variable c

    public static void main(String[] arg) throws Throwable {
         System.out.println(Test.b); // prints null
         System.out.println(Test.sayHello()); // prints "hello"
    }
}

টেস্ট.বি প্রিন্ট করে nullকারণ যখন sayHelloস্ট্যাটিক স্কোপতে ডাকা হত, স্ট্যাটিক ভেরিয়েবলটি aআরম্ভ করা হয় নি।


6
কড়া কথায় বলতে গেলে, আরম্ভকরণ ক্লাস লোডিংয়ের "ফেজ" নয়। প্রকৃতপক্ষে, অ্যাপ্লিকেশনটি যদি সেগুলি ব্যবহার না করে তবে কিছু ক্লাস লোড হতে পারে তবে কখনও কখনও আরম্ভ করা হতে পারে।
স্টিফেন সি

@ স্টেফেন সি আপনি ঠিক বলেছেন, আমি এটি একটি ভাল শব্দটির অভাবের জন্য ব্যবহার করেছি, সম্ভবত আমি এটি উদ্ধৃত করব।
নাইকুস

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

মূলত, হ্যাঁ
স্টিফেন সি

1

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


কোনও ক্লাস শুরু না করে রেফার করার উপায় রয়েছে।
লিউ ব্লাচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.