オブジェクト向けの3つの特徴の継承

11761 ワード

一.コードブロック
1.意味
{}で囲まれたコード
2.分類
ローカルブロック
変数のライフサイクルを制限し、早期に解放し、メモリ使用率を向上
スタティツクコードブロック
クラスのデータを初期化し、一度だけ実行します.
コードブロックの構築
複数のコンストラクションメソッドの同じコードをここに置くことができ、各コンストラクションメソッドが実行される前に、コンストラクションコードブロックを先に実行します.
同期コードブロック
3.静的コードブロック、構築コードブロック、構築方法の実行順序
静的コードブロック->コードブロックの構築->構築方法
コードの例
/*
       : Java ,  {}            。
               ,    
             :    ,           。
             :        , {}      。           ,          。
              :                   ,        。
             :        , {}      ,     static   。
              :          。

       ?
             ,     ,         ?
              --       --     
             :     
             :           
*/
class Code {
    static {
        int a = 1000;
        System.out.println(a);
    }

    //     
    {
        int x = 100;
        System.out.println(x);
    }

    //    
    public Code(){
        System.out.println("code");
    }

    //    
    public Code(int a){
        System.out.println("code");
    }

    //     
    {
        int y = 200;
        System.out.println(y);
    }

    //     
    static {
        int b = 2000;
        System.out.println(b);
    }
}

class CodeDemo {
    public static void main(String[] args) {
        //     
        {
            int x = 10;
            System.out.println(x);
        }
        //     
        //System.out.println(x);
        {
            int y = 20;
            System.out.println(y);
        }
        System.out.println("---------------");

        Code c = new Code();    
        System.out.println("---------------");
        Code c2 = new Code();
        System.out.println("---------------");
        Code c3 = new Code(1);
    }
}

二.継承
1 .意味
複数のクラスの同じメンバーを抽出し、1つの独立したクラスに定義し、複数のクラスとその独立したクラスに関係を生じさせ、これらの複数のクラスにもこれらの内容を持たせる関係を継承と呼ぶ
2.フォーマット
Javaはキーワードextendsで表します
形式:classサブクラス名extends親クラス名{}
3.メリット
コードの多重化を向上
コードの保守性の向上
クラスとクラスを関係させることは,多態の前提である.
4.弊害
開発原則:高集約、低結合
集約:自分で何かを完成させる能力
結合けつごう:クラスとクラスの関係クラスとクラスの関係
(1).クラスの結合性を強化することで、このクラスが変化し、他の関連クラスに影響を与えます.
(2).パッケージ性を破る
5.特徴
(1).Javaは単一継承のみをサポートし、マルチ継承はサポートしません
いくつかの言語はマルチ継承をサポートしています.フォーマット:extendsクラス1、クラス2、...
(2).Javaは多層継承(継承システム)をサポート
6.注意事項
(1).子クラスは親クラスのプライベートメンバーを継承できません
(2).子クラスは親クラスの構築方法を統合できませんが、superでアクセスできます.
(3).一部の機能のために継承しないでください
7.使用タイミング
継承は実はis aの関係を体現している.
仮定法を採用する:2つのクラスAがあれば、B.AがBの1つであるか、BがAの1つであるかに合致すれば、継承を用いることが考えられる
8.継承中のメンバーの関係
(1).メンバー変数
子クラスのメンバー変数名は、親クラスのメンバー変数名と同様に、どのようにアクセスしますか?サブクラスのメソッドは変数の検索順序にアクセスしますか?
サブクラスメソッドのローカル範囲で探して、あれば使用します.
サブクラスのメンバー範囲で探して、あれば使います.
親クラスのメンバー範囲で探して、あれば使用します.
見つからないと、間違いを報告します.
(2).構築方法
子クラス内のすべてのコンストラクションメソッドは、親クラスの中空パラメータのコンストラクションメソッドにデフォルトでアクセスします.
子クラスは親のデータを継承するため、親のデータも使用する可能性があります.したがって、サブクラスを初期化する前に、必ず親データの初期化を完了します.
注:サブクラスの各構築メソッドの最初の文のデフォルトは、super()です.
親クラスにコンストラクションメソッドがない場合、子クラスのコンストラクションメソッドが間違っています.どのように解決しますか?
a.親に無パラメトリック構造を提供させる
b.サブクラスはsuperによって親クラスのパラメータ付き構造方法を明確に呼び出す
c.サブクラスはthisによって本クラスの他の構造方法を呼び出し、サブクラスには必ず親クラスにアクセスする構造方法が必要である.そうしないと、親データは初期化されない.
注意事項
this(...)またはsuper(...)は、最初の文に表示する必要があります.最初の文に置かないと、親のデータが複数回初期化される可能性があるので、最初の文に置かなければなりません.
(3).メンバーメソッド
子クラスのメンバーメソッド名は、親クラスのメンバーメソッド名と同様に、どのようにアクセスしますか?サブクラスオブジェクトの呼び出し方法の順序は?
まずサブクラスを探して、この方法があるかどうかを見て、あるなら使ってください.
親の中で、この方法があるかどうかを見て、あるなら使います.
なければ間違いを報告する.
9.thisとsuper
区別する
this:このクラスに対応する参照を表します
super:親ストレージスペースを表すID(親参照と理解でき、分類メンバーを操作できる)
使用方法
( 1). メンバー変数の呼び出し
this.メンバー変数このクラスのメンバー変数を呼び出す
super.メンバー変数親クラスのメンバー変数を呼び出す
(2). 構築メソッドの呼び出し
this(...)は、このクラスの構築方法を呼び出します.
super(...)呼び出し親クラスの構築方法
(3). メンバーメソッドの呼び出し
this.メンバーメソッドこのクラスのメンバーメソッドを呼び出す
super.メンバーメソッド親クラスのメンバーメソッドを呼び出す
10.OverrideとOverload
Overrideメソッド書き換え:
意味
子クラスでは、親クラスと同じメソッドで宣言される現象が発生します.
注意事項:子クラスが親メソッドを書き換える場合は、そっくりと宣言したほうがいいです.
a.親のプライベートメソッドは書き換えられません.親のプライベートメソッドの子は継承できません.
b.サブクラスが親メソッドを書き換える場合、アクセス権限をより低くすることはできません.一致したほうがいいです.
c.親クラスの静的メソッド、子クラスも静的メソッドで書き直さなければならない
Overloadメソッドの再ロード:
意味
同じクラスで、メソッド名が同じで、パラメータリストが異なる現象が発生します.
注意事項
パラメータリストには、パラメータ名、パラメータタイプ、パラメータ数が含まれます.
メソッドのリロードは、戻り値タイプとは無関係であるため、戻り値タイプを変更できます.
11.final
(1).意味
継承中のメソッドには、メソッドの書き換えという現象があるためです.だから、親の機能は、布団類をカバーして調整します.親の機能を子に上書きさせたくない場合があり、使用させるしかありません.この時、Javaはこのような状況に対してキーワードを提供しました:final
(2).使用法
クラス、メソッド、変数を修飾できます.
(3).特長
finalはクラスを修飾することができ、このクラスは継承できません.
finalはメソッドを修飾することができ、このメソッドは書き換えられない.(上書き、複写)
finalは変数を修飾することができ、この変数は再割り当てできません.この変数は実は定数だからです.
(4).面接関係
final修飾局所変数の問題
基本タイプ:基本タイプの値は変更できません.
参照タイプ:参照タイプのアドレス値は変更できませんが、オブジェクトのスタックメモリの値は変更できます.
final修飾変数の初期化タイミング
finalで修飾された変数は1回しか与えられません.
構築方法が完了する前に定義されたとき.(非静的定数)
12.データ初期化に関する面接問題
コード例(1)
/*
          :
        A:          
        B:this super   
            this       
            super       
        C:                       
        D:         
                     
                     
                     
                       

      :
        fu
        zi
        30
        20
        10
*/
class Fu{
    public int num = 10;
    public Fu(){
        System.out.println("fu");
    }
}
class Zi extends Fu{
    public int num = 20;
    public Zi(){
        System.out.println("zi");
    }
    public void show(){
        int num = 30;
        System.out.println(num); //30
        System.out.println(this.num); //20
        System.out.println(super.num); //10
    }
}
class ExtendsTest {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.show();
    }
}

コード例(2)
/*
          :
        A:         ,     ,         
                  >       >     
        B:               
                         
        C:                 

       :
             Fu
             Zi
             Fu
            Fu
             Zi
            Zi
*/
class Fu {
    static {
        System.out.println("     Fu");
    }

    {
        System.out.println("     Fu");
    }

    public Fu() {
        System.out.println("    Fu");
    }
}

class Zi extends Fu {
    static {
        System.out.println("     Zi");
    }

    {
        System.out.println("     Zi");
    }

    public Zi() {
        System.out.println("    Zi");
    }
}

class ExtendsTest2 {
    public static void main(String[] args) {
        Zi z = new Zi();
    }
}

コード例(3)
/*
          :
        A:       
            int x = 10; //         
            Student s = new Student(); //         
        B:         
                    
                     
                     
                       
        C:       (     )
                    ,         。

      :
        YXYZ

      :
                      super()
              ,           。
                    。
                      ,        。
*/
class X {
    Y b = new Y();
    X() {
        System.out.print("X");
    }
}

class Y {
    Y() {
        System.out.print("Y");
    }
}

public class Z extends X {
    Y y = new Y();
    Z() {
        //super
        System.out.print("Z");
    }
    public static void main(String[] args) {
        new Z(); 
    }
}