Java day 08——マルチステート、内部クラス

22284 ワード

ここに目次の見出しを書きます
  • マルチステート
  • 前提
  • 表現
  • メンバー変数の呼び出し
  • メソッドの呼び出し
  • まとめ
  • 型変換異常
  • 内部クラス
  • メンバー内部クラス
  • アクセス機能
  • 内部クラスオブジェクトフォーマット
  • を作成する.
  • ローカル内部クラス
  • 匿名内部クラス
  • 静的内部クラス
  • マルチステート
    多態:同一であり、複数の異なる表現形式を有することを指す.これは、カプセル化、継承に続いて、オブジェクトへの3番目の大きな特性です.生活の中で、走る動作のように、⼩猫、⼩犬と大象は、走ると同じではありません.さらに、しかし、同じように、異なるものを通じて、異なる形態を体現することができます.多態、このような状態を説明します.
    前提条件
  • 継承または実現【二者択一】、異なる種類、2つのタイプ
  • 案の書き換え【意味体現:書き換えない、意味がない】
  • ⽗類引用指向⼦類対象【フォーマット体現】
  • 表現
    親タイプリファレンスは、子タイプオブジェクト->アップモールド親タイプa=new子タイプオブジェクト()を指します.インタフェースタイプa=new実装クラスオブジェクト()
    メンバー変数の呼び出し
  • マルチステート表現態様1:メンバー変数の呼び出し、子親クラスに同じメンバー変数があり、get/setメソッド
  • のペアがある.
  • 参照によってメンバー変数-f.ageを直接呼び出す場合は、左のタイプ
  • を参照してください.
  • メソッドによってメンバー変数-f.getAge()が呼び出され、右側のオブジェクト
  • が表示されます.
    public class Fu {
        int age = 10;
        int num = 100;
    
        public void m1() {
            System.out.println("Fu m1  ");
        }
        public void m2() {
            System.out.println("Fu m2  ");
        }
        public int getAge() {
            return this.age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    public class Zi extends Fu {
        //            
        int age = 20;
        //             -          
        int score = 150;
        //          num  
    
        //       m1  
        @Override
        public void m1() {
            System.out.println("Zi m1  ");
        }
        //       m2  
    
        //         m3
        public void m3() {
            System.out.println("Zi m3  ");
        }
        @Override
        public int getAge() {
            return age;
        }
    }
    
    public class Main {
       public static void main(String[] args) {
            //               
            Fu f = new Zi();
    
    public class Main1 {
        public static void main(String[] args) {
            Fu f = new Zi();
            System.out.println(f.age); // 10
            
            //       getAge()  ,   20,     getAge()  ,   10
            System.out.println(f.getAge()); // 20
            
            // Fu      score  ,       
    //        System.out.println(f.score);
            // int a = (int)3.14;   double d = 3;
            //       
            Zi zi = (Zi) f;
            System.out.println(zi.score);
    
    

    メソッドの呼び出し
  • マルチステートの表現態様2:メンバメソッドの呼び出し
  • 最終的に呼び出されたメソッドはどれですか.サブクラスを優先的に呼び出す書き換えられ、サブクラスに書き換えがなければ、親クラスを呼び出すメソッド
  • です.
    public class Main2 {
        public static void main(String[] args) {
            Fu f = new Zi();
            f.m1();//  :“Zi m1  ”
            // m3   Fu   ,         
    //        f.m3();
            //            ,       
            Zi zi = (Zi) f;
            zi.m3();
        }
    }
    

    まとめ
    左のタイプは変数がどのメソッドを呼び出すことができるかを決定し、右のタイプは最終的に使用するメソッドがどのメソッドであるかを決定します-自分が書き換えたコンパイラを優先的に呼び出す=左のタイプ、実行時にJVMを見る=右のタイプの口癖:コンパイルは左を見て、実行は右を見て
    タイプ変換例外
    ClassCastException:タイプ変換例外解決策:変換前に参照が実際に変換されるタイプオブジェクト参照a instanceofサブタイプ=>booleanがaが実際にサブタイプオブジェクトかどうかを尋ね、true/falseを返す
    public abstract class Animal {
        public abstract void eat();
    }
    public class Dog extends Animal {
        @Override
        public void eat() {
            System.out.println("    !");
        }
        public void watchHouse() {
            System.out.println("   !");
        }
    }
    public class Cat extends Animal {
        @Override
        public void eat() {
            System.out.println("   !");
        }
        public void catchMouse() {
            System.out.println("       !");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Animal d = new Dog();
            d.eat();
            Animal c = new Cat();
            c.eat();
    
            //     cat  catchMouse  ,    
            Cat cat = (Cat) c;
            cat.catchMouse();
            //     c Animal  ,  Dog     ,       
            //    ,   c    Cat,      Dog,   ClassCastException
            if(c instanceof Dog) {
                Dog dog = (Dog) c;
                dog.watchHouse();
            }
            giveMePet(new Dog());
            giveMePet(new Cat());
        }
        // Animal       ,                   
        public Animal salePet() {
            return null;
        }
        // Animal    ,            
        public static void giveMePet(Animal a){
            if (a instanceof Dog) {
                ((Dog) a).watchHouse();
            } else if (a instanceof Cat) {
                ((Cat) a).catchMouse();
            }
            a.eat();
        }
        /*public static void giveMePet(Dog d) {
            d.watchHouse();
            d.eat();
        }*/
    
        /*public static void giveMePet(Cat d) {
            d.catchMouse();
            d.eat();
        }*/
    
    }
    

    内部クラス
    類中写个類人体類中有心臓類车類中有エンジン類種類:メンバー内部類、静的内部類、局所内部類[匿名内部類]
    メンバーの内部クラス
    メンバー内部クラス:権限public,protected,(default),private構文:public class Outer//...public class Inner///...}
    アクセス機能
    内部クラスでは、外部クラスメンバーの外部クラスを自由に使用できます.内部クラスメンバーを使用する場合は、内部クラスオブジェクトに関係のないクラスを作成する必要があります.内部クラスメンバーを使用します.1.間接呼び出し、外部クラスメソッドで内部クラスメソッドmainメソッドを呼び出し、外部クラスメソッドを呼び出します.2.直接呼び出し、内部クラスオブジェクトの外部クラスを作成する必要があります.内部クラスa=new外部クラス().new内部クラス();内部クラスと外部クラスの同じ名前のメンバー変数外部クラスのメンバー変数:外部クラス.this.変数内部クラスのメンバー変数:this.変数
    内部クラスオブジェクトフォーマットの作成
    外部クラス名.内部クラス名オブジェクト名=new外部タイプ().new内部タイプ();
    ローカル内部クラス
    ローカル内部クラス:メソッド内部でクラスを定義し、メソッド内でのみ有効に権限修飾子を使用することはできませんローカル内部クラスでは、ローカル変数を使用するには、finalのJDK 8でなければなりませんが、ローカル変数は実際には変更されていません.
    ローカル内部クラス、必要なクラスは一度だけ使用し、最適化->匿名内部クラス
    匿名の内部クラス
    継承抽象クラスまたは実装インタフェース構文:newインタフェース/抽象クラス(){int a;//実装のすべての抽象メソッド}匿名内部クラスは、一度しか使用できません.newオブジェクト匿名オブジェクトは、一度しか使用できません.一度だけメソッドを呼び出すことができます.注意:匿名内部クラスと匿名対象は同じではありません.
    静的内部クラス
    静的内部クラス比較メンバー内部クラス=>静的メソッドとメンバーメソッド