Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでメソッドのオーバーライドを防ぐ方法はいくつありますか?


メソッドのオーバーライド Javaのランタイムメソッドバインディング機能のために機能します。したがって、Javaコンパイラにメソッドの静的バインディングを強制する場合、そのメソッドが派生クラスでオーバーライドされるのを防ぐことができます。

Javaでのメソッドのオーバーライドを3つの方法で防ぐことができます

  • 基本クラスでメソッドを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();
   // Calling the final method test()
      ref.test();
   // Calling the overridden method show()
      ref.show();
   }
}

出力

Base class test() method
Derived class show() method

静的メソッドはオーバーライドできません

静的メソッドはオブジェクトではなくクラスにリンクされているため、派生クラスの静的メソッドをオーバーライドすることはできません。つまり、静的メソッドを呼び出すと、JVMは、すべての非静的メソッドの場合のように、この参照をメソッドに渡しません。したがって、静的メソッドに対して実行時バインディングを実行することはできません。

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");
   }
      // This is not an overridden method, this will be considered as new method in Derived class
   public static void test() {
      System.out.println("Derived class test() method");
   }
}
public class Test {
   public static void main(String[] args) {
      Base ref = new Derived();
      // It will call the Base class's test() because it had static binding
      ref.test();
      // Calling the overridden method show()
      ref.show();
   }
}

出力

Base class test() method
Derived class show() method

プライベートメソッドはオーバーライドできません

基本クラスのプライベートメソッドは派生クラスに表示されないため、オーバーライドできません。

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");
   }
   // This is not an overridden method, this will be considered as other method.
   public void test() {
      System.out.println("Derived class test() method");
   }
}
public class Test {
   public static void main(String[] args) {
      Base ref = new Derived();
   // Cannot call the private method test(), this line will give compile time error
   // ref.test();
   // Calling the overridden method show()
      ref.show();
   }
}

出力

Derived class show() method

  1. JavaHashMapクラスの使用方法

    プログラミングでは、データ型は特定の種類のデータを分類するために使用されます。各データ型は異なる方法で格納され、値が格納されるデータ型によって、値に対して実行できる操作が決まります。 Javaで作業しているときに遭遇する可能性のあるクラスの1つは、JavaHashMapクラスです。このクラスはコレクションフレームワークの一部であり、開発者はMapデータ型を使用してデータを格納できます。 このチュートリアルでは、Java HashMapの基本、HashMapの作成方法、およびHashMapクラスを操作するときに使用できる主なメソッドについて説明します。この記事では、HashMapクラ

  2. Javaのデフォルトメソッドを使用してダイヤモンド問題を解決する方法

    継承 1つのクラスが他のクラスのプロパティを継承する2つのクラス間の関係です。この関係は、extendsキーワードを使用して-として定義できます。 public class A extends B{} プロパティを継承するクラスはサブクラスまたは子クラスと呼ばれ、プロパティを継承するクラスはスーパークラスまたは親クラスです。 継承では、スーパークラスメンバーのコピーがサブクラスオブジェクトに作成されます。したがって、サブクラスオブジェクトを使用すると、両方のクラスのメンバーにアクセスできます。 多重継承とは、1つのクラスが複数のクラスのプロパティを継承することです。言い換えると、多重継承