এটি মূলত সাবক্লাসে ব্যবহার করা হয়।এটি সাবক্লাস থেকে সুপারক্লাসের ভেরিয়েবল, মেথোড এবং কোন্সট্রাক্টরকে ডেকে (refer or invoke) থাকে।
ইন্সটেন্স ভেরিয়েবলের ক্ষেত্রেঃ
সুপারক্লাস এবং সাবক্লাসের ইন্সটেন্স ভেরিয়েবলের নাম একই হলে সাবক্লাস থেকে সুপারক্লাসের ইন্সটেন্স ভেরিয়েবল সাধারণ নিয়মে এক্সেস করতে গেলে সুপারক্লাসের ভেরিয়েবল সাবক্লাসের ভেরিয়েবল দ্বারা হাইড বা লুকিয়ে যায়।
এই সমস্যাটি দূর করার জন্যে super.variable_name এই ভাবে সুপারক্লাসের ভেরিয়েবল এক্সেস করতে হয়। সুপার কিওয়ার্ড সবসময় সাবক্লাসের ভিতরের জিনিস গুলোকে ইনভোক করে।
publicclass superclass1 {
inti; /* এটা এখানে ডিফল্ট ভাবে পাবলিক অবস্থায় আছে। এটাকে প্রাইভেট করে দিলে সাবক্লাস থেকে সুপারের মাধ্যমে আর এক্সেস করা যাবেনা। */ } |
publicclass subclass extends superclass1 {
inti;
subclass(intk, intl) { /* মেইন ক্লাসে আমরা সাবক্লাসের একটি অবজেক্ট তৈরি করেছি। তার মাধ্যমে দুইটি ভেলু পাস করে k এবং l এর মাঝে এসে super.i এর মাধ্যমে k এর ভেলু সুপারক্লাসের i এর মাঝে স্টোর হয় অন্যটি সাবক্লাসের i তে। এখানে super.i লিখা না হলে প্রথমেই k এর ভেলু সাবক্লাসের i তে স্টোর হত। */ super.i = k; i = l; }
void show() {
} } |
publicclass supermainclass {
publicstaticvoid main(String[] args) {
subclass ob = new subclass(10,15);
ob.show(); }
}
আউটপুটঃ
value of superclass i: 10 value of subclass i: 15 |
সুপারক্লাসের কোন্সট্রাক্টরের ক্ষেত্রেঃ
প্রত্যেক সাবক্লাসের কোন্সট্রাক্টরই ডিফল্ট ভাবে সুপার কিওয়ার্ড দ্বারা তার সুপারক্লাসের কোন্সট্রাক্টরকে ডেকে থাকে।
প্রত্যেক ক্লাসের ডিফল্ট কোন্সট্রাক্টর থাকে, সেটিও ডিফল্টভাবে সুপার এড করে।
publicclass superclass1 {
superclass1() {
} } publicclass subclass extends superclass1 { subclass() {
} /* এখানে সুপার কিওয়ার্ড ব্যবহার করা না হলেও এটি ডিফল্টভাবে সুপারক্লাসের কোন্সট্রাক্টরকে কল করে থাকে*/
} publicstaticvoid main(String[] args) {
subclass ob = new subclass();
} আউটপুটঃ Ashiq, you are drunk, now go home. if you dont go i will kill myself. |
আরেকটি উদাহরণঃ
publicclass superclass1 {
inti,j;
superclass1(finalinti,final intj) { /* এখানে লোকাল ভেরিয়েবলকে ফাইনাল করার কারণে তাদের ভেলুকে কমানো বা বাড়ানো যাবেনা। ইন্সটেন্স ভেরিয়েবল এবং লোকাল ভেরিয়েবল এক হওয়ার কারণে এখানে this ব্যবহার করা হয়েছে */ this.i = i; this.j = j; } |
publicclass subclass extends superclass1 {
intk;
subclass(intm, intn,finalintk) { super(m,n); /* এখানে লোকাল ভেরিয়েবল ৩ টি। কিন্তু আমাদের এই ক্লাসে ইন্সটেন্স ভেরিয়েবল আছে ১ টি। এই ক্লাসের অবজেক্ট ক্রিয়েট করার পর আমরা ৩ টি ভেলু পাস করিয়েছি। তার মাঝে ২ টি সুপারক্লাসের ইন্সটেন্স ভেরিয়েবলের জন্যে। প্রথম ২ টি আমরা সুপার কিওয়ার্ডের মাধ্যমে সুপারক্লাসে পাস করেছি। সুপার কিওয়ার্ড m, n এর ভেলুকে সুপারক্লাসের কোন্সট্রাক্টরে পাস করে এবং i এবং j এর মাঝে এসাইন করে, */ this.k = k; }
void show() {
} } /* যেহেতু সবাই পাবলিক তাই i, j কে সাবক্লাস থেকেও এক্সেস করা যাচ্ছে। */ |
publicclass supermainclass {
publicstaticvoid main(String[] args) {
subclass ob = new subclass(10,20,30);
ob.show(); } আউটপুটঃ i: 10 j: 20 k: 30 |
উপরের উদাহরণে আমরা দেখলাম সুপারক্লাসের জন্যে আলাদা কোন অবজেক্ট বা মেথোড ক্রিয়েট না করেই খুব সহজে সুপারের মাধ্যমে ভেলু পাস করে এসাইন করা যায়।
সুপারক্লাসের মেথোডের ক্ষেত্রেঃ
নিচের উদাহরণে এর প্রয়োগ দেখানো হলঃ
publicclass superclass1 {
inti, j;
superclass1(intm,intn) { i = m; j = n; }
void show() {
} |
publicclass subclass extends superclass1 {
intk;
subclass(intm, intn, into) { super(m,n); k = o; }
void show() { super.show();
}
} |
publicstaticvoid main(String[] args) {
subclass ob = new subclass(10,20,30);
ob.show(); } আউটপুটঃ 10 20 30
|
উপরের উদাহরণে সুপারক্লাস এবং সাবক্লাসে show() একই নামে ও রিটার্ন টাইপের মেথোড রয়েছে।
দুইটি একই নাম হওয়াতে সাবক্লাসের অবজেক্ট প্রথমে লোকাল মেথোডকে প্রায়োরিটি দিবে এবং তাকে এক্সেস করবে। যদি আমরা সাবক্লাসের মেথোডের ভিতরে super.method এর মাধ্যমে সুপারক্লাসের মেথোডকেও এক্সেস করতে পারি। যদি একটি মেথোড থাকে তাহলে সুপার ব্যবহারের দরকার নেই। সেটা নিজেরা চেষ্টা করে দেখতে পারো।
সুপারের সব ব্যবহার একই। সুপারক্লাসের জিনিসপত্রকে এক্সেস করতে সাহায্য করা। ব্যবহার সব ক্ষেত্রে অনেকটা একই।
ওয়ার্ডপ্রেসের কিছু ত্রুটির কারণে লিখা কিছু ক্ষেত্রে এক হয়ে গেছে। কষ্ট করে বুঝে নিতে হবে
আশিক
সি এস ই
আই আই ইউ সি