logo

Java での継承

Java の継承は OOP (オブジェクト指向プログラミング) の重要な柱です。これは、あるクラスが別のクラスの機能 (フィールドとメソッド) を継承できるようにする Java のメカニズムです。 Java では、継承とは、既存のクラスに基づいて新しいクラスを作成することを意味します。別のクラスを継承したクラスは、そのクラスのメソッドとフィールドを再利用できます。さらに、現在のクラスに新しいフィールドやメソッドを追加することもできます。

文字列.format Java

なぜ Java の継承が必要なのでしょうか?

  • コードの再利用性: スーパークラスに記述されたコードは、すべてのサブクラスに共通です。子クラスは親クラスのコードを直接使用できます。
  • メソッドのオーバーライド: メソッドのオーバーライド 継承によってのみ達成可能です。これは、Java が実行時ポリモーフィズムを実現する方法の 1 つです。
  • 抽象化: すべての詳細を提供する必要がない抽象の概念は、継承によって実現されます。 抽象化 ユーザーに機能のみを示します。

Java 継承で使用される重要な用語

  • クラス: クラスは、共通の特性/動作および共通のプロパティ/属性を共有するオブジェクトのセットです。クラスは現実世界の実体ではありません。これは、オブジェクトの作成元となる単なるテンプレート、青写真、またはプロトタイプにすぎません。
  • スーパークラス/親クラス: 機能が継承されたクラスはスーパークラス(または基底クラスや親クラス)と呼ばれます。
  • サブクラス/子クラス: 他のクラスを継承するクラスは、サブクラス (または派生クラス、拡張クラス、子クラス) と呼ばれます。サブクラスは、スーパークラスのフィールドとメソッドに加えて、独自のフィールドとメソッドを追加できます。
  • 再利用性: 継承は再利用性の概念をサポートしています。つまり、新しいクラスを作成するときに、必要なコードの一部を含むクラスがすでに存在する場合、既存のクラスから新しいクラスを派生できます。こうすることで、既存のクラスのフィールドとメソッドを再利用します。

Java で継承を使用するには?

キーワードを拡張します Java では継承に使用されます。 extends キーワードを使用すると、既存のクラスから派生したことを示します。言い換えれば、拡張とは機能の増加を指します。



構文:

class DerivedClass extends BaseClass  {   //methods and fields  }>

Java での継承の例

例: 以下の継承の例では、クラス Bicycle は基本クラス、クラス MountainBike は Bicycle クラスを拡張する派生クラス、クラス Test はプログラムを実行するためのドライバー クラスです。

ジャワ
// Java program to illustrate the // concept of inheritance // base class class Bicycle {  // the Bicycle class has two fields  public int gear;  public int speed;  // the Bicycle class has one constructor  public Bicycle(int gear, int speed)  {  this.gear = gear;  this.speed = speed;  }  // the Bicycle class has three methods  public void applyBrake(int decrement)  {  speed -= decrement;  }  public void speedUp(int increment)  {  speed += increment;  }  // toString() method to print info of Bicycle  public String toString()  {  return ('No of gears are ' + gear + '
'  + 'speed of bicycle is ' + speed);  } } // derived class class MountainBike extends Bicycle {  // the MountainBike subclass adds one more field  public int seatHeight;  // the MountainBike subclass has one constructor  public MountainBike(int gear, int speed,  int startHeight)  {  // invoking base-class(Bicycle) constructor  super(gear, speed);  seatHeight = startHeight;  }  // the MountainBike subclass adds one more method  public void setHeight(int newValue)  {  seatHeight = newValue;  }  // overriding toString() method  // of Bicycle to print more info  @Override public String toString()  {  return (super.toString() + '
seat height is '  + seatHeight);  } } // driver class public class Test {  public static void main(String args[])  {  MountainBike mb = new MountainBike(3, 100, 25);  System.out.println(mb.toString());  } }>

出力
No of gears are 3 speed of bicycle is 100 seat height is 25>

上記のプログラムでは、MountainBike クラスのオブジェクトが作成されると、スーパークラスのすべてのメソッドとフィールドのコピーがこのオブジェクト内のメモリを獲得します。そのため、サブクラスのオブジェクトを使用すると、スーパークラスのメンバーにもアクセスできます。



継承中はサブクラスのオブジェクトのみが作成され、スーパークラスは作成されないことに注意してください。詳細については、を参照してください。 継承クラスのJavaオブジェクト作成

例 2: 以下の継承の例では、クラス Employee は基本クラス、クラス Engineer は Employee クラスを拡張した派生クラス、クラス Test はプログラムを実行するためのドライバー クラスです。

ジャワ
// Java Program to illustrate Inheritance (concise) import java.io.*; // Base or Super Class class Employee {  int salary = 60000; } // Inherited or Sub Class class Engineer extends Employee {  int benefits = 10000; } // Driver Class class Gfg {  public static void main(String args[])  {  Engineer E1 = new Engineer();  System.out.println('Salary : ' + E1.salary  + '
Benefits : ' + E1.benefits);  } }>

出力
Salary : 60000 Benefits : 10000>

プログラムのイメージ:



Java での継承

実際には、継承と 多態性 これらは Java で一緒に使用され、コードの高速なパフォーマンスと読みやすさを実現します。

Javaの継承タイプ

以下に、Java でサポートされているさまざまなタイプの継承を示します。

  1. 単一の継承
  2. 多レベルの継承
  3. 階層的な継承
  4. 多重継承
  5. ハイブリッド継承

1. 単一継承

単一継承では、サブクラスは 1 つのスーパークラスのみから派生します。これは、単一親クラスのプロパティと動作を継承します。単純継承とも呼ばれる場合があります。以下の図では、「A」が親クラス、「B」が子クラスです。クラス「B」はクラス「A」のすべてのプロパティを継承します。

単一継承

単一継承

ジャワ
// Java program to illustrate the // concept of single inheritance import java.io.*; import java.lang.*; import java.util.*; // Parent class class One {  public void print_geek()  {  System.out.println('Geeks');  } } class Two extends One {  public void print_for() { System.out.println('for'); } } // Driver class public class Main {  // Main function  public static void main(String[] args)  {  Two g = new Two();  g.print_geek();  g.print_for();  g.print_geek();  } }>

出力
Geeks for Geeks>

2. 多レベルの継承

多レベル継承では、派生クラスは基本クラスを継承し、派生クラスは他のクラスの基本クラスとしても機能します。以下の図では、クラス A は派生クラス B の基本クラスとして機能し、派生クラス B は派生クラス C の基本クラスとして機能します。 Java では、クラスはクラスに直接アクセスできません。 祖父母のメンバー

多レベルの継承

多レベルの継承

文字列を整数に変換
ジャワ
// Importing required libraries import java.io.*; import java.lang.*; import java.util.*; // Parent class One class One {  // Method to print 'Geeks'  public void print_geek() {  System.out.println('Geeks');  } } // Child class Two inherits from class One class Two extends One {  // Method to print 'for'  public void print_for() {  System.out.println('for');  } } // Child class Three inherits from class Two class Three extends Two {  // Method to print 'Geeks'  public void print_lastgeek() {  System.out.println('Geeks');  } } // Driver class public class Main {  public static void main(String[] args) {  // Creating an object of class Three  Three g = new Three();    // Calling method from class One  g.print_geek();    // Calling method from class Two  g.print_for();    // Calling method from class Three  g.print_lastgeek();  } }>

出力
Geeks for Geeks>

3. 階層的な継承

階層継承では、1 つのクラスが複数のサブクラスのスーパークラス (基本クラス) として機能します。以下の図では、クラス A は、派生クラス B、C、および D の基本クラスとして機能します。

Java の階層継承

ジャワ
// Java program to illustrate the // concept of Hierarchical inheritance class A {  public void print_A() { System.out.println('Class A'); } } class B extends A {  public void print_B() { System.out.println('Class B'); } } class C extends A {  public void print_C() { System.out.println('Class C'); } } class D extends A {  public void print_D() { System.out.println('Class D'); } } // Driver Class public class Test {  public static void main(String[] args)  {  B obj_B = new B();  obj_B.print_A();  obj_B.print_B();  C obj_C = new C();  obj_C.print_A();  obj_C.print_C();  D obj_D = new D();  obj_D.print_A();  obj_D.print_D();  } }>

出力
Class A Class B Class A Class C Class A Class D>

4. 多重継承 ( インターフェイス経由)

多重継承 、1 つのクラスが複数のスーパークラスを持つことができ、すべての親クラスから機能を継承できます。 Java では次のことが行われることに注意してください。 ない サポート 多重継承 クラス付き。 Java では、次の方法でのみ多重継承を実現できます。 インターフェース 。以下の図では、クラス C はインターフェイス A と B から派生しています。

多重継承

多重継承

ジャワ
// Java program to illustrate the // concept of Multiple inheritance import java.io.*; import java.lang.*; import java.util.*; interface One {  public void print_geek(); } interface Two {  public void print_for(); } interface Three extends One, Two {  public void print_geek(); } class Child implements Three {  @Override public void print_geek()  {  System.out.println('Geeks');  }  public void print_for() { System.out.println('for'); } } // Drived class public class Main {  public static void main(String[] args)  {  Child c = new Child();  c.print_geek();  c.print_for();  c.print_geek();  } }>

出力
Geeks for Geeks>

5. ハイブリッド継承

これは、上記のタイプの継承を 2 つ以上組み合わせたものです。 Java はクラスでの多重継承をサポートしていないため、クラスでは多重継承を伴うハイブリッド継承もできません。 Java では、次の方法でのみハイブリッド継承を実現できます。 インターフェース ハイブリッド継承を実装するために複数の継承を含める場合。
ただし、ハイブリッド継承では必ずしも複数継承のみを使用する必要があるわけではないことに注意することが重要です。これは、クラスを使用した多レベル継承と階層継承、クラスを使用した階層継承と単一継承の組み合わせによって実現できます。したがって、多重継承タイプに依存せずに、クラスのみを使用してハイブリッド継承を実装することは確かに可能です。

ハイブリッド継承

ハイブリッド継承

Java IS-A タイプの関係

IS-A は、「このオブジェクトはそのオブジェクトのタイプである」と表現する方法です。 extends キーワードを使用して継承を実現する方法を見てみましょう。

ジャワ
public class SolarSystem { } public class Earth extends SolarSystem { } public class Mars extends SolarSystem { } public class Moon extends Earth { }>

さて、上記の例に基づいて、オブジェクト指向の用語では次のことが当てはまります:-

  • SolarSystem は Earth クラスのスーパークラスです。
  • SolarSystem は Mars クラスのスーパークラスです。
  • Earth と Mars は SolarSystem クラスのサブクラスです。
  • Moon は、Earth クラスと SolarSystem クラスの両方のサブクラスです。
ジャワ
class SolarSystem { } class Earth extends SolarSystem { } class Mars extends SolarSystem { } public class Moon extends Earth {  public static void main(String args[])  {  SolarSystem s = new SolarSystem();  Earth e = new Earth();  Mars m = new Mars();  System.out.println(s instanceof SolarSystem);  System.out.println(e instanceof Earth);  System.out.println(m instanceof SolarSystem);  } }>

出力
true true true>

サブクラスでは何ができるのでしょうか?

サブクラスでは、メンバーをそのまま継承したり、置換したり、非表示にしたり、新しいメンバーで補ったりすることができます。

  • 継承されたフィールドは、他のフィールドと同様に直接使用できます。
  • スーパークラスにない新しいフィールドをサブクラスで宣言できます。
  • 継承したメソッドはそのまま利用できます。
  • 新しいものを書くことができます 実例 スーパークラスのメソッドと同じシグネチャを持つサブクラスのメソッド。 オーバーライド それ (上記の例のように、 toString() メソッドはオーバーライドされます)。
  • 新しいものを書くことができます 静的 スーパークラスのメソッドと同じシグネチャを持つサブクラスのメソッド。 隠蔽 それ。
  • スーパークラスにない新しいメソッドをサブクラスで宣言できます。
  • 暗黙的に、またはキーワードを使用して、スーパークラスのコンストラクターを呼び出すサブクラス コンストラクターを作成できます。 素晴らしい

Java における継承の利点:

  1. コードの再利用性: 継承によりコードの再利用が可能になり、記述する必要のあるコードの量が削減されます。サブクラスはスーパークラスのプロパティとメソッドを再利用できるため、コードの重複が減ります。
  2. 抽象化: 継承により、関連するクラスのグループに共通のインターフェイスを定義する抽象クラスの作成が可能になります。これにより、抽象化とカプセル化が促進され、コードの保守と拡張が容易になります。
  3. クラス階層: 継承により、現実世界のオブジェクトとその関係をモデル化するために使用できるクラス階層を作成できます。
  4. ポリモーフィズム: 継承により、オブジェクトが複数の形式を取る能力であるポリモーフィズムが可能になります。サブクラスはスーパークラスのメソッドをオーバーライドできるため、サブクラスの動作をさまざまな方法で変更できます。

Java における継承の欠点:

  1. 複雑さ: 継承によりコードがより複雑になり、理解しにくくなる可能性があります。これは、継承階層が深い場合、または複数の継承が使用されている場合に特に当てはまります。
  2. 密結合: 継承によりスーパークラスとサブクラスの間に密結合が作成されるため、サブクラスに影響を与えずにスーパークラスを変更することが困難になります。

結論

この記事の重要な点を以下に示しますので確認してみましょう。

  • デフォルトのスーパークラス : を除外する 物体 スーパークラスを持たないクラスでは、すべてのクラスが直接スーパークラスを 1 つだけ持ちます (単一継承)。他に明示的なスーパークラスが存在しない場合、すべてのクラスは暗黙的に Object クラスのサブクラスになります。
  • スーパークラスは 1 つだけです: スーパークラスは任意の数のサブクラスを持つことができます。ただし、サブクラスに含めることができるのは 1つ スーパークラス。これは、Java がクラスの多重継承をサポートしていないためです。インターフェースでは、Java では多重継承がサポートされています。
  • コンストラクターの継承: サブクラスは、そのスーパークラスからすべてのメンバー (フィールド、メソッド、およびネストされたクラス) を継承します。コンストラクターはメンバーではないため、サブクラスには継承されませんが、スーパークラスのコンストラクターはサブクラスから呼び出すことができます。
  • プライベートメンバーの継承: サブクラスは、親クラスのプライベート メンバーを継承しません。ただし、スーパークラスにそのプライベート フィールドにアクセスするためのパブリック メソッドまたは保護されたメソッド (ゲッターやセッターなど) がある場合、これらはサブクラスでも使用できます。

相続に関するよくある質問

1. Javaの継承とは何ですか?

継承は、あるクラスが親クラスのメソッドとフィールドを再利用できる別のクラスから継承する OOP の概念です。

2. Java の 4 種類の継承とは何ですか?

単一、複数、マルチレベル、階層、ハイブリッドがあります

3. extend キーワードの用途は何ですか?

Extend キーワードは、あるクラスを別のクラスに継承するために使用されます。

ボーン・アゲイン シェル

4. Java における継承の例は何ですか?

Java における継承の実例を以下に示します。

車両のグループを考えてみましょう。 Bus、Car、Truck のクラスを作成する必要があります。メソッドfuelAmount()、capacity()、applyBrakes()は、3つのクラスすべてで同じになります。

使用した参考文献:

  1. Head First Java by Kathy Sierra と Bert Bates
  2. Java: 初心者向けガイド (Herbert Schildt 著)
  3. Java: The Complete Reference by Herbert Schildt
  4. 『Effective Java』Joshua Bloch著
  5. Java: The Good Parts by Jim Waldo