継承


1.javaの継承


1-1. 継承


  • オブジェクト向けプログラミングの基本思想の一つは,オブジェクト間の関係を確立する方法である.

  • 従来の方法では、既存のクラスから属性とアクションを継承して新しいクラスを作成し、オブジェクト間の関係を設定し、コードの重複を最小限に抑えることができます.

  • 次に、クラス間関係を表すときによく使われるクラス図を示します.SUVとSEDANクラスはCarクラスのすべての属性と動作を持ち,新しい属性と動作を持つ.
  • class Car {
        var mSpeed;
        void accelerate(float value) {...}
        void break(float value) {...}
    }
    
    class SUV extends Car {
        boolean misOffRoadMode;
        void setOffRoadMode(boolean mode) {...}
        boolean isOffRoadMode() {...}
    }
    
    class SEDAN extends Car {
        int mDrivingMode;
        void setDrivingMode(int mode) {...}
    }
    

    1-2. Java継承フィーチャー


  • extends定語による継承

  • マルチクラス継承はサポートされていません

  • 親の作成者は継承しません

  • 変数またはメソッドにprivateアクセス指定子がある場合、変数は継承されますが、すぐにアクセスできません.メソッドは継承されません.

  • 静的変数とメソッドも継承されます

  • Objectクラスは最上位クラスであり、Objectクラスのみ親クラスを持つことはできません.
  • 2.スーパーキー


    super:親への参照変数

  • super.変数またはsuper.method()のように親クラスのメンバーにアクセスできます

  • super()は親クラスのジェネレータを呼び出します.コンストラクション関数で使用するには、this()のようにコンストラクション関数の最初の行に作成する必要があります.
  • 子クラスのインスタンスには親クラスのメンバーも含まれているため、親クラスの作成者を呼び出す必要があります.各クラスはObjectクラスのサブクラスであるため、Objectクラスの作成者に遡って呼び出されます.コンストラクション関数でsuper()が呼び出されていない場合、コンパイラはコンストラクション関数の最初の行に自動的に追加されます.これが因子を受け入れない基本生成者も注意しなければならない理由である.デフォルトのコンストラクション関数がない場合、クラスを継承するクラスからsuper()を呼び出すとエラーが発生します.
    // 오류 발생
    class Parent {
        int a;
        Parent(int n) { a = n; }
    }
    
    class Child extends Parent {
        int b;
        Child() {
            super();
            b = 20;
        }
    // 정상 작동
    class Parent {
        int a;
        Parent() { a = 10; }
        Parent(int n) { a = n; }
    }
    
    class Child extends Parent {
        int b;
        Child() {
            super();
            b = 20;
        }

    3.メソッドオーバーフロー


    OOPの多形性を実現する1つの方法は、サブクラスで同じ記号の同じ方法を再定義して異なるようにすることである

    3-1. 上書き条件


  • メソッドの宣言部分は、既存のメソッドと完全に同じである必要があります.メソッドの戻りタイプが親の戻りタイプに変換できる場合は、変更できます.

  • 親メソッドの範囲より小さいアクセス制御者に変更できません.

  • 親メソッドよりも広い範囲の例外は宣言できません
  • 3-2. Javaの上書き

    class Parent {
        void smth() {...}
    }
    
    class Child {
        @Override 
        void smth() {...}
    }
    @Overrideのプレゼンテーションでは、親クラスを上書きするメソッドをコンパイラに伝えます.コメントを追加する必要はありませんが、コンパイル時間の検証とエラーの確認を可読性の面で行うことが望ましいです.

    4.動的方法の派遣


    オーバーライド+アップリンクによる実行時間異機種化
  • 実行時に実行する既存のメソッドと上書きメソッドを決定
    class Car {
        void printType() {
            System.out.println("자동차");
        }
    }
    
    class SEDAN extends Car {
        @Override
        void printType() {
            System.out.println("세단");
        }
    }
    
    class SUV extedns Car {
        @Override
        void printType() {
            System.out.println("SUV");
        }
    
    }
    
    public class Main {
        public static void main(String[] args) {
            Car ref = new Car();
            ref.printType  // 자동차
            // 업캐스팅
            ref = new SEDAN();
            ref.printType  // 세단
            // 업캐스팅
            ref = new SUV();
            ref.printType  // SUV
        }
    }
    
    動的メソッド派遣が重要なのは、クライアント-->サーバ依存のクライアントクラスの再利用性を向上させるためです.非クラスインタフェースを使用するため、再利用性を向上させることができ、これもList<Integer> list = new ArrayList<Integer>();のようにインタフェース参照変数を頻繁に使用する理由である.

    5.ダブル派遣


    6.抽象クラス


    1つ以上の抽象メソッドを持つクラス
    クラスの設計図
  • オブジェクトの設計図
  • クラスの設計図であるため、オブジェクト
  • を生成できない.
  • オブジェクトは作成できませんが、サブオブジェクトの作成時にオブジェクト化されるため、super()呼び出しジェネレータ
  • を使用できます.
  • 共有部分は抽象的な方法で記述され,サブクラスで実現すればよいので,関係がより明確である.

    6-1. 抽象クラスの用途

  • 分離
  • の設計と実施
    abstract class Calculator {
        public abstract int add(int a, int b);
        public abstract int subtract(int a, int b);
        public abstract double average(int[] a);
    }
    
    public class GoodCalc extends Calculator {
        @Override
        public int add(int a, int b) { 
            return a + b;
        }
        
        @Override
        public int subtract(int a, int b) { 
            return a - b;
        }
        
        @Override
        public double average(int[] a) { 
            double sum = 0;
            for (int i = 0; i <a.length; i++)
                sum += a[i];
            return sum/a.length;
        }
    }
    
    クラス構造実現
  • 階層継承関係
  • abstract class Animal {
        abstract void sound();
    }
    
    class Dog extends Animal {
        @Override
        void sound() {
            System.out.println("멍멍");
        }
    }
    
    class Cat extends Animal {
        @Override
        void sound() {
            System.out.println("야옹");
        }
    }
    

    7.finalキーワード

  • の端末要素を生成するためのキーワード
  • .

    7-1. finalクラス


    生成
  • 端末クラス
  • 州はセキュリティ上の理由で端末類
  • を必要とする.
    final class FinalClass {
       ...
    }
    
    class SubClass extends FinalClass {  // 컴파일 오류
       ...
    }

    7-2. 最終メソッド

  • 上書き不可能なエンドメソッド
  • を生成する.
    class SuperClass {
        final int finalMethod() {...}
    }
    
    class SubClass extends Superclass {
        @Override  // 컴파일 오류
        int finalMethod() {...}
    }

    7-3. finalフィールド

  • 賞の発表時に
  • を使用
  • 定数フィールドは宣言時に初期値を指定する必要があり、実行時に
  • を変更することはできません.
    class SharedClass {
        final double PI = 3.14;
    }

    8.対象クラス


    親以外の最上位レベル
  • すべてのクラス継承オブジェクトクラス
  • 共通のオブジェクトクラスが提供する共通の方法
  • を熟知している.

    8-1. toString

  • オブジェクトを印刷するときの出力内容を定義する方法
  • .
  • は、基本的にどのクラスのインスタンスを出力するか、何が一意の識別値
  • であるかを示す.
  • は、以下に示すように、
  • をよりよく使用するために少し変更することができる.
    class Dog {
        @Override
        public String toString() {
            return "Dog 객체" + '@' + Integer.toHexString(hashCode());
        }
    }

    8-2. clone

  • このオブジェクトをコピーし、新しいオブジェクト
  • を生成する.
  • をクローンするには、クローン可能なインタフェース
  • を実装する必要があります.

    8-3. equals


    オブジェクト値
  • を比較する方法
  • オブジェクトを==で比較するだけで、それらが同じオブジェクトであるか否かを判断することができるので、値を比較するためにequalsメソッドを使用する必要がある.
  • equals()を直接実装する場合、hashCode()も同時に実装する必要があります.
    class Student {
        String name;
        Student (String name) {
            this.name = name;
        }
        
        @Override
        public boolean equals(Object obj) {
            Student _obj = (Student)obj;
            return name == _obj.name;
        }
    }