[白奇仙ジャワ学習]6週間-継承


1.Java継承の特徴


継承とは、親クラスで定義されたフィールドとメソッドを継承し、子クラスでも使用できるようにすることです.
親は親(スーパークラス、Superクラス)またはベース(ベースクラス、Baseクラス)と呼ばれ、継承された子は子(サブクラス、Subクラス)または派生クラス(誘導閉パッケージ、派生クラス)と呼ばれます.

1.1特性

  • は重傷を支持していない.すなわち、extendsの後ろには親が1つしかいません.
  • 親の創設者は継承されません.
  • サブクラスは、親が持つメンバー変数とメソッドを継承します.
  • 親クラスでは、メンバー変数またはメソッドがプライベートアクセス制限を使用する場合、メンバー変数は継承されますが、すぐにアクセスできません.メソッドは継承されません.
  • 静的メソッドまたは変数も継承されます.
  • 同じ名前の変数が親と子に同時に存在する場合、親の変数は非表示になります.
  • の継承回数に制限はありません.
  • トップクラスは「オブジェクト」クラスであり、オブジェクトクラスのみがスーパークラス(親)を持つことはできません.つまり,すべてのクラスがObjectクラスのサブクラスである.
  • まず
  • 親クラスのインスタンスを作成し、次に子クラスのインスタンス
  • を作成します.

    1.2使用理由


    Java言語から継承されるのは、既存のクラスのメソッドとフィールドを再利用できるためです.
    つまり、新しいクラスを作成し、実装したいコードが他のクラスにすでに存在している場合は、再記述することなく、クラス継承によって作成したコードを再利用できます.

    2.スーパーキー


    スーパーキーを使用すると、サブクラスはスーパークラスにアクセスできます.superはスーパークラスの参照変数と見なすことができる.

  • 親のデフォルトの作成者を呼び出す役割(子作成者の最初の行にある必要があります)

  • サブオブジェクトを作成する場合、Javaはまず親オブジェクトを作成し、次にサブオブジェクトの構造を作成します.
  • ex)
    public class CellPhone { . . . }
    public class IPhone extends CellPhone { . . . }
    IPhone iPhone = new IPhone();
  • CellPhoneを継承するサブクラスIPHONE
  • IPHONEを作成すると、内部メモリ構造から親
  • が作成されていることがわかります.
  • サブアイテムジェネレータの最初の行のサブクラスの作成者が明示的に宣言されていない場合、コンパイラは次のデフォルトの作成者
  • を自動的に作成します.
    public IPhone() {
      super();
    }

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


    これは、superClassが持つメソッドをサブクラスから新しい異なる論理として定義する場合に使用する構文です.
    継承関係のクラス間で同じ名前のメソッドを定義する構文を上書きと呼びます.

    3.1特性

  • overlightingarnovationは省略できます.
  • メソッドの名前は同じでなければなりません.
  • メソッドのパラメータは同じでなければなりません.
  • メソッドの戻りタイプは同じでなければなりません.
  • JDK1.5から、親の戻りタイプを子に変換できます.
  • アクセス制御者は、親メソッドよりも小さい範囲に変更できません.
  • より多い親メソッドの例外は宣言できません.
  • インスタンスメソッドと静的メソッドは互いに変更できません.
  • @overrideでは、overridingが正しく再定義されているかどうかを確認できます.
  • インタフェースにもdefaultメソッドがあり、クラスを上書きできます.
  • 4.動的方法の派遣


    dispatchは、どのメソッドを呼び出すかを決定することによってそのプロセスを実行する.
    すなわち、実行可能な方法が複数ある場合、受信したメッセージに基づいてどの方法を実行するかを決定することを意味する.
  • 静的派遣
  • コンパイル時に実行するメソッド
  • ダイナミックディスパッチ
  • メソッドのオーバーライド率の場合、実行時に実行するメソッドを決定します:
  • 4.1静的方法の派遣

    public class App {
        
        public static void main(String[] args) {
            AppService appService = new AppService();
            appService.run();
            appService.run(2);
        }
    }
    
    class AppService {
        
        void run() {
            System.out.println("run 호출");
        }
        void run(int num) {
            System.out.println("run" + num + "번 호출");
        }
    }
    
    これは静的時間(static)でどのメソッドを呼び出すかを決定するプロセスである.(コンパイル時)
    メソッドを上書きまたは上書きする場合も、コンパイル時に決定されます.

    4.2動的アプローチの派遣

    public class App {
        public static void main(String[] args) {
            AppService appService = new subAppService();
            appService.run();
            AppService appService2 = new subAppService2();
            appService2.run();
        }
    }
    
    abstract class AppService {
        abstract void run();
    }
    
    class subAppService extends AppService {
        @Override void run() {
            System.out.println("sub1");
        }
    }
    
    class subAppService2 extends AppService {
        @Override void run() {
            System.out.println("sub2");
        }
    }

  • ダイナミックタイミング(Dynamic)で呼び出す必要があるメソッドのプロシージャ.

  • すなわち,実行時にどのメソッドを呼び出すかを決定するプロセスである.

  • インタフェースまたは抽象クラスを宣言し、インタフェースを実装し、抽象クラスを継承するサブクラス.

  • インスタンスとして作成時に発生します.
  • 4.3ダブルパッチ-トビーの春のテレビ整理


  • instance ofは使用しません.

  • ダイナミックディスパッチを2回行う方法です.
  • PostOnメソッドの動的割り当て1号
  • sns.post(this)対snsの動的dispatchは2番
  • です

  • パラメータはダイナミックディスパッチの条件ではありません.

  • Javaは単一のDispatch言語です.(受信機1個)
  •     
        interface Post{
            void postOn(SNS sns);
        }
    
        static class Text implements Post{
            
            public void postOn(SNS sns){
                sns.post(this);
            }
        }
    
        static class Picture implements Post{
            
            public void postOn(SNS sns){
                sns.post(this);
            }
        }
    
        interface SNS{
            
            void post(Text post);
            
            void post(Picture post);
        }
    
        static class Facebook implements SNS{
    
            public void post(Text post){
                System.out.println("text -> facebook");
            }
    
            public void post(Picture post){
                System.out.println("picture -> facebook");
            }
        }
    
        static class Twitter implements SNS{
            
            public void post(Text post){
                System.out.println("text -> twitter");
            }
    
            public void post(Picture post){
                System.out.println("picture -> twitter");
            }
        }
    
        static class GooglePlus implements SNS{
            
            public void post(Text post){
                System.out.println("text -> gplus");
            }
            
            public void post(Picture post){
                System.out.println("picture -> gplus");
            }
        }
    
        public static void main(String[] args){
            List<Post> posts = Arrays.asList(new Text(), new Picture());
            List<SNS> sns = Arrays.asList(new Facebook(), new Twitter(), new GooglePlus());
            posts.forEach(p->sns.forEach(s.postOn(s))); }
    }

    5.抽象クラス


    6.finalキーワード


    7.対象クラス


    リファレンス
  • [Java]継承
  • オンラインjava学習#6-継承java(メソッド上書き、抽象クラス、ダイナミックメソッド派遣)
  • 第6週タスク
  • 第6週チャレンジ:継承
  • Java継承
  • 第6週チャレンジ:継承
  • 第6週チャレンジ:継承
  • 第6週