Javaを勉強しているときに、ポリモーフィズムという概念に出会いました。私は、実際の使用法を掘り下げる前に基本原則を理解する傾向があるため、ここに私の解釈を文書化しました。
ポリモーフィズムの本来の意味は「多様性」です。ただし、この記事の文脈では、クラス継承またはインターフェイス実装による関係がある限り、エラーを引き起こすことなく、変数がさまざまな型のオブジェクトを保持できる機能を指します。
通常、変数の型は、変数が参照するオブジェクトの型と一致します。
Animal animal = new Animal();
ただし、オブジェクトがクラスを拡張する場合、変数はスーパークラスの型として扱うことができます。
Animal animal = new Dog(); // Dog extends Animal
さらに、オブジェクトがインターフェイスを実装している場合、それをインターフェイス型として扱うことができます。
// Interface definition interface Animal { void makeSound(); // Method in the interface } // Classes implementing the interface class Dog implements Animal { public void makeSound() { System.out.println("Woof!"); // Dog-specific implementation } } class Cat implements Animal { public void makeSound() { System.out.println("Meow!"); // Cat-specific implementation } } // Main method public class Main { public static void main(String[] args) { // Assign objects to variables of the interface type Animal myDog = new Dog(); Animal myCat = new Cat(); // Call the interface method myDog.makeSound(); // Outputs "Woof!" myCat.makeSound(); // Outputs "Meow!" } }
これにより、異なるクラスを同じ型として扱うことができ、柔軟なコーディングが可能になります。
変数の型とオブジェクトの型がどのように異なるかを議論していると、「型」とは正確には何なのかという疑問が生じます。私の分析に基づいて、型は次の目的を果たすと結論付けました:
前の例を参照:
Animal animal = new Dog(); // Dog extends Animal
これは、メモリが Dog に割り当てられるが、変数は内容を Animal として解釈することを意味します。コンセプトは次のように視覚化できます:
A タイプはフィルター レンズのように機能し、データがどのように認識されるかを決定します。レンズを変更することで、スーパークラス内の一般的なメソッドやインターフェイスを介した特定のメソッドに焦点を当てることができます。
ポリモーフィズムの利点がクラス間で共通のメソッドを処理できることであるのに、なぜ常にスーパークラスで変数を宣言しないのかと不思議に思う人もいるかもしれません。その理由は、このような場合、メモリはスーパークラスのデータにのみ割り当てられるためです。
サブクラスをスーパークラスにキャストすることは可能ですが (アップキャスト)、その逆は当てはまりません。これは、サブクラスにはスーパークラスのデータに加えて独自の一意のデータが含まれるためです。したがって、メモリはサブクラスに事前に割り当てられ、アップキャストを通じてサブクラス固有のメソッドを使用できるようになります。
インターフェイスはタイプとしても機能し、オブジェクトのメモリに格納されているデータを処理するためのフィルター レンズとしての役割は、概念的にはクラスの役割と似ています。インターフェイスを通じて呼び出されるメソッドは、変数の型 (動的バインディング) ではなく、オブジェクトの型によって決まります。これは、変数の型が単にフィルターとして機能し、フィルターされたデータを利用できるようにするという考えを強化します。
ポリモーフィズムは、個々の特性を活用しながら共通のプロセスを統合する必要があるシナリオで役立ちます。探索を通じて、オブジェクトのメモリ レイアウトはその型によって決定される一方、変数の型はそのメモリがどのように解釈されるかを制御するということをよりよく理解しました。これは私にとって重要な認識でした。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3