জাভা: <ইনিট> এবং <ক্লিনিট> এর মধ্যে পার্থক্য কী?


95

আমি নীচের পাঠ্যটি বুঝতে অক্ষম ... এটির অর্থ কি এটি <clinit>খালি নির্মাণকারীদের জন্য? দুটি ভিন্ন সংস্করণ থাকা কেন গুরুত্বপূর্ণ?

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

2.9. Special Methods

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

কোনও শ্রেণি বা ইন্টারফেসের সর্বাধিক এক শ্রেণি বা ইন্টারফেস প্রারম্ভিককরণ পদ্ধতি থাকে এবং সেই পদ্ধতিটি শুরু করে (§2.17.4) আরম্ভ করা হয়। কোনও শ্রেণি বা ইন্টারফেসের প্রারম্ভিককরণ পদ্ধতিটি স্থিতিশীল এবং কোনও যুক্তি নেয় না। এর বিশেষ নাম রয়েছে <clinit>। এই নামটি একটি সংকলক সরবরাহ করে। নামটি <clinit>কোনও বৈধ শনাক্তকারী নয়, এটি জাভা প্রোগ্রামিং ভাষায় লিখিত কোনও প্রোগ্রামে সরাসরি ব্যবহার করা যাবে না। শ্রেণি এবং ইন্টারফেস প্রারম্ভিককরণ পদ্ধতিগুলি জাভা ভার্চুয়াল মেশিনের দ্বারা অন্তর্ভুক্ত থাকে; এগুলি কখনই জাভা ভার্চুয়াল মেশিন inw2 تعمیر থেকে সরাসরি ডাকা হয় না, তবে শ্রেণি সূচনা প্রক্রিয়ার অংশ হিসাবে কেবল অপ্রত্যক্ষভাবে ডাকা হয়।

উত্তর:


143

<init> উদাহরণস্বরূপ (বা এক) কনস্ট্রাক্টর (গুলি), এবং অ স্থিতিশীল ক্ষেত্রের সূচনা।

<clinit> ক্লাসের জন্য স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লক এবং স্থির ক্ষেত্রের সূচনা।

class X {

   static Log log = LogFactory.getLog(); // <clinit>

   private int x = 1;   // <init>

   X(){
      // <init>
   }

   static {
      // <clinit>
   }

}


14
আমার অনুমান "ক্লাস"।
থিলো

4
@ থিলো এটি আকর্ষণীয় কারণ জেভিএম একটি শ্রেণির সংজ্ঞাটিকে এখনও অন্য ধরণের অবজেক্ট হিসাবে বিবেচনা করে।
জোনাথন নিউফেল্ড

@ জোনাথননিউফেল্ড সত্য, যদিও আমি মনে করি কিছু বিশেষ বিধি রয়েছে। এই পদ্ধতিটি (ক্লাস ইনিশিয়ালাইজার বলে ডাকা) স্থানীয় হিসাবে চিহ্নিত করা হয়েছে ... গ্রেপকোড
ক্যাড ড্যানিয়েল

@ তিলে এটি "ক্লাসলোডার" এর পক্ষেও দাঁড়াতে পারে।
ডানকান কালভার্ট


13

<init>এবং এর মধ্যে পার্থক্যটি কনস্ট্রাক্টর পদ্ধতির জন্য ব্যবহৃত <clinit>হয় যা <init>কোনও বস্তুর উদাহরণকে <clinit>আরম্ভ করে , যেখানে শ্রেণি অবজেক্টটি নিজেই আরম্ভ করার জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ কোনও staticশ্রেণি স্তরের ক্ষেত্রের সূচনা <clinit>যখন ক্লাস লোড এবং ইনিটালাইজড হয় তখন সম্পন্ন হয় ।


1

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

public class ByteCodeParent
{
 public static String name="ByteCode";
 public ByteCodeParent()
{
    System.out.println("In Constructor");
}

 static
 {
     System.out.println("In Static");
 }

 {
     System.out.println("In Instance");
 }

পরীক্ষা করতে, ব্যবহার করুন

   Class<ByteCodeParent> bcp2 =(Class<ByteCodeParent>) Class.forName("ByteCodeParent");
ByteCodeParent bcp4= bcp2.newInstance();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.