1.インターフェースの定義と使用
フォーマット:
(1 )インターフェース本体の抽象メソッドと定数
JDK8より前は、インターフェイス本体には抽象メソッドしかなく、アクセス許可はパブリックである必要があります(パブリック修飾子と抽象修飾子は省略できます)。すべての静的定数にpublicへのアクセス権が付与されます(public 、Final 、およびstatic修飾子を省略できます。インターフェイスには変数がありません)
(2 )インターフェース本体のデフォルトのインスタンスメソッド
JDK8の放出、の使用可能デフォルトと呼ばれるキーワードを、インタフェースが体内に定義されているデフォルト(定義されていない方法の例をデフォルト静的メソッド)、デフォルトの方法と従来の一般的な方法の例は、キーワードよりも使用するデフォルトメソッド本体でインスタンスメソッドを変更しました。デフォルトのインスタンスメソッドのアクセス許可はpublicである必要があります(public修飾子は省略できます)。
(3 )インターフェース本体の静的メソッド
出発JDK8のバージョン、静的方法がインターフェース本体に定義することはでき。
クラスは、implementsキーワード を使用して、1つ以上のインターフェイスを実装することを宣言します。複数のインターフェイスを実装する場合は、インターフェイス名をコンマで区切ります。たとえば、タイプAは印刷可能インターフェイスと追加可能インターフェイスを実装します。
クラスA はPrintable、Addable {を 実装します
}
クラスはインターフェイスを実装します。このクラスには当然、定数インターフェイス、デフォルトメソッド(デフォルトキーワードを削除するため)があり、クラスインターフェイスはデフォルトメソッドをオーバーライドすることもできます(書き換えデフォルトキーワードを削除する必要があることに注意してください)。非抽象クラスがインターフェースを実装する場合、このクラスはインターフェースのすべての抽象メソッドを書き換える必要があります。つまり、抽象変更を削除してメソッド本体を指定する必要があります。
2、インターフェースコールバック
インターフェイスを実装するクラスによって作成されたオブジェクトへの参照を、インターフェイスによって宣言されたインターフェイス変数に割り当てることができます。その後、インターフェイス変数は、クラスによってオーバーライドされたインターフェイスメソッドとインターフェイスのデフォルトメソッドを呼び出すことができます。
public class InterfaceTest {
public static void main(String[] args) {
ShowMessage sm = null; //声明接口变量
sm = new TV(); //接口变量中存放对象的引用
sm.show("长城牌电视机"); //接口回调
sm.f(); //接口回调
sm = new PC();
sm.show("惠普笔记本"); //接口回调
sm.f(); //接口回调
}
}
public interface ShowMessage {
public abstract void show(String s);
default void f(){
System.out.println("default方法");
}
}
public class TV implements ShowMessage{
@Override
public void show(String s) {
System.out.println(s);
}
//重写default方法
public void f(){
System.out.println("重写了default方法");
}
}
public class PC implements ShowMessage {
@Override
public void show(String s) {
System.out.println(s);
}
}
万里の長城テレビ
はデフォルトの方法を書き直します
HPノートブックの
デフォルトの方法
3、インターフェースを理解する
(1 )インターフェースは、抽象的なメソッドで表現される重要な動作標準を抽象化できます。
(2 )インターフェースを実装するクラスのオブジェクトの参照をインターフェース変数に割り当てることができ、インターフェース変数は、動作標準に従ってクラスの特定の動作を反映する、クラスによって実装されるインターフェースメソッドを呼び出すことができます。インターフェイスで。
インターフェイスの考え方は、特定のクラスに同じ名前のメソッドが必要になる場合がありますが、メソッドの特定の内容が異なる場合があります。つまり、これらのクラスがインターフェイスを実装して、これらのクラスにインターフェイスで宣言されたメソッド(いわゆるメソッドバインディング)。インターフェイスでは、一部のクラスに同じ名前のメソッドが必要ですが、これらのクラスに同じ親クラスを強制することはありません。
abstract class MotorVehicles{
abstract void brake();
}
interface MoneyFare{
void charge();
}
interface ControlTemperature{
void controlAirTemperature();
}
class Bus extends MotorVehicles implements MoneyFare{
@Override
public void charge() {
System.out.println("公共汽车:一元/一张,不计公里数。");
}
@Override
void brake() {
System.out.println("公共汽车刹车。");
}
}
class Taxi extends MotorVehicles implements MoneyFare,ControlTemperature{
@Override
public void charge() {
System.out.println("出租车刹车。");
}
@Override
void brake() {
System.out.println("出租车:两元/一张,起价3公里。");
}
@Override
public void controlAirTemperature() {
System.out.println("出租车安装了空调。");
}
}
class Cinema implements MoneyFare,ControlTemperature{
@Override
public void controlAirTemperature() {
System.out.println("电影院安装了空调。");
}
@Override
public void charge() {
System.out.println("电影院:门票,十元/张");
}
}
public class Motor {
public static void main(String[] args) {
Bus bus101 = new Bus();
Taxi blueTaxi = new Taxi();
Cinema cinema = new Cinema();
MoneyFare fare;
ControlTemperature temperature;
fare = bus101;
bus101.brake();
fare.charge();
fare = blueTaxi;
temperature = blueTaxi;
blueTaxi.brake();
fare.charge();
temperature.controlAirTemperature();
fare = cinema;
temperature = cinema;
fare.charge();
temperature.controlAirTemperature();
}
}
バスがブレーキをかけます。
バス:キロメートルを数えずに、1人あたり1元。
タクシー:3キロから2元/ 1。
タクシーはブレーキをかけます。
タクシーはエアコン完備です。
映画館:チケット、10元/個
映画館にはエアコンが備わっています。
4、インターフェースとポリモーフィズム
インターフェイスのポリモーフィズムは、同じインターフェイスを実装するときに異なるクラスが異なる実装メソッドを持つ可能性があることを意味します。したがって、インターフェイスメソッドをコールバックするときにインターフェイス変数が複数の形式を持つ可能性があります。
インターフェイスを使用したプログラミングの中心的なアイデアは、インターフェイスコールバックを使用することです。つまり、インターフェイス変数は、インターフェイスを実装するクラスのオブジェクトへの参照を格納し、インターフェイス変数がクラスによって実装されたインターフェイスメソッドをコールバックできるようにします。
インターフェースを使用することも反映できるオープン-のクローズ原則プログラム設計、拡張子にオープンしており、修正のため閉鎖します。
public class Adver {
public static void main(String[] args) {
AdvertisementBoard board = new AdvertisementBoard();
board.setAdver(new PhilipsCorp());
board.show();
}
}
public interface Advertisement {
public void showAdvertisement();
public String getCorpName();
}
public class AdvertisementBoard {
Advertisement adver;
public void setAdver(Advertisement adver) {
this.adver = adver;
}
public void show(){
if(adver != null){
System.out.println("广告牌显示" + adver.getCorpName() + "公司的广告词:");
adver.showAdvertisement();
}else{
System.out.println("广告牌无广告。");
}
}
}
public class PhilipsCorp implements Advertisement {
@Override
public void showAdvertisement() {
System.out.println("只有最好的,只有更好。");
}
@Override
public String getCorpName() {
return "飞利浦";
}
}
看板には、フィリップスの広告スローガンが示されてい
ます。最高のものだけ、より良いものだけです。
5、抽象とインターフェースの比較
1 。抽象クラスとインターフェースの両方が抽象メソッドを持つことができます。
2 。インターフェイスには定数のみが存在でき、変数は存在できません。抽象クラスは定数または変数を持つことができます。
3 。抽象クラスは非抽象メソッドを持つこともできますが、デフォルトのインスタンスメソッドはありません。インターフェイスは非抽象メソッド(デフォルトのメソッドではなく、メソッド本体を持つメソッド)を持つことはできませんが、デフォルトのインスタンスメソッドを持つことはできます。
プログラムを設計するときは、特定の分析に基づいて、抽象クラスとインターフェイスのどちらを使用するかを決定する必要があります。重要なサブクラスを提供することに加えて、抽象クラスはメソッドに抽象を実装する必要がありますが、変数と非抽象メソッドを継承できるサブクラスも提供します。たとえば、親クラスの抽象メソッドの実装に加えて、サブクラスがいくつかの変数を継承するか、親クラスからいくつかの重要な非抽象メソッドを継承する必要がある場合など、継承によって問題をより適切に解決する必要がある場合は、次のことを検討できます。抽象クラスを使用します。問題が継承を必要としないが、いくつかの重要な抽象メソッド実装の詳細を提供するためにいくつかのクラスのみが必要な場合は、インターフェースの使用を検討できます。