【アリクラウド】Java対象開発カリキュラムノート(十五)

9995 ワード

  • finalキーワード
  • 2マルチステート
  • 1.1概念
  • 1.2まとめ


  • 1 finalキーワード
    Javaではfinalはターミナルと呼ばれ、finalを使用してクラス、メソッド、プロパティを定義できます.1.finalで定義されたクラスを使用します.サブクラスは使用できません.2.final定義を使用する方法では、布団類の上書きは許可されません.3.finalで定義した変数は定数となり、定数は定義時に値を付けなければならず、値は変更できません.開発ではpublic static finalを使用してグローバル定数を定義します.また、定数の識別子はすべて大文字で命名する必要があります.eg:public static final int LEVEL_A=100;
    2多態性
    1.1概念
    Javaのマルチステートのコア:
  • 法の多態性:
  • メソッドのリロード:同じメソッド名は、パラメータのタイプおよび個数に応じて異なるメソッドボディを呼び出すことができる.
  • メソッドの上書き:同じ親メソッドでは、インスタンス化されたサブクラスによって実装が異なる場合があります.

  • オブジェクトのマルチステート(前提:メソッド上書き):
  • 【自動】オブジェクトのアップグレード:親親オブジェクト=子インスタンス;
  • 【強制】オブジェクトのダウンシフト:サブクラスサブクラスオブジェクト=(サブクラス)親インスタンス;


  • 例:単純なプログラムを振り返る
    コード#コード#
    class A {
        public void print(){
            System.out.println("[A] public void print(){}");
        }
    }
    class B extends A{
        public void print(){
            System.out.println("[B] public void print(){}");
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            B b = new B(); //        
            b.print(); //          
        }
    }

    出力結果
    [B] public void print(){}

    例:アップグレードの実現
    コード#コード#
    class A {
        public void print(){
            System.out.println("[A] public void print(){}");
        }
    }
    class B extends A{
        public void print(){
            System.out.println("[B] public void print(){}");
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            A a = new B(); //     
            a.print();
        }
    }

    出力結果
    [B] public void print(){}

    アップグレードが発生したかどうかにかかわらず、その本質的な核心は、どのサブクラス(newがどこにあるか)、呼び出された方法がクラスに上書きされているかどうかにある.ダウンシフトとは、親オブジェクトを子オブジェクトに変更することです.なぜですか.サブクラス拡張操作を使用する必要がある場合に使用します.例:ダウンシフトの実現
    コード#コード#
    class A {
        public void print(){
            System.out.println("[A] public void print(){}");
        }
    }
    class B extends A{
        public void print(){
            System.out.println("[B] public void print(){}");
        }
        public void funB(){
            System.out.println("[B] public void funB(){}");
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            A a = new B(); //     
            a.print();
            //                       
            //      B   funB()  ,          
            B b = (B) a; //     
            b.funB();
        }
    }

    出力結果
    [B] public void print(){}
    [B] public void funB(){}

    すべての親が下に転換できるわけではありません.下に転換する前に必ず上へ転換しなければなりません.そうしないと、転換時にClassCastExceptionが現れます.先進的な行判は、転換を行い、instanceofキーワードに頼って実現されています.
  • サブクラスオブジェクトinstanceofクラス、boolean型データ
  • を返す
    例:instanceofキーワードの使用
    コード#コード#
    class A {
        public void print(){
            System.out.println("[A] public void print(){}");
        }
    }
    class B extends A{
        public void print(){
            System.out.println("[B] public void print(){}");
        }
        public void funB(){
            System.out.println("[B] public void funB(){}");
        }
    }
    class C extends A {}
    public class TestDemo {
        public static void main(String[] args) {
            A a = new B(); //        
            System.out.println(a instanceof A);
            System.out.println(a instanceof B);
            if (a instanceof B){ //   ClassCastException
                B b = (B) a ;
                 b.funB();
            }
        }
    }

    出力結果
    true
    true
    [B] public void funB(){}

    この転換は何の意味がありますか?例:Personクラスのすべてのサブクラスインスタンスを受信し、Personクラスのメソッドを呼び出すメソッドを定義する必要があります.
    コード#コード#
    class Person {
        public void takeoff(){
            System.out.println("take off");
        }
    }
    class Student extends Person {
        public void takeoff(){
            System.out.println("piece");
        }
    }
    class Woker extends Person {
        public void takeoff(){
            System.out.println("all");
        }
    }
    public class TestDemo {
        public static void main(String[] args) {
            in(new Student());
            in(new Woker());
        }
        public static void in(Person per){
            per.takeoff();
        }
    
    }

    出力結果
    piece
    all

    オブジェクトのアップグレードの最も核心的な用途:操作パラメータの統一.
    1.2まとめ
  • オブジェクトの多態性実現の核心は、方法の上書きである.
  • オブジェクトのアップコンバートによって受信パラメータの統一を実現し、ダウンコンバートによってサブクラス拡張方法の呼び出しを実現することができる(一般的にはダウンコンバートを操作しない).
  • 関係のない2つのクラスオブジェクトは転換できません.ClassCastExceptionは必ず発生します.下への転換にはセキュリティ上の危険性があります.