English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java 流程制御

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 異常処理

Java 列表(List)

Java Queue(キュー)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Javaの他のトピック

Java 多態性

このチュートリアルでは、多態性、異なる種類の多態性、およびそれらをJavaで実現する方法について例を通じて学びます。

ポリモーフィズムはオブジェクト指向プログラミングの重要な概念です。これは、ただ一つの形があるという意味ではありません。つまり、同じエンティティ(メソッド、演算子またはオブジェクト)が異なる状況で異なる行動を示すという意味です。例えば、

Javaでは、+演算子は特定の二つの機能を実行するために使用されます。数値(整数および浮動小数点数)と一緒に使用される場合、加法演算が行われます。

int a = 5;
int b = 6;
int sum = a + b;     //  sum = 11

次のように、+演算子が文字列と一緒に使用される場合、文字列結合が実行されます。例えば、

String firstName = "abc ";
String lastName = "xyz";
name = firstName + lastName;     //  name = abc xyz

ポリモーフィズムの種類

Javaでは、ポリモーフィズムは二つの種類に分けられます:

  • 動的ポリモーフィズム

  • コンパイル時多態性

動的ポリモーフィズム

Javaでは、メソッドのオーバーライドを通じて動的ポリモーフィズムを実現できます。

親クラスおよびその子クラスで同じメソッドが作成された場合、呼び出されたメソッドはそのメソッドを呼び出したオブジェクトに依存します。例えば、

例1:メソッドのオーバーライド

abstract class Animal {
   public abstract void makeSound();
}
class Dog extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Bark bark..");
   }
}
class Cat extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Meow meow..");
   }
}
class Main {
   public static void main(String[] args) {
     Dog  d1 = new Dog();
      d1.makeSound();
      Cat c1 = new Cat();
      c1.makeSound();
   }
}

出力

Bark bark…
Meow-meow...

メソッドオーバーライドの動作原理を理解するには、Javaでのメソッドオーバーライド

上記の例では、该方法makeSound()は二つの異なるクラスで異なる実装を持っています。プログラムを実行するときに

  • 表現d1.makeSound()はDogクラスのメソッドを呼び出します。これはd1はDogクラスのオブジェクトです。

  • 表現c1.makeSound()はCatクラスのメソッドを呼び出します。これはc1はCatクラスのオブジェクトです。

プログラムの実行中に呼び出すべきメソッドを決定します。したがって、メソッドオーバーライドはランタイム多態性です。

コンパイル時多態性

Javaでのメソッドオーバーロードとオペラトアオーバーロードを使用して、コンパイル時多態性を実現できます。

メソッド重载

Javaのクラスでは、引数が異なる場合、同じ名前でメソッドを作成できます。例えば、

void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }

これはJavaではメソッドオーバーロードと呼ばれます。

メソッドオーバーロードの例として見てみましょう。

例3:メソッドオーバーロード

class Demo {
 public void displayPattern(){
   for(int i = 0; i < 10; i++) {
     System.out.print("*");
   }
 }
 public void displayPattern(char symbol) {
   for(int i = 0; i < 10; i++) {
     System.out.print(symbol);
   }
 }
}
class Main {
 public static void main(String[] args) {
   Demo d1 = new Demo();
   d1.displayPattern();
   System.out.println("\n");
   d1.displayPattern('#');
 }
}

出力

**********
##########

上記のプログラムでは、displayPattern()メソッドがオーバーロードされています

  •  もし何もパラメータを渡さずにこのメソッドを呼び出した場合、それが作成されます * 文字のパターン。

  •  このメソッドを文字列引数として呼び出すと、#文字のパターンが作成されます。

メソッド重载に関する詳細情報を取得するには、以下のURLにアクセスしてくださいメソッド重载

Javaのメソッド重载 VS メソッドオーバーライド

  • メソッドのオーバーライドの場合、メソッドは異なるクラスに存在する必要があります。しかし、メソッドのオーバーロードの場合、メソッドは同じクラスに存在する必要があります。

  •  メソッドのオーバーライドは実行時に行われ、メソッドのオーバーロードはコンパイル時に行われます。

演算子のオーバーロード

Javaの特定の演算子は異なる操作数に対して異なる動作をします。例えば、

  • + 演算子は数字の加法および文字列結合を実行するためにオーバーロードされます。

  • &、|、!が論理およびビット演算のオーバーロードに使用されます。

Javaで演算子のオーバーロードがどのように機能するかを見てみましょう。

Javaでは、+演算子は特定の機能を実行するために使用されます。数字(整数および浮点数)と一緒に使用される場合、加法演算が実行されます。例えば、

int a = 5;
int b = 6;
int sum = a + b;     //  sum = 11

次のように、+演算子が文字列と一緒に使用される場合、文字列結合が実行されます。例えば、

String firstName = "abc ";
String lastName = "xyz";
name = firstName + lastName;     //  name = abc xyz

C ++このような言語では、異なる操作数に対して異なる処理を行うための演算子を定義できますが、Javaはユーザー定義の演算子オーバーロードをサポートしていません。

ポリモーフィズムの理由は何ですか?

ポリモーフィズムにより、一貫したコードを作成できます。例えば、

円と正方形を描画する必要がある場合、Polygonクラスを作成し、Circleとsquareがその2つのサブクラスを継承します。この場合、異なる名前のメソッドを作成するのではなく、同じ名前のrender()メソッドを両方のサブクラスに作成する必要があります。

私たちのメソッドオーバーロードの例では、一貫性を保つために同じメソッド名displayPattern()を使用して、異なるパターンを表示しています。

Javaのprint()メソッドもポリモーフィズム(メソッドオーバーロード)の例です。同じメソッドが異なるデータ型の値、例えばchar、int、Stringなどに適用されます。また、同じメソッドを使用して複数の値を一度に印刷することもできます。

ポリモーフィズムの変数

Javaでは、オブジェクト変数(インスタンス変数)はポリモーフィズムの行動を表す。これは、クラスのオブジェクト変数がそのクラスのオブジェクトおよびそのサブクラスのオブジェクトを参照できるためです。例えば、

class Animal {
   public void displayInfo() {
      System.out.println("I am an animal.");
   }
}
class Dog extends Animal {
   @Override
   public void displayInfo() {
      System.out.println("I am a dog.");
   }
}
class Main {
   public static void main(String[] args) {
    
      //Animalクラスのオブジェクト変数aの宣言1
      Animal a1;
    
     //Animalクラスのオブジェクトの作成
      a1 = new Animal();
      a1.displayInfo();
     //dogクラスのオブジェクトの作成
      a1 = new Dog();
      a1.displayInfo();
   }
}

出力

I am an animal.
I am a dog.

上記の例では、Animalクラスのオブジェクト変数aを生成しました。1。ここでは、a1はポリモーフィック変数です。

これは、

  • 文の a1 = new Animal(),a1Animalクラスを参照するオブジェクト。

  • 文の a1 = new Dog(),a1Dogクラスを参照するオブジェクト。

これはJavaでの向上変換の例です。もっと詳しく知りたい場合は、以下のURLにアクセスしてください。Javaの向上変換と向下変換