মেথড ওভাররাইডিং জাভার রান-টাইম মেথড বাইন্ডিং ফিচারের কারণে কাজ করে। সুতরাং, যদি আমরা জাভা কম্পাইলারকে একটি মেথডের জন্য স্ট্যাটিক বাইন্ডিং করতে বাধ্য করি, তবে সেটি ডেরাইভড ক্লাসে ওভাররাইড হওয়া থেকে বাধা দেওয়া যাবে।
জাভাতে মেথড ওভাররাইডিং বাধা দেওয়ার ৩টি উপায় রয়েছে
- বেস ক্লাসে মেথডকে final করে
- বেস ক্লাসে মেথডকে static করে
- বেস ক্লাসে মেথডকে private করে
Final মেথড ওভাররাইড করা যায় না
একটি মেথডকে final করে আমরা একটি সীমাবদ্ধতা যোগ করছি যে ডেরাইভড ক্লাস এই নির্দিষ্ট মেথডটি ওভাররাইড করতে পারবে না।
উদাহরণ
class Base {
public void show() {
System.out.println("Base class show() method");
}
public final void test() {
System.out.println("Base class test() method");
}
}
class Derived extends Base {
public void show() {
System.out.println("Derived class show() method");
}
// can not override test() method because its final in Base class
/*
* public void test() { System.out.println("Derived class test() method"); }
*/
}
public class Test {
public static void main(String[] args) {
Base ref = new Derived();
// Final মেথড test() কল
ref.test();
// ওভাররাইড করা মেথড show() কল
ref.show();
}
}
আউটপুট
Base class test() method Derived class show() method
Static মেথড ওভাররাইড করা যায় না
আমরা ডেরাইভড ক্লাসে static মেথডগুলো ওভাররাইড করতে পারি না কারণ static মেথডগুলো ক্লাসের সাথে লিঙ্কড থাকে, অবজেক্টের সাথে নয়। অর্থাৎ যখন আমরা একটি static মেথড কল করি, JVM এটির কাছে this রেফারেন্স পাস করে না যেমনটি সেটি সব non-static মেথডের জন্য করে। তাই static মেথডের জন্য রান-টাইম বাইন্ডিং হতে পারে না।
উদাহরণ
class Base {
public void show() {
System.out.println("Base class show() method");
}
public static void test() {
System.out.println("Base class test() method");
}
}
class Derived extends Base {
public void show() {
System.out.println("Derived class show() method");
}
// এটি একটি ওভাররাইড করা মেথড নয়, এটি ডেরাইভড ক্লাসে একটি নতুন মেথড হিসেবে বিবেচিত হবে
public static void test() {
System.out.println("Derived class test() method");
}
}
public class Test {
public static void main(String[] args) {
Base ref = new Derived();
// এটি Base class-এর test() কল করবে কারণ এর স্ট্যাটিক বাইন্ডিং ছিল
ref.test();
// ওভাররাইড করা মেথড show() কল
ref.show();
}
}
আউটপুট
Base class test() method Derived class show() method
Private মেথড ওভাররাইড করা যায় না
বেস ক্লাসের private মেথডগুলো ডেরাইভড ক্লাসে দৃশ্যমান নয়, সুতরাং সেগুলো ওভাররাইড করা যায় না।
উদাহরণ
class Base {
public void show() {
System.out.println("Base class show() method");
}
private void test() {
System.out.println("Base class test() method");
}
}
class Derived extends Base {
public void show() {
System.out.println("Derived class show() method");
}
// এটি একটি ওভাররাইড করা মেথড নয়, এটি অন্য একটি মেথড হিসেবে বিবেচিত হবে।
public void test() {
System.out.println("Derived class test() method");
}
}
public class Test {
public static void main(String[] args) {
Base ref = new Derived();
// প্রাইভেট মেথড test() কল করা যাবে না, এই লাইন কম্পাইল টাইম এরর দেবে
// ref.test();
// ওভাররাইড করা মেথড show() কল
ref.show();
}
}
আউটপুট
Derived class show() method