オブジェクト向け三大特性のまとめ

5383 ワード

一、パッケージ
パッケージはクラスに対する保護メカニズムであり、そのクラスの属性、方法、データが外部クラスに勝手にアクセスされることを防止する.したがって、カプセル化されたコンテンツは外部クラスに対して非表示であるべきであり、外部クラスがそれらにアクセスする必要がある場合は、そのクラスが提供する合法的な方法でアクセスする必要がある.これにより、クラス内のデータの制御可能な保護を実現し、内部の実装の詳細を隠すことができ、外部は要求通りに使用するだけで、内部の詳細にあまり関心を持つ必要はありません.
1.1メンバーのプライベート化
最も直感的で簡潔なパッケージの例は、クラス内のメンバー変数をprivateでカプセル化することです.例は次のとおりです.
public class Animal {
    private String name;
    //       getter  name   
    public String getName() {
        return name;
    }
    //       setter  name   
    public void setName(String name) {
        this.name = name;
    }
}

1.2 packageの使用
パッケージを使用すると、クラスをよりよく組織できます.通常、次のメリットもあります.
  • は、関連するクラスまたはインタフェースを機能またはモジュールに従って同じパッケージに整理することができ、検索と使用を容易にし、システムコードの論理を容易に区別することができる.
  • パケットはツリーディレクトリの格納方式を採用しており、同じパケットのクラス名は必ず異なり、異なるパケットのクラス名は同じでもよく、同じクラス名を使用する必要がある場合はクラス名の前にパケット名を付けてどのクラスを使用するかを指定することができる.
  • パケットの存在は、同じパケット内のクラスのみが互いのdefaultタイプのメンバーにアクセスできるアクセス権を有する.

  • 1.3アクセス修飾子の使用
    アクセス修飾子
    このクラス
    同包
    サブクラス
    その他
    private
    Y
    N
    N
    N
    default
    Y
    Y
    N
    N
    protected
    Y
    Y
    Y
    N
    public
    Y
    Y
    Y
    Y
    protectedについて重点的に説明する必要があるが、ここでのサブクラスアクセス可能とは、サブクラスの内部にアクセス可能であり、mainメソッドは内部ではなく、非サブクラスでは親または子の参照があっても親のprotectedコンテンツにアクセスできないことを意味する.例:
    package cn.zx.test;
    
    public class Animal {   
        private String name;
        String age;
        protected String legs;
        public String color;
    }
    
    package cn.zx.tset;
    
    import cn.zx.test.Animal;
    
    public class Dog extends Animal {
        public Dog(){
            //      legs
            System.out.println(super.legs);
            System.out.println(this.legs);
        }
        public static void main(String[] args) {
            Animal a = new Dog();
            //          ,   legs
            System.out.println(a.legs);
        }
    }
    
    package cn.zx.tset;
    
    import cn.zx.test.Animal;
    
    public class Test {
        public static void main(String[] args) {
            Animal a = new Dog();
            //          ,   legs
            System.out.println(a.legs);
        }
    }
    

    1.4 thisキーワードの使用
    現在のオブジェクトをthisで指定すると、現在のオブジェクトの内部でthisによってオブジェクトのプロパティにアクセスし、データを取得してメソッドを呼び出すことができます.
    例えばsetterやgetterのthisの使用です.
    1.5内部クラスの使用
    内部クラスもオブジェクト向けのパッケージの特性をよく実現していますが、内部クラスが重要であるため、単独で文章を書いています.
    二、継承
    2.1継承の定義
    継承は、クラスとクラスの間の共通から細分化、抽象から特定の関連関係を記述します.子と親はis-aの関係、例えばdog is a mammaljack is a humanなどであり、継承は物理世界における真の親と子の関係をより容易に記述することができるほか、複数の子の共通の部分を抽出して親を形成することができ、コード安定部分のパッケージを実現し、コードの多重性を大幅に向上させることができる.
    通常、継承は使用中に以下の点に注意する必要があります.
  • サブクラスは、親クラスのprivate以外のすべての属性とメソッドをデフォルトで所有します.
  • サブクラスは、独自のプロパティとメソッドを追加できます.
  • サブクラスは、親のメソッドを書き換えることができます.
  • クラスは1つの親しか継承できません.

  • 2.2親メソッドの書き換え
    子クラスが親から受け継いだメソッドに不満がある場合は、自分に合った操作を加えたい場合は、メソッドを書き換えることができます.また,サブクラスは呼び出しメソッドにおいて,サブクラス独自のメソッドを優先的に呼び出す.
    もちろん、メソッドの書き換えでは、書き換え方法は、戻り値タイプ、パラメータタイプ、個数、メソッド名など、元の親のメソッド構文と一致しなければならないことに注意してください.
    2.3親と子のロード順序
    継承された初期化順序は、親を初期化してから子を初期化します.
    サブクラスで親のプロパティにアクセスしたり、親のメソッドと親の構築メソッドを呼び出したりする必要がある場合はsuperを使用します.
    2.4 finalによる継承防止
    finalの使い方は非常に多いです.
  • クラスを修飾すると、そのクラスが継承されないことを示す.
  • その修飾方法の場合、その方法は書き換えられないことを示す.
  • クラス属性を修飾する場合、クラス属性はデフォルトで初期化されず、手動で値を割り当てる必要があります.
  • 変数を修飾すると、その変数は1回しか与えられず、定数であることを示す.

  • 三、多態
    マルチステートはダイナミックバインドとも呼ばれ、実行中に参照されるオブジェクトの実際のタイプを判断し、実際のタイプに基づいて対応するメソッドを呼び出すことを意味します.一般的には、親のみで異なるサブクラスを参照できます.これはマルチステートであり、実行時にのみ参照変数が指す特定のインスタンスオブジェクトを知ることができます.
    3.1アップシフトAnimal a = new Dog()これは向上転換であり、向上転換を使用するには、以下の注意点があります.
  • 親クラスの参照を使用して、実際にはサブクラスのオブジェクトを指すことができますが、逆にすることはできません.
  • アップコンバートを使用して、親クラスのすべての属性とメソッド、およびサブクラス拡張の属性を参照によって取得できます.しかし、サブクラス拡張のメソッドは取得できません.
  • 子クラスが親クラスを書き換えたメソッドの場合、この参照は子クラスで書き換えたメソッドを優先的に呼び出す.

  • 具体的に例を見てみましょう.
    public class Animal {
        private String name = "plutor";
        public void bark(){
            System.out.println("I am " + name);
        }
    }
    
    public class Dog extends Animal {
        private String age = "4";
        @Override
        public void bark() {
            super.bark();
            System.out.println("my age is " + age);
        }
        public void sleep(){
            System.out.println("sleep");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Animal a = new Dog();
            //             
            a.bark();
            //             ,         
            a.sleep();
        }
    }
    

    3.2抽象クラスとインタフェース
    抽象クラスはいつ使用しますか?
  • 場合によっては、ある親は、その子がどのような方法を含むべきかを知っているだけで、これらの子がどのようにこれらの方法を実現するかを正確に知ることはできません.すなわち,抽象クラスは,メソッドがどのように実装されるかにかかわらず,サブクラスがどのような方法を実装しなければならないかを制約する.
  • は、同じ特徴を有する複数のクラスから1つの抽象クラスを抽象化し、この抽象クラスをサブクラスのテンプレートとし、サブクラス設計の随意性を回避する.

  • 抽象クラスのルール
  • abstract修飾子を使用して抽象クラスを定義します.
  • abstract修飾子で抽象メソッドを定義し、宣言のみで実現する必要はありません.
  • 抽象メソッドを含むクラスが抽象クラスである.
  • 抽象クラスには、通常のメソッドが含まれていてもよいし、抽象メソッドがなくてもよい.
  • 抽象クラスのオブジェクトは直接作成できません.通常、参照変数がサブクラスオブジェクトを指すことを定義します.

  • インタフェースは抽象クラスよりもさらに進み,実装されたメソッド体は全く含まれていない.
  • インタフェースは、オブジェクトをインスタンス化するために使用できません.
  • インタフェース内のすべての方法は抽象的な方法である.
  • インタフェースのメンバー変数はstatic finalタイプのみです.
  • インタフェースは、public interface A extends B,C{}などのマルチ継承をサポートします.