Java概要マルチステートと実装方法

3687 ワード

  • マルチステートとは何ですか?

  • 概念:同じ操作が異なるオブジェクトに作用し、異なる解釈があり、異なる実行結果を生成することができます.これが多態性です.
    簡単に言えば、ベースクラスの参照でサブクラスのオブジェクトを指します.
    例を挙げます.
    コンピュータの上のF 1ボタン、いかなるファイルを開けないでFをクリックします!システムのヘルプドキュメントが表示され、wordドキュメントを開いてF 1をクリックするとwordドキュメントのヘルプが表示され、同じボタンでも異なる処理が可能になります.
  • なぜマルチステートを使うのですか?

  • パッケージは実装の詳細を隠し、コードをモジュール化できることを知っています.継承は、既存のコードモジュール(クラス)を拡張します.コードの再利用を目的としています.
    マルチステートはコードの多重性に加えて、プロジェクトにおける密接なカップリングの問題を解決し、プログラムの拡張性を高めることができる.
    プロジェクトの結合度が高い場合、コードのメンテナンス時に1つの場所を修正することは多くの場所につながり、開発コストが絶えず増加し、結合度を低減することが保証されます.
    プログラムの拡張性.
    置換可能(substitutability).マルチステートは既存のコードに対して置換可能です.たとえば、マルチステートは円Circleクラスに対して動作し、円環などの他の任意の円形ジオメトリに対しても同様に動作します.
    拡張性(extensibility).マルチステートはコードに対して拡張性を有する.新しいサブクラスを追加することは、既存のクラスのマルチステート性、継承性、その他の特性の動作および操作に影響を及ぼさない.実際には、新しいサブクラスはマルチステート機能を獲得しやすい.例えば、円錐、半円錐および半球のマルチステートを実現した上で、球体クラスのマルチステート性を追加しやすい.
  • 開発では、どこでマルチステートを使用し、どのようにマルチステートを実現しますか?

  • インタフェース実装、抽象クラス、親を継承してメソッドの書き換え、同じクラスでメソッドの再ロードを行います.
  • インタフェース:放射線拡張、インタフェースに新しい方法が追加された場合、このインタフェースを実装するすべての実装方法を修正する必要があります.
  • インタフェースの変数はpublic static final変数として暗黙的に指定されます.
  • インタフェースのメソッドはすべて抽象的なメソッドです.
  • クラスは、複数のインタフェースを継承することができる.
  • インタフェースを実装するには、インタフェース内のすべての方法を実装する必要がある.
  • public interface InterDemo(){
        void setData();
        int getCount();
    }
    
    public class InterImpl implements InterDemo(){
        
        @Override
        public void setData(){
            //....
        }
        
        @Override
        public void getCount(){
            //....
        }
    }
  • 抽象クラス:拡張を延長し、抽象クラスにメソッドを追加すると、下位レベルの継承されたすべてのサブクラスは変更する必要がなく、呼び出す必要がある場合は親メソッドを直接呼び出すことができます.

  • 抽象クラスはクラス全体を抽象化し、属性、動作を含むが、インタフェースはクラスのローカル(動作)を抽象化するので、抽象クラスはプロジェクトの開始時に確定しなければならない共通クラスである.
    interface FlyInter {
        void fly();
    }
    
    public abstract class FlyGroups implements FlyInter{
        public String name = "   ";
        public String getName(){
            return name;
        }
        abstract void fun();
    }
    
    
    public class Airplane extends FlyGroups {
        @Override
        public void fly() {
            String name = super.getName();
            System.out.println(name);
        }
        @Override
        public void fun(){
        }
    }
  • 親を継承するメソッド書き換え
  • 縦方向に広がり、子クラスが親クラスを書き換える方法で広がります.
    public class Parent{
    
        public void fun(){
        }
    }
    
    public class Child extends Parent{
        @Override
        public void fun(){
            //     
        }
    }
  • 同じクラスでメソッドリロード
  • 横方向に広がり、メソッドの書き換えにはパラメータが異なり、パラメータの個数が異なり、戻り値が異なる.
    public void init(String name,int i){
            
    }
        
    public void init(int i,String name){
            
    }
        
    public void init(){
            
    }
        
    public int init(){
            
    }
  • 静的バインディングおよび動的バインディング
  • を延長する
    JVMメソッド呼び出しの静的(static binding)および動的バインドメカニズム(auto binding)
  • 動的バインド
  • 次のコードには、3つの概念マルチステート、メソッドオーバーライド、メソッド再ロードがあります.
    このようなプログラム実行中に動的に作成されたオブジェクトのメソッドテーブルによってメソッドを位置決めする方法は,動的バインドメカニズムとも多態の体現である.
    //        
    class Father{  
        public void f1(){  
            System.out.println("father-f1()");  
        }  
            public void f1(int i){  
                    System.out.println("father-f1()  para-int "+i);  
            }  
    }  
    //        
    class Son extends Father{  
        public void f1(){ //         
            System.out.println("Son-f1()");  
        }  
            public void f1(char c){  
                    System.out.println("Son-s1() para-char "+c);  
            }  
    }  
      
    
    
    public class AutoCall{  
        public static void main(String[] args){  
            Father father=new Son(); //    
            father.f1(); //    : Son-f1()  
        }  
    } 

     
  • 静的バインド
  • コンパイル段階でどのメソッドを呼び出すかを決定する方法を静的バインドメカニズムと呼び,newクラス呼び出し方法が静的バインドである.