Javaでの継承の説明

継承

Java継承とは、inherit他のクラスのプロパティに対するJavaクラスの機能を指します。親からプロパティを継承する子のように考えてください。概念はそれに非常に似ています。Java用語では、クラスの拡張とも呼ばれます。

覚えておくべきいくつかの簡単なこと:

  • 拡張または継承するクラスはサブクラスと呼ばれます
  • 拡張または継承されているクラススーパークラスと呼ばれます

したがって、継承により、Javaはコードを再利用したり、クラス間でコードを共有したりすることができます。

Vehicleクラスとクラスの古典的な例でそれを説明しましょうCar

public class Vehicle { public void start() { // starting the engine } public void stop() { // stopping the engine } } public class Car extends Vehicle { int numberOfSeats = 4; public int getNumberOfSeats() { return numberOfSeats; } }

ここでは、Carクラスのプロパティを継承しているクラスを確認できますVehicle。そこで、我々は方法のために同じコードを記述する必要はありませんstart()し、stop()ためにCarこれらのプロパティがその親またはスーパークラスから利用されているとして、同様。したがって、Carクラスから作成されたオブジェクトにこれらのプロパティがあります。

Car tesla = new Car(); tesla.start(); tesla.stop();

実行コード

しかし、親クラスには子のメソッドがありますか?いいえ、そうではありません。

したがって、複数のクラス間で共通のコードを共有する必要がある場合は常に、親クラスを用意し、必要に応じてそのクラスを拡張することをお勧めします。コードの行数を減らし、コードをモジュール化して、テストを簡素化します。

何を継承できますか?

  • 親からのすべてprotectedpublicフィールドとメソッド

継承できないものは何ですか?

  • private フィールドとメソッド
  • コンストラクター。ただし、サブクラスコンストラクター、定義されている場合はスーパークラスコンストラクターを呼び出す必要があります(これについては後で詳しく説明します)。
  • 複数のクラス。Javaは単一の継承のみをサポートします。つまり、一度に1つのクラスのみを継承できます。
  • 田畑。クラスの個々のフィールドは、サブクラスによってオーバーライドできません。

型キャストとリファレンス

Javaでは、サブクラスをそのスーパークラスのインスタンスとして参照することができます。これは、オブジェクト指向プログラミング(OOP)のポリモーフィズムと呼ばれ、オブジェクトがさまざまな形をとる機能です。たとえば、Carクラスオブジェクトは次のVehicleようなクラスインスタンスとして参照できます。

Vehicle car = new Car();

ただし、その逆は不可能です。

Car car = new Vehicle(); // ERROR

実行コード

Javaサブクラスをスーパークラスインスタンスとして参照できるため、サブクラスオブジェクトのインスタンスをスーパークラスインスタンスに簡単にキャストできます。スーパークラスオブジェクトをサブクラスタイプにキャストすることは可能ですが、オブジェクトが実際にサブクラスのインスタンスである場合に限ります。したがって、これを覚えておいてください:

Car car = new Car(); Vehicle vehicle = car; // upcasting Car car2 = (Car)vechile; //downcasting Bike bike = new Bike(); // say Bike is also a subclass of Vehicle Vehicle v = bike; // upcasting, no problem here. Car car3 = (Car)bike; // Compilation Error : as bike is NOT a instance of Car

実行コード

これで、親子関係を介してコードを共有する方法がわかりました。しかし、子クラスでの特定のメソッドの実装が気に入らず、新しいメソッドを作成したい場合はどうでしょうか。だったらどうしようか?

それを上書きしてください!

Javaを使用すると、スーパークラスで定義されているメソッドをオーバーライドまたは再定義できます。たとえば、Carクラスの実装はstart()親とは異なるVehicleため、次のようにします。

public class Vehicle { public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public void start() { System.out.println("Car start code"); } } Car car = new Car(); car.start(); // "Car start code"

実行コード

したがって、サブクラスのメソッドをオーバーライドするのは非常に簡単です。が、そこにあるキャッチ。サブクラスメソッドとまったく同じメソッドシグネチャを持つスーパークラスメソッドのみがオーバーライドされます。つまり、サブクラスメソッド定義は、まったく同じ名前、同じ数とタイプのパラメーターを持ち、まったく同じ順序である必要があります。したがって、public void start(String key)をオーバーライドしませんpublic void start()

  • スーパークラスのプライベートメソッドをオーバーライドすることはできません。(当たり前ですね)
  • サブクラスでオーバーライドしているスーパークラスのメソッドが突然消去されたり、メソッドが変更されたりした場合はどうなりますか?実行時に失敗します!したがって、Javaは@Override、サブクラスメソッドの上に配置できる気の利いたアノテーションを提供します。これにより、コンパイラにこれらのインシデントが警告されます。

Annotations in Java is a good coding practice, but they are not a necessity. The compiler is smart enough to figure out overriding on its own though. Unlike other OOP languages, Annotations in Java it doesn’t necessarily modify the method or add extra functionality.

How to call super class methods?

Funny you ask about it! Just use the keyword super :

public class Vehicle() { public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public void run() { super.start(); } } Car car = new Car(); car.run(); // "Vehicle start code"

Run Code

N.B. : Although you can call the parent method by using a super call, you cannot go up the inheritance hierarchy with chained super calls.

How to know the type of a class?

Using the instanceof keyword. Having lots of classes and subclasses it would be a little confusing to know which class is a subclass of which one in runtime. So, we can use instanceof to determine whether an object is an instance of a class, an instance of a subclass, or an instance of an interface.

Car car = new Car(); boolean flag = car instanceof Vehicle; // true in this case!

Constructors & Inheritance

As mentioned earlier, constructors cannot be directly inherited by a subclass. Although, a subclass is required to call its parent’s constructor as the first operation in its own constructor. How? You guessed it, using super :

public class Vehicle { public Vehicle() { // constructor } public void start() { System.out.println("Vehicle start code"); } } public class Car extends Vehicle { public Car() { super(); } public void run() { super.start(); } }

Run Code

Remember, if the superclass does not have any constructors defined, you don’t have to call it explicitely in the subclass. Java handles that internally for you! Invocation to super constructor is done in the case when the super class is to be called with any other constructor other than the default constructor.

If no other constructors are defined, then Java invokes the default super class constructor (even if not defined explicitly).

Congrats, now you know all about Inheritance! Read more about advanced ways to inherit things in Abstract Classes and Interfaces!