Chapter 10. 継承

41307 ワード

このコースは、KH情報学院が提供するコースの内容を個人的に学ぶために作成されています.
以下の内容を無料で配布または商業的に使用すると、法律で処罰されます.

継承(継承)


既存のクラス(親/スーパークラス)を再使用して、新しいクラス(子/子クラス)を作成します.既存の親のフィールドとメソッドを継承し、複数の子孫クラスの重複メンバーによって親クラスで合成管理することで、新しいクラスを作成できます.メンバーの重複性を低減し、さまざまな機能を少量のコードで処理できます.
メンバーの曖昧性を解消するために、Javaはクラス間で多重継承を許可しません.

継承の指定


Javaでクラス間の継承を指定する場合は、新しく作成したクラス名の後にextendsキーを使用し、extendsとともに継承するクラス名を記入します.
접근제한자 class 클래스이름 extends 부모클래스명 {
    // 멤버 정의
}
01 public class A {
02     private int num;
03     public void method1() { ... }
04 }
05 public class B extends A {
06     private String str;
07     public void method2() { ... }
08 }
extendsキーワードを使用して、AクラスとBクラスの継承関係を確立します.ここで、Bは子、Aは親となる.Bクラスはフィールドnumとメソッド1()を継承し,直接実現しなくても自分が持っているように使用できる.
しかし、親のプライベートメンバーは引き継ぐことはできるが、近づくことはできない.

親(スーパー)クラス


継承されたクラスをスーパークラスと呼びます.

サブクラス


継承されたクラスは、子孫/子/子/派生クラスと呼ばれます.

メソッドオーバーライド


メソッド再定義とは、子クラスで親から継承されるメソッドを再定義し、子孫クラスで親メソッドを再定義する場合、メソッドの上部に「@Override」構文を使用してメソッドを再定義することです.
test.inherit.TestOverrinding.java
01 package test.inherit;
02
03 public class TestOverring {
04     public static void main(String[] args) {
05         Parent p = new Parent();
06         p.display();
07         // p.out() // 부모객체는 자식객체의 멤버에 접근한 수 없다.
08
09        Child c = new Child();
10        c.out();
11        c.display();
12     }
13 }
------
부모 클래스 메소드
상속 받아 재정의한 메소드
자식 클래스 메소드
inherit.sample.Parent.java
01 package inherit.sample
02
03 public class Parent {
04     private int num;
05
06     void display() {
07         System.out.println("부모 클래스 메소드");
08     }
09 }
inherit.sample.Child.java
01 package inherit.sample;
02
03 public class Child extends Parent {
04     public void out() {
05         System.out.println("자식 클래스 메소드");
06     }
07     @Override
08     public void display() {
09         System.out.println("상속 받아 재정의한 메소드");
10     }
11 }

静的バインドと動的バインド


メソッドの呼び出しと実際の実装メソッドのコードとを関連付けることをバインディング(binding)と呼ぶ.バインディングには、静的バインディングと動的バインディングがあります.
静的バインドとは、オブジェクトのタイプがコンパイラによってコンパイル時に決定され、private、final、staticメソッドの両方が静的バインドであることを意味します.
動的バインドとは、オブジェクトのタイプが実行時に決定され、継承関係のオーバーライドメソッドによって動的にバインドされることです.オーバーライドメソッドを呼び出すコードがある場合、コンパイル時に構文上のタイプエラーのみをチェックし、実際のプログラム操作でReferenceによって参照されるオブジェクトのタイプを決定して、呼び出されたオーバーライドメソッドが親メソッドか子メソッドかを判断します.
バインド例(Parent.javaおよびChild.javaソースコードは前の例と同じ)
inherit.bind.TestBinding.java
01 package inherit.bind;
02
03 public class TestBinding {
04     public static void main(String[] args) {
05         Parent p = new Child();
06
07         p.display(); // 컴파일 시에는 정적 바인딩, 실행 시에는 동적 바인딩이 됨
08     }
09 }
------
상속 받아 재정의한 메소드
継承関係のクラスは、親クラスタイプの参照変数にサブクラスインスタンスのアドレスを記録できます.p reprenceによってdisplay()メソッドが呼び出されたときに静的バインドが行われる場合、p reprenceはParentクラスのdisplay()メソッドのみを呼び出すことができます.ただし、displayメソッドは上書きされるため、動的にバインドされ、p reprenceが参照するオブジェクトのタイプがChildクラスである場合、子孫の上書き表示()メソッドが実行されます.

スーパーリファレンスとスーパー()作成者


サブクラスで、親クラスの作成者またはメンバーにアクセスする場合は、スーパーキーを使用します.
super()親クラスを呼び出すジェネレータに使用できます.サブクラスでジェネレータを定義するときに使用すると、コードの再利用性が向上します.

  • super
  • 親を指定するメンバー

  • super()
  • を呼び出すジェネレータ.ただし、子孫生成者{}内の最初の行に使用する必要があります.
  • inherit.test.TestSuper.java
    01 package inherit.test;
    02
    03 public class TestSuper {
    04     public static void main(String[] args) {
    05         Child2 c = new Child2();
    06         c.out();
    07     }
    08 }
    ------
    부모 생성자
    자식 생성자
    부모 메소드
    자식 메소드
    inherit.sample.Parent2.java
    01 package inherit.sample;
    02
    03 public class Parent2 {
    04     public Parent2() {
    05         System.out.println("부모 기본 생성자");
    06     }
    07
    08     public void out() {
    09         System.out.println("부모 out() 메소드");
    10     }
    11 }
    inherit.sample.Child2.java
    01 package inherit.sample;
    02
    03 public class Child2 extends Parent2 {
    04     public Child2() {
    05         super(); // 부모 기본 생성자 호출
    06         System.out.println("자식 기본 생성자");
    07     }
    08
    09     @Override
    10     public void out() {
    11         super.out(); // 부모 메소드 out() 호출
    12         System.out.println("자식 Out() 메소드");
    13     }
    14 }

    最終定語


    領域変数、フィールド、メソッド、クラスに貼り付けることができ、異なる意味を持つ拡張できない保持語を表します.

    final変数


    変数に記録されている値の変更は許可されていません.すなわち,変数を定数化する.
    これを定量化すると、初期値も変更できないため、宣言と同時に初期化する必要があります.
    final 데이터타입 변수명 = 초기화값;
    test.keyword.TestFinalVariable.java
    01 package test.keyword
    02
    03 public class TestFinalVariable {
    04     public static void main(String[] args) {
    05         final int num = 10;
    06         num = 100; // 에러. 변경 불가
    07     }
    08 }

    最終メソッド


    継承された子孫クラスでは、親のメソッドは上書きできません.
    접근제한자 final 리턴타입 메소드이름 (자료형 메개변수) { ... }
    public class Parent {
         public final void out() {
             System.out.println("final 메소드");
         }
     }
     public class Child2 extends Parent2 { 
         @Override
         protected void out() { // 에러 발생
         }
     }

    finalクラス


    終了クラスと呼ばれ、継承に使用できないクラスを指定します.すなわち,これは親になれない子孫類を派生させることができないことを意味する.
    접근제한자 final class 클래스이름 { ... }
    public final class Parent {
        private int num;
    }
    public class Child extends Parent { // 에러 발생
        // ...
    }
    inherit.sample.Phone.java
    01 package inherit.sample;
    02
    03 public class Phone {
    04     private String model;
    05     private String number;
    06
    07     public Phone(){}
    08     public Phone(String model, String number) {
    09         this.model = model;
    10         this.number = number;
    11     }
    12
    13     public String getModel() {
    14         return model;
    15     }
    16     public String setModel(String model) {
    17         this.model = model;
    18     }
    19     public String getNumber() {
    20          return number;
    21     }
    22     public String setNumber(String number) {
    23         this.number = number;
    24     }
    25 }
    inherit.sample.IPhone.java
    01 package inherit.sample;
    02
    03 public class IPhone extends Phone {
    04     private int memorySize;
    05
    06     public IPhone() {}
    07     public IPhone(String model, String number, int memorySize) {
    08         super(model, number);
    09         this.memorySize = memorySize;
    10     }
    11
    12     public void setMemorySize(int memorySize) {
    13         this.memorySize = memorySize;
    14     }
    15     public int getMemorySize() { return memorySize; }
    16 }
    inhert.sample.GPhone.java
    01 package inherit.sample;
    02
    03 public class GPhone extends Phone {
    04     private String os = "Android";
    05
    06     public GPhone() {}
    07     public GPhone(String model, String number) {
    08         super(model, number);
    09     }
    10
    11     public String getOs() {
    12         return os;
    13     }
    14     public void setOs(String os) {
    15         this.os = os;
    16     }
    17 }
    test.inherit.PhoneMain.java
    01 package test.inhert;
    02
    03 import inherit.sample.*;
    04
    05 public class PhoneMain {
    06     public static void main(String[] args) {
    07         IPhone iPhone = new IPhone("7", "010-xxxx-xxxx", 32);
    08         GPhone gPhone = new GPhone("Vega", "010-yyyy-yyyy");
    09
    10         System.out.println(iPhone.getModel() + ", " + iPhone.getNumber()
    11             + ", " + iPhone.getMemorySize());
    12         System.out.println(gPhone.getModel() + ", " + gPhone.getNumber()
    13             + ", " + gPhone.getOs());
    14     }
    15 }
    ------
    7, 010-xxxx-xxxx, 32
    Vega, 010-yyyy-yyyy, Android