নাম ছাড়া জাভা পদ্ধতিতে কল করা


100

আমি নীচের কোডটি দেখছি এবং কিছুটা অদ্ভুত কিছু পেয়েছি:

public class Sequence {
    Sequence() {
        System.out.print("c ");
    }

    {
        System.out.print("y ");
    }

    public static void main(String[] args) {
        new Sequence().go();
    }

    void go() {
        System.out.print("g ");
    }

    static {
        System.out.print("x ");
    }
}

System.out"Y" এর সাথে কোনও পদ্ধতি ঘোষণার সাথে সম্পর্কিত না হওয়ায় আমি এটি সংকলন ত্রুটিটি দিয়ে আশা করব { }। কেন এটি বৈধ? এই কোডটি কীভাবে কল করা বা করা উচিত তা আমি দেখছি না।

এটি চলমান চলাকালীন এটিও উত্পাদন করে x y c g, static { }সিক্যুয়েন্স কনস্ট্রাক্টরের আগে কেন কল করা হবে?

উত্তর:


148

এই:

static {
        System.out.print("x ");
    }

একটি হল স্ট্যাটিক আরম্ভের ব্লক , এবং যখন বর্গ লোড হয় বলা হয়। আপনার ক্লাসে আপনি যতগুলি চান আপনার এটি থাকতে পারে এবং তাদের উপস্থিতি অনুসারে (উপরে থেকে নীচে) তাদের সম্পাদন করা হবে।

এই:

    {
        System.out.print("y ");
    }

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

সুতরাং আপনার আউটপুট নিখুঁত জ্ঞান করে।

স্ট্যানলি যেমন নীচে মন্তব্য করেছেন, আরও তথ্যের জন্য আরাকিল টিউটোরিয়ালের ব্লক বর্ণনা করে ওরাকল টিউটোরিয়ালের বিভাগটি দেখুন।



6
the code is copied into the beginning of each constructor of the class- এটি ভুল। চলুন যাক কন্সট্রাক্টর দিয়ে শুরু হয় super("x ");, সুপার ইন্সট্রাক্টর যে কোনও আরম্ভের ব্লকের আগে সম্পাদন করবে।
রকএল

3
হ্যাঁ, সুপার কন্ট্রাক্টরকে অন্তর্নিহিত এবং স্পষ্ট কলগুলি প্রথমে কার্যকর করা হবে, পরের আরম্ভকৃত ব্লক এবং বাকী কনস্ট্রাক্টর কোডের চেয়ে।
jlordo

25

এটি কোনও পদ্ধতি নয় তবে একটি সূচনা ব্লক

 {
    System.out.print("y ");
 }

কনস্ট্রাক্টর কল দেওয়ার আগে এটি কার্যকর করা হবে। যদিও

static {
        System.out.print("x ");
       }

হয় স্ট্যাটিক আরম্ভের ব্লক যা বর্গ বর্গ লোডার দ্বারা লোড হয় মৃত্যুদন্ড কার্যকর করা হয়।

সুতরাং আপনি যখন আপনার কোডটি চালান
1. ক্লাসটি শ্রেণীর লোডার দ্বারা লোড হয় তাই স্থিতিশীল আরম্ভের ব্লক কার্যকর হয়
আউটপুট: এক্স প্রিন্ট করা হয়
2 অবজেক্ট তৈরি হয় তাই আরম্ভকরণ ব্লক কার্যকর করা হয় এবং তারপরে কনডাক্টরকে
আউটপুট বলা হয় : y এর পরে প্রিন্ট করা হয় সি
3 পরে printed প্রধান পদ্ধতিটি আহ্বান করা হয় যা পরিবর্তিত পদ্ধতিতে
আউটপুট: জি মুদ্রিত হয়

চূড়ান্ত আউটপুট: xycg
এটি http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/ এ সহায়তা করতে পারে


@ চথুলহু: ধন্যবাদ এটি গত সপ্তাহ পর্যন্ত বৈধ ছিল আমি এটি নতুন লিঙ্ক সহ আপডেট করেছি।
xyz

16

এটা একটা ব্যাপার উদাহরণস্বরূপ আরম্ভের ব্লক একটি দ্বারা অনুসরণ স্ট্যাটিক আরম্ভের ব্লক

{
    System.out.print("y ");
}

আপনি শ্রেণীর উদাহরণ তৈরি করার সময় কল হয়ে যায়।

static {
    System.out.print("x ");
}

ক্লাস লোডার দ্বারা ক্লাস লোড করা হয় যখন কল করা হয়। সুতরাং যখন আপনি করবেন

new Sequence().go();

ক্লাসটি লোড হয়ে যায়, সুতরাং এটি সঞ্চালিত হয় static {}, তারপরে এটি ইনস্ট্যান্স ইনিশিয়েশন ব্লকটি কার্যকর করে {}, তারপরে কনস্ট্রাক্টরের বডি ডেকে আনা হয় এবং তারপরে নতুন তৈরি করা ইনস্ট্যান্সে পদ্ধতিটি প্রয়োগ করা হয়। আউটপুট এর্গো x y c g


15
static {
        System.out.print("x ");
    }

একটি হল স্ট্যাটিক ব্লক ও ক্লাস লোড করার সময় বলা হয়

{
    System.out.print("y ");
}

একটি সূচনা ব্লক

আপনি ক্লাসে উপস্থিত হওয়ার ক্রম অনুসারে কোন শ্রেণিতে একাধিক সূচনা ব্লক থাকতে পারেন।

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


10
static {
      System.out.print("x ");
}

ক্লাস দ্বারা ভাগ করা একটি ইনিশিয়েশন ব্লক (যেমন নির্দেশিত static), যা প্রথমে কার্যকর করা হয়।

{
        System.out.print("y ");

}

ক্লাসের সমস্ত অবজেক্ট (কনস্ট্রাক্টর) দ্বারা ভাগ করা একটি ইনিশিয়ালাইজেশন ব্লক, যা পরে আসে।

Sequence() {
        System.out.print("c ");
}

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

void go() {
        System.out.print("g ");
}

উপরের কনস্ট্রাক্টর ব্যবহার করে নির্মিত অবজেক্টের সাথে যুক্ত একটি উদাহরণ পদ্ধতি যা শেষ আসে।


9
{
    System.out.print("y ");
}

এই ধরণের ব্লক বলা হয় initializer block। এটি প্রতিবার আপনি একটি এর উদাহরণ তৈরি করার সময় এটি কার্যকর করা হয় class। সংকলনের সময়, এই কোডটি আপনার শ্রেণীর প্রতিটি নির্মাণকারীর মধ্যে সরানো হয়।

যেখানে static initializerব্লকের ক্ষেত্রে :

static {
    System.out.println("x ");
}

ক্লাসটি লোড হয়ে গেলে এটি একবার কার্যকর করা হয়। ক্ষেত্রের staticসূচনা যখন staticএকাধিক পদক্ষেপের প্রয়োজন হয় তখন আমরা সাধারণত প্রাথমিকভাবে ব্লক ব্যবহার করি ।


6

এটি একটি সূচনা ব্লক হিসাবে ব্যবহৃত হয় এবং কোনও স্থির ঘোষণার পরে চলে । এটি সিঙ্গেলন ডিজাইনের ধরণ হিসাবে অন্য কেউ ক্লাসের কোনও উদাহরণ তৈরি করতে না পারে তা নিশ্চিত করতে ব্যবহার করা যেতে পারে (একইভাবে আপনি একটি প্রাইভেট কনস্ট্রাক্টর ব্যবহার করবেন) ।


3
static {
    System.out.print("x ");
}

Static blocksক্লাসটি যখন JRE দ্বারা লোড করা এবং আরম্ভ করা হয় কেবল তখনই তা কার্যকর করা হয়।

এবং প্রতিবার আপনার কোনও নতুন উদাহরণ তৈরি করার সময়non-static ব্লকটি কল করা হবে এবং এটি কনস্ট্রাক্টরের ঠিক আগে কল হবে।

এখানে যেমন আপনি তৈরি করেছেন কেবলমাত্র 1 টির মতো Sequenceনির্মাণের non-staticব্লক এবং তারপরে সেই পদ্ধতিটি যা আসলে আপনার লক্ষ্য after

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