オブジェクト向け四大特性(3):多形性


マルチファンクション:使いやすい


1.過負荷と過負荷


オブジェクト向けの多形性はオーバーライドとオーバーロードといえる.
上書き
  • :同じメソッド名、同じパラメータリストを使用して親クラスのメソッドを再定義します.すなわち、カバー率は재정의である.
  • オーバーロード:同じ方法名、異なるパラメータリストを使用して複数のメソッドを繰り返し定義します.すなわち、過負荷は중복정의である.
  • サンプルコードは次のとおりです.
    Animal.java
    package polymorphism01;
    
    public Class Animal {
        public String name;
        
        public void showName(){
            System.out.printf("안녕 나는 %s야. 반가워\n", name);
        }
    }
    Penguin.java
    package polymorphism01;
    
    public Class Penguin extends Animal {
        public String habitat;
        
        public void showHabitat(){
            System.out.printf("%s는 %s에 살아\n", name, habitat);
        }
        
        // 오버라이딩 - 재정의 : 상위 클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트
        public void showName() {
            System.out.println("어머 내 이름은 알아서 뭐하게요?");
        }
        
        // 오버로딩 - 중복정의 : 같은 메서드 이름, 다른 인자 리스트
        public void showName(String yourName) {
            System.out.println("%s 안녕, 나는 %s라고 해\n", yourname, name);
        }
    }
    Driver.java
    package polymorphism01;
    
    public Class Driver {
        public static void main(String[] args) {
            Penguin pororo = new Penguin();
            
            pororo.name = "뽀로로";
            pororo.habitat = "남극";
            
            pororo.showName();	// 어머 내 이름은 알아서 뭐하게요?
            pororo.showName("초보람보");  // 초보람보 안녕, 나는 뽀로로라고 해
            pororo.showHabitat();  // 뽀로로는 남극에 살아
            
            Animal pingu = new Penguin();
            
            pingu.name = "핑구";
            pingu.showName(); // 어머 내 이름은 알아서 뭐하게요?
        }
    }

    2.多形性とTメモリ


    上にあるDriverJavaクラスを表示します.Driver.Javaでは、Penguin pororo=new Penguin()実行後のTメモリスナップショットは以下の通りです.

    ここで注目すべきは、Penguinクラスが親AnimalクラスのshowName()メソッドとshowName(yourName:String)メソッド(繰り返し定義)を上書きしていることです.
    Animal pingu = new Penguin(); 実行後のTメモリスナップショットは以下の通りです.

    pinguオブジェクト参照変数のタイプはAnimalタイプです.それでも、図では、AnimalオブジェクトのshowName()がPenguinオブジェクトのshowName()によって隠されています.だからpingshowName()メソッドAnimalオブジェクトではなくPenguinオブジェクトによって定義されたshowName()メソッドで再定義されたshowName()メソッドを実行します.
    親クラスタイプのオブジェクト参照変数を使用しても、サブクラスのオーバーライド(再定義)メソッドが呼び出されることを覚えておいてください.

    3.多形性をサポートしない言語


  • overloadingを使用すると、関数名とパラメータリストを1つ使うだけで便利です.特にjava 5に追加された제네릭を用いて,1つの関数だけで複数の関数を実現できる.多形性を使い勝手と定義したのは,そのためである.

  • overridingの場合、형변환이나 instanceOf 연산자를 써서 하위 클래스가 무엇인지 신경 쓰지 않아도 된다は、サブクラス再定義メソッドによって呼び出されてもよい.親クラスタイプのオブジェクト参照変数でサブクラスオーバーライドを自動的に呼び出す方法により、コードの簡潔性を維持できます.
  • Driver.java
    Class Driver {
        public static void main(String[] args) {
            동물[] 동물들 = new 동물[5];
            
            동물들[0] = new();
            동물들[1] = new 고양이();
            동물들[2] = new 강아지();
            동물들[3] = new 송아지();
            
            for(int i = 0; i < 동물들.length; i++) {
                동물들[i].울어보세요();
            }
        }
    }
    上記のソースコードを考えてみましょう.「泣きましょう()」という方法を定義し、低級動物のネズミ、猫、子犬、子牛の類では、誰もが泣いたことがあると仮定した()方法.実行の結果、どの動物もその子のタイプに応じて泣きます.実行結果は次のようになります.
    나는 쥐! 찍! 찍!
    나는 고양이! 야옹! 야옹!
    나는 강아지! 멍! 멍!
    나는 송아지! 음메! 음메!
    オーバーライド再定義メソッドにより、オーバーライド再定義メソッドにより、メソッドの繰り返し定義により多形性が提供され、多形性は開発者がプログラムを作成する際に使いやすさが提供されます.
    リファレンス
  • Javaオブジェクト向けSpringの入門原理と
  • を理解する