Javaを学ぶDay 04

4957 ワード

インテリジェントポイント
 
インタフェース:
 
  1.インタフェースは機能の集合であり,同様にデータ型と見なすことができ,抽象クラスよりも抽象的な「クラス」である.
 
  2. インタフェースには抽象メソッドのみが許可され、非抽象メソッドは表示されません.
 
  3. インタフェースのソースファイルもjavaファイル、コンパイル後のファイルも.classなので、インタフェースを特殊なクラスと見なすことができます.
 
注意:
  • インタフェースは、他のクラスによって実装され、彼の抽象的な方法を実装するために、インタフェース内のメソッドのアクセス修飾子はpublic
  • として定義されなければならない.
  • インタフェースでは通常のメンバー変数は定義できず、public static finalメンバー変数
  • としてのみ定義できる.
  • 1クラスは複数のインタフェースを同時に実現できるが、抽象的な方法を実現する必要があり、インタフェースを作成する際に修飾子を省略することができ、システムは自動的に加算され、実現する際にはpublic
  • を追加しなければならない.
     
    インタフェースの特徴:
     
  • インタフェースはオブジェクト
  • を作成できません.
  • インタフェースの変数はpublic static final修飾を使用し、デフォルトを書かない場合は
  • を追加します.
  • インタフェースのメソッドはpublic abstrictであり、デフォルトを書かない場合は
  • を追加します.
  • サブクラスは、オブジェクトを作成するには、インタフェース内のすべての抽象メソッドを書き換える必要があります.
  • サブクラスがすべての抽象メソッドを書き換えることができない場合、サブクラスは抽象クラス
  • として定義する必要がある.
     
    インタフェースの役割:
     
  • 既存クラスを拡張する機能
  • 設定規則
  • 結合性を低下
  •  
    問題の分析:
     
    1.なぜインタフェースがマルチ継承を実現できるのか???
    答:インタフェースのメソッドはいずれも実装されていないため、2つの親インタフェースのメソッド名が同じであっても、サブクラスがインタフェースを実装する場合はあまり影響しません.
    書き換えさえすればよいので,インタフェースとインタフェースの間には多重継承がある.
     
    小さな練習:
    package com.day04;
    
    public interface HDMI {
    
        //        
        void  input();
    
        //      
        String  getName();
    }
    
    ///////////////////////////////////////////////////////////
    
    class computer implements HDMI{
    
        @Override
        public void input() {
            System.out.println("      。。。。。。");
        }
    
        @Override
        public String getName() {
    
            return "    ";
        }
    }
    
    /////////////////////////////////////////////////////////////
    
    class GameMachine implements HDMI{
        @Override
        public void input() {
            System.out.println("       。。。。。。");
        }
    
        @Override
        public String getName() {
            return "     ";
        }
    }
    
    //////////////////////////////////////////////////////////////////
    
    class  TV {
        public  void output(HDMI hdmi ) {
            //    
            hdmi.input();
            //      
            System.out.println("     :" +hdmi.getName());
        }
    }
    
    class  TestHDMI{
    
        public static void main(String[] args) {
            //      
            computer com = new computer();
            GameMachine game = new GameMachine();
            //      
            TV tv = new TV();
            tv.output(game);
        }
    }
    

     
     
     
    マルチステート:クラスが多様な状態を示す場合、私たちはこの現象をマルチステート現象と呼ぶ.
    マルチステートの表現形式:親の変数を子オブジェクトのアドレスに向ける
    条件:継承関係が必要
    マルチステートの表現:親インタフェース/親変数=newサブクラス/親インタフェースの実装クラスのオブジェクト
     
    注:同じ親のメソッドは、異なる子に書き換えられます.メソッドを呼び出すときに呼び出されるのは、各サブクラスに書き換えられたメソッドです.
     
     
    マルチステートの特徴:
  • メンバーメソッド:コンパイル時に見る=左、実行時に見る=右
  • メンバー変数:コンパイル時に見る=左、実行時に見る=左
  •  
    instanceofキーワード
    強制変換を直接行うと問題が発生する可能性があるので、オブジェクトinstanceofクラス名のように左のオブジェクトと右の変数が関係しているかどうかを判断するにはinstanceofを使用します.
     
    簡単な多態を練習する
    package com.day04.work01;
    
    import java.util.Random;
    
    public class People {
        /*
              People,     ,   Man,    Woman,Man        ,      lol,
        Woman        ,     shopping,
                  ,        ,   ,        50%   man,50%   woman,       ,
                 lol,   nv    shopping
         */
    }
    
    class Man extends People {
    
        Woman laopo;
    
        void lol() {
            System.out.println(" LOL。。。。。。");
        }
    
    }
    
    class Woman extends People {
    
        Man laogong;
    
        void shopping() {
            System.out.println("  。。。。。。。");
        }
    
        public People getBaby() {
    
            People peo = null;
            if (laogong != null) {
                Random ran = new Random();
                int x = ran.nextInt(2);
                if (x == 0) {
                    peo = new Man();
                } else if (x == 1) {
                    peo = new Woman();
                }
            }
            return peo;
        }
    }
    
    class TestPeople {
        public static void main(String[] args) {
            Man man = new Man();
            Woman woman = new Woman();
            woman.laogong = man;
    
            People peo = woman.getBaby();
            if (peo == null) {
                System.out.println("    ,     ");
                return;
            }
            if (peo instanceof Man) {
                Man m = (Man) peo;
                m.lol();
            } else {
                Woman wo = (Woman) peo;
                wo.shopping();
            }
    
        }
    }
    

      
     
     
    構築方法の特徴:
     
     
  • 構築メソッド名は、タイプと一致する必要があります.
  • の構成方法には、具体的な戻り値はありません.

  •  
     
     
     
     
    なぜ子クラスのコンストラクションメソッドは親クラスのコンストラクションメソッドを呼び出すのでしょうか???
     
    コンストラクションメソッド自体がオブジェクトのメンバー変数を初期化するため、親のコンストラクションメソッドもこの目的であり、呼び出さなければ親がどのような操作をしたのか分からないので、super()を暗黙的に呼び出すことができます.;
     
    子クラスは親クラスの内容を継承するので、子クラスは初期化時に親クラスに行って親クラスの初期化動作を実行する必要があります.これにより、親クラスのコンテンツを使用できます.
     
     
     
    子クラスが親クラスの無パラメトリック構築メソッドをデフォルトで呼び出す場合、親クラスに無パラメトリック構築メソッドがない場合、プログラムにどのような問題が発生しますか?コンパイラは自動的に対応するパラメータのある構造方法を見つけますか???
     
    親クラスに空のパラメトリック構造メソッドがない場合、子クラスの構造メソッドはエラーとなり、親クラスを呼び出すパラメータ付き構造メソッドを表示する必要があります.