Java の新しいバージョンはすべて、以前のバージョンとは異なります。これまで取り上げてきた内容の変更の例を次に示します。Java 5 より前の言語には
同様に、Java 8 は Java 7 とは著しく異なります。レッスンのほとんどは言語の第 7 バージョン用に書かれていますが、もちろん重要な革新を無視するわけではありません。このレッスンではすでにインターフェイスについて説明しているため、更新の 1 つであるインターフェイスのデフォルト メソッドを検討します。インターフェースが動作を実装していないことはすでにご存知でしょう。そのタスクは、それを実装するすべてのオブジェクトが持つ必要がある動作を記述することです。。しかし、開発者は、メソッドの実装がすべてのクラスで同じであるという状況に頻繁に遭遇しました。古い車の例を考えてみましょう。
enum
s がありませんでした。 
public interface Car {
public void gas();
public void brake();
}
public class Sedan implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class Truck implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
public class F1Car implements Car {
@Override
public void gas() {
System.out.println("Gas!");
}
@Override
public void brake() {
System.out.println("Brake!");
}
}
「あなたの意見では、このコードの主な問題は何ですか? おそらく、私たちが繰り返しコードを大量に書いたことに気づいたでしょう! この問題はプログラミングではよくある問題であり、回避する必要があります。特定の解決策が以前に存在しなかったことは別の問題です。 Java 8 がリリースされました。このバージョンでは、デフォルトのメソッドを指定して、それらをインターフェース内で直接実装できるようになりました!その方法は次のとおりです:
public interface Car {
public default void gas() {
System.out.println("Gas!");
}
public default void brake() {
System.out.println("Brake!");
}
}
public class Sedan implements Car {
}
public class Truck implements Car {
}
public class F1Car implements Car {
}
gas()
すべての車で同じであったおよび メソッドbrake()
がインターフェイスに移動されました。コードを繰り返す必要はありません。さらに、メソッドは各クラスで使用できます。
public class Main {
public static void main(String[] args) {
F1Car f1Car = new F1Car();
Sedan sedan = new Sedan();
Truck truck = new Truck();
truck.gas();
sedan.gas();
f1Car.brake();
}
}
このメソッドを持つクラスが 100 個ありgas()
、そのうち同じ動作をするクラスが 99 個だけだった場合はどうなるでしょうか? それはすべてを台無しにし、デフォルトの方法がこの状況には適さなくなるのでしょうか? もちろん、そうではありません:) インターフェイスのデフォルトのメソッドは、通常のメソッドと同じ方法でオーバーライドできます。
public class UnusualCar implements Car {
@Override
public void gas() {
System.out.println("This car accelerates differently!");
}
@Override
public void brake() {
System.out.println("This car decelerates differently!");
}
}
他の 99 種類の自動車はすべてデフォルトの方法を実装します。UnusualCar
クラスは例外ですが、全体像を損なうことなく、独自の動作を冷静に定義します。インターフェースの多重継承。すでにご存知のとおり、Java は多重継承をサポートしていません。これには多くの理由があります。別のレッスンで詳しく見ていきます。C++ などの他の言語はこれをサポートしています。多重継承がないと、1 つのオブジェクトが複数の異なる特性や「動作」を持つ可能性があるという深刻な問題が発生します。これは人生の例です。私たちは両親にとっては子供であり、教師にとっては生徒であり、医師にとっては患者です。人生において、私たちはさまざまな役割を引き受け、それに応じて異なる行動をします。当然のことながら、私たちは親しい友人と話すのと同じように教師と話すことはありません。これをコードに変換してみましょう。2 つのクラスがあると想像してください。池と鳥小屋。池には水鳥が必要です。鳥小屋のためには、飛んでいる鳥が必要です。これを行うために、次の 2 つの基本クラスを作成しました。FlyingBird
そしてWaterfowl
。
public class Waterfowl {
}
public class FlyingBird {
}
FlyingBird
したがって、クラスを継承する鳥を鳥小屋に 送信し、継承する鳥をWaterfowl
池に送信します。すべてはとても単純なことのように思えます。しかし、アヒルをどこに送ればよいのでしょうか?泳いだり飛んだりします。そして、多重継承はありません。幸いなことに、Java はインターフェースの複数の実装をサポートしています。クラスは複数の親を継承できませんが、複数のインターフェイスを簡単に実装できます。 私たちのアヒルは飛ぶ鳥にも水鳥にもなります :)望ましい結果を達成するには、クラスではなくインターフェースを 作成するだけで済みます。FlyingBird
Waterfowl
public class Duck implements FlyingBird, Waterfowl {
// The methods of both interfaces can be easily combined into one class
@Override
public void fly() {
System.out.println("Fly!");
}
@Override
public void swim() {
System.out.println("Swim!");
}
}
したがって、私たちのプログラムはクラスの柔軟性を保持しており、デフォルトのメソッドと組み合わせることで、オブジェクトの動作を定義する能力はほぼ無制限になります。:)
GO TO FULL VERSION