[Javaの定式]CHAPTER 7:オブジェクト向けプログラミングII

21629 ワード

1.継承


継承とは?

  • の既存のクラスを再使用して新しいクラスを作成します.
  • 受け継がれた長所?

  • は、より少ないコードで新しいクラスを記述することができる.
  • コードを共同で管理できます.
  • コードは、追加および変更が容易です.
  • コードの重複を減らします.重複するデータが多ければ多いほど、メンテナンスが難しくなり、一貫性を保つことが難しくなります.
  • なぜコードの重複性を最小限に抑えるのですか?
    プログラムにエラーが発生した原因の1つは,重複するコードに正しく変更された箇所があるかどうかである.
    Parentクラスにageという整数型変数をメンバー変数として追加すると、ChildクラスはParentクラスのすべてのメンバーを継承します.
  • ジェネレータおよび初期化ブロックは継承されません.メンバーのみを継承します.
  • サブクラスのメンバー数は、常に祖先クラス以上です.
  • 子孫階級の間にもアマレン関係は成立しなかった.
  • クラスを繰り返し使用する2つの方法:継承vsは

  • 継承関係
  • ~は~
  • is - a
  • 関係を含む
  • ~保有~銀.
  • has - a
  • public class DrewShape {
        public static void main(String[] args) {
            Point[] p = {
                    new Point(100, 100),
                    new Point(140, 50),
                    new Point(200, 100)
            };
    
            Triangle t = new Triangle(p);
            Circle c = new Circle(p[1], 50);
    
            t.draw();
            c.drew();
        }
    }
    
    class Shape{
        String color = "black";
    
        void draw() {
            System.out.printf("[color = %s]%n", color);
        }
    }
    
    class Point{
        int x;
        int y;
    
        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        Point() {
            this(0, 0);
        }
    
        String getXY() {
            return "(" + x + "," + y + ")";
        }
    }
    
    class Circle extends Shape { //상속
        Point center; // 포함
        int r;
    
        Circle() {
            this(new Point(0, 0), 100);
        }
    
        Circle(Point center, int r) {
            this.center = center;
            this.r = r;
        }
    
        void drew() {
            System.out.printf("[center = (%d, %d), r = %d, color = %s]%n", center.x, center.y, r, color);
        }
    }
    
    class Triangle extends Shape{
        Point[] p = new Point[3];
    
        Triangle(Point[] p) {
            this.p = p;
        }
    
        void draw() {
            System.out.printf("[p1 =  %s, p2 = %s, p3 = %s, color = %s]%n", p[0].getXY(), p[1].getXY(), p[2].getXY(), color);
        }
    }
    Javaは単一の継承のみを許可するのはなぜですか?
    2つの親が同じメソッドを持っている場合、子がどの親メソッドを継承すべきかという問題を解決します(静的メソッドの場合、メソッド名の前にクラス名を付けて区別できますが、インスタンスメソッドは使用できません).
    また,クラス間の関係がより明確になり,コードがより信頼できるという利点がある.

    2.大げさ


    オーバーライドとは?


    すなわち、
  • 祖先クラスから継承されたメソッドの内容を変更する.
  • 上書き条件


    サブクラスで上書きする方法は、祖先クラスの方法です.
  • の名前は同じでなければなりません.
  • パラメータは同じでなければなりません.
  • 返却タイプは同じでなければなりません.
  • JDK1.5から「公変半混和タイプ」を増やし、戻りタイプをサブクラスタイプに変更することで緩和できます.
  • 😎船業部は一致しなければならない.
    ただし、限られた条件でしか変更できません.
  • アクセス制御者は、その祖先クラスメソッドよりも狭い範囲に変更できません.
  • public > protected > defulat > private
  • 祖先レベルの方法よりも多くの例外を宣言することはできません.
  • インスタンスメソッドをメソッドに変更することはできません.逆も同様です.
  • 親クラスで定義した静的メソッドを、子クラスで同じ名前の静的メソッドとして定義できますか?
    かもしれません.しかし、これはクラスごとに個別の静的メソッドを定義しただけです.これは大げさではない.

    過負荷と過負荷

  • 過負荷
  • は、これまでにない新しい方法
  • を定義する.
  • 過負荷
  • 継承メソッドの内容を変更する
  • super

  • サブクラスの祖先クラスから継承されたメンバーを参照するための参照変数.
  • 継承メンバーと自分のメンバー名が同じ場合はsuperを付けて区別できます.
  • 静的方法は、インスタンスとは無関係であるため、静的方法では使用できない.
  • 変数だけでなく、メソッドはsuper呼び出しを使用することもできます.
  • super()-祖先クラスの作成者

  • オブジェクトクラスを除くすべてのクラスの作成者の最初の行の作成者.this()またはsuper()を呼び出す必要があります.そうでない場合、コンパイラは自動的に「super();」生成者の最初の行に挿入します.
  • public class PointTest2 {
        public static void main(String[] args) {
            Point3D p3 = new Point3D();
            System.out.println("p3.x = " + p3.x);
            System.out.println("p3.y = " + p3.y);
            System.out.println("p3.z = " + p3.z);
        }
    }
    
    class Point {
        int x = 10;
        int y = 20;
    
        Point(int x, int y) {
        //생성자 첫줄엥서 다른 생성자를 호출하지 않기 때문에 컴파일러가 'super();'를 여기에 삽입한다.
            this.x = x;
            this.y = y;
        }
    }
    
    class Point3D extends Point{
        int z = 30;
    
        Point3D() {
            this(100, 200, 300);
        }
    
        Point3D(int x, int y, int z) {
            super(x, y);
            this.z = z;
        }
    }
    以下に、上記のコードのジェネレータ呼び出し順序を示します.
    Point3D -> Point3D(int x, int y, int z) -> Point(int x, int y) -> Object()

    义齿


    セットメニューは何ですか。

  • レベルの組み合わせ.
  • と同じ名前のクラスでも、異なるパッケージに存在する可能性があります.
  • は、他の開発者が開発したクラスライブラリのクラス名と競合することを回避します.
  • クラス:クラスファイル、パッケージ:ディレクトリ
  • 静的インポート文

  • 静的メンバーを呼び出す場合は、クラス名を省略できます.
  • コードが簡潔になります.
  • System.out.println(Math.random())
    static import文が宣言された場合、
    import static java.lang.Integer.*;
    import static java.lang.Math.random;
    import static java.lang.System.out;
    
    out.println(random())