নীচের বিষয়গুলি বিবেচনা করে আপনি একটি স্থিতিশীল পদ্ধতি চূড়ান্ত করার বিষয়ে চিন্তা করার মতো অবস্থানে থাকতে পারেন:
নিম্নলিখিত ক্লাস হচ্ছে:
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
এখন এই পদ্ধতিগুলি কল করার 'সঠিক' উপায়টি হবে
A.ts();
B.ts();
যার ফলশ্রুতিতে হবে AB
তবে আপনি উদাহরণগুলিতে পদ্ধতিগুলি কল করতে পারেন:
A a = new A();
a.ts();
B b = new B();
b.ts();
যার ফলস্বরূপ হবে AB
।
এখন নিম্নলিখিত বিবেচনা করুন:
A a = new B();
a.ts();
যে মুদ্রণ হবে A
। আপনি অবাক হতে পারে যেহেতু আপনি অবাক হতে পারে B
। তবে যেহেতু আপনি এটিকে কোনও প্রকারের উল্লেখ থেকে কল করছেন A
, এটি কল করবে A.ts()
। আপনি B
নিম্নলিখিত কোড সহ মুদ্রণ করতে পারে :
A a = new B();
((B)a).ts();
উভয় ক্ষেত্রে আপনার কাছে বস্তুটি আসলে শ্রেণীর B
। কিন্তু পয়েন্টারটি নির্ভর করে যা বস্তুটির দিকে নির্দেশ করে, আপনি যে পদ্ধতি থেকে A
বা সেখান থেকে কল করবেন B
।
এখন ধরা যাক আপনি শ্রেণির বিকাশকারী A
এবং আপনি উপ-শ্রেণিবদ্ধকরণের অনুমতি দিতে চান। তবে আপনি সত্যিই পদ্ধতিটি চান ts()
, যখনই ডাকা হয় এমনকি একটি উপশ্রেণীর কাছ থেকেও, এটি আপনি যা করতে চান তা করে এবং একটি সাবক্লাস সংস্করণ দ্বারা গোপন করা না হয়। তারপরে আপনি এটিকে তৈরি করতে পারেন final
এবং এটি সাবক্লাসে লুকানো থেকে আটকাতে পারেন। এবং আপনি নিশ্চিত হতে পারেন যে নিম্নলিখিত কোডটি আপনার শ্রেণি থেকে পদ্ধতিটি কল করবে A
:
B b = new B();
b.ts();
ঠিক আছে, স্বীকার করে নিন যে এটি একরকম নির্মিত, তবে এটি কিছু ক্ষেত্রে বোধগম্য হতে পারে।
আপনার উদাহরণস্বরূপ স্ট্যাটিক পদ্ধতিগুলি কল করা উচিত নয় সরাসরি ক্লাসগুলিতে - তবে আপনার সমস্যা হবে না won't এছাড়াও উদাহরণস্বরূপ ইন্টেলিজ আইডিইএ আপনাকে একটি সতর্কতা দেখাবে, যদি আপনি কোনও পরিস্থিতিতে কোনও স্ট্যাটিক পদ্ধতি কল করেন এবং পাশাপাশি আপনি যদি কোনও স্ট্যাটিক পদ্ধতি চূড়ান্ত করেন তবে।