ホームページ >Java >&#&チュートリアル >抽象化: Java のインターフェースのデコード

抽象化: Java のインターフェースのデコード

Susan Sarandon
Susan Sarandonオリジナル
2024-11-03 06:58:02575ブラウズ

Abstraction: Decoding Interfaces in Java

Java では、インターフェイスはクラスが準拠する必要がある契約として機能します。 インターフェースは、(メソッドのシグネチャを介して) 何ができるかという知識を提供するだけであり、(実装をクラスに任せることによって)それがどのように行われるかを隠します。インターフェースを実装する)、抽象化を実現します。 何を方法を分離することが、抽象化の背後にある中心的なアイデアです。

Java 8 では、インターフェイスは純粋な抽象的な動作を超えて進化し、デフォルト メソッドと 静的 メソッドをサポートして、柔軟性と 下位互換性 を向上させました。

この投稿では、概念を理解するのに役立つコード例を使用して、インターフェイス、その主な機能、インターフェイスと抽象クラスの違いについて詳しく説明します。


インターフェースとは何ですか?

Java のインターフェースは、実装クラスが従う必要がある 一連の動作 (メソッド) を指定します。これには、メソッド シグネチャ定数のみが含まれます。抽象クラスとは対照的に、インターフェイスでは、クラスが複数のインターフェイスを実装できるようにすることで多重継承が可能になります。

インターフェースの主な機能:

  • インターフェイス内の変数は、暗黙的に public、static、final です。

  • すべてのメソッドは暗黙的にパブリックかつ抽象的です (Java 8 より前)。

  • クラスは複数のインターフェースを実装でき、クラスの単一継承の制限を克服します。

  • Java 8 以降 では、インターフェイスにデフォルトの静的メソッドも含めることができ、下位互換性が強化されています。


基本: インターフェイス構文

package oops.interfaces;

public interface InterfaceBasics {

    // Variables are public, static, and final by default
    // Initialization can only be done with declaration (No Static Blocks)
    // Compiler Interpretation: public static final int id = 90;
    int id = 90;

    // Abstract method (public and abstract by default)
    // Compiler Interpretation: public abstract void abstractMethod();
    void abstractMethod();

    // Default method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public default void concreteMethod()
    default void concreteMethod() {
        System.out.println("Concrete Method Called");
    }

    // Static method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public static void staticMethod()
    static void staticMethod() {
        System.out.println("Static Method Called");
    }
}

主要な概念の説明:

1.インターフェースの変数:

  • public: インターフェースを実装する任意のクラスからアクセス可能。
  • static: インターフェース名を使用して直接アクセスできます。
  • Final: 一貫性を確保するために、初期化後の値の変更を防ぎます。

注: 静的最終変数は、宣言時または静的ブロック内で初期化できます。ただし、インターフェイスでは静的ブロックが許可されないため、これらの変数は宣言中に初期化する必要があります

2.抽象メソッド:

  • これらは、本体や実装のないメソッド シグネチャです。
  • インターフェイスではデフォルトでパブリックです。
  • すべての抽象メソッドは、実装クラスによってオーバーライドされる必要があります

3.デフォルトのメソッド:

  • インターフェースのメソッドにデフォルト実装を提供するためにJava 8で導入されました。
  • これらのメソッドはデフォルトで公開されています
  • クラスを実装するとオーバーライドできますが、必須ではありません
  • ここで、「デフォルト」はアクセス修飾子ではありません。これは単に、メソッドが抽象的ではなくであり、具体的な実装ができることを示しています。
  • この機能は、開発者が下位互換性を壊すことなく既存のインターフェースを拡張するのに役立ちます。

4.静的メソッド:

  • 静的メソッドはインターフェースに属します。
  • インターフェース名を使用してのみアクセスできます。
  • これらのメソッドはデフォルトで公開されています
  • これらは、クラスの実装によって継承されません
  • 静的メソッドはオーバーライドできません

Java でのインターフェースの実装

package oops.interfaces;

public interface InterfaceBasics {

    // Variables are public, static, and final by default
    // Initialization can only be done with declaration (No Static Blocks)
    // Compiler Interpretation: public static final int id = 90;
    int id = 90;

    // Abstract method (public and abstract by default)
    // Compiler Interpretation: public abstract void abstractMethod();
    void abstractMethod();

    // Default method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public default void concreteMethod()
    default void concreteMethod() {
        System.out.println("Concrete Method Called");
    }

    // Static method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public static void staticMethod()
    static void staticMethod() {
        System.out.println("Static Method Called");
    }
}

主要な概念の説明:

  1. メソッドアクセス:
    デフォルト メソッド (concreteMethod()) とオーバーライドされたメソッド (abstractMethod()) は、クラス インスタンス obj を使用してアクセスされ、両方のタイプのメソッドをどのように呼び出すことができるかを示しています。

  2. インターフェイス変数へのアクセス:
    インターフェイス変数 id には、インターフェイス名 (InterfaceBasics.id) と実装クラス名 (InterfaceBasicsImpl.id) の両方を使用してアクセスできます。これは、インターフェイス内の静的な Final 変数が継承され、実装クラスがその変数を参照できることを示しています。

  3. 静的メソッドアクセス:
    静的メソッド staticMethod() は、インターフェイス名 (InterfaceBasics.staticMethod()) を使用してのみ呼び出すことができます。インターフェイスの静的メソッドは継承されないため、実装クラス (InterfaceBasicsImpl.staticMethod()) を通じてアクセスしようとすると、コンパイル時エラーが発生します。


デフォルトメソッドと静的メソッドを使用する理由

1. デフォルトのメソッド

  • Java 8 より前は、インターフェイスに新しいメソッドを追加することは大きな課題でした。新しい機能を使用するにはすべての実装クラスを更新する必要がありました。これにより、大規模なコードベースで破壊的な変更が発生することがよくありました。
  • デフォルトメソッドの導入により、インターフェースは新しいメソッドの具体的な実装を提供できるようになり、下位互換性が保証されます。つまり、既存のクラスは変更されないまま、新しい機能の恩恵も受けられる
  • この設計の選択により、ストリームとラムダ機能コレクション フレームワークに追加する道も開かれました。

2. 静的メソッド

  • 静的メソッドは、インターフェースに関連するユーティリティ関数を提供し、クラスの実装によってオーバーライドする必要はありません。
  • Java は、静的メソッドをインターフェース自体に結び付けて継承を防ぐことにより、一般に ダイヤモンド問題 として知られる複数のインターフェース間でのメソッド名の衝突から生じる可能性のある潜在的な曖昧さと混乱を回避します。
  • 使用例: 以下は、ロギング設定用の静的メソッドを使用したインターフェイスの実際の使用例です。
package oops.interfaces;

public interface InterfaceBasics {

    // Variables are public, static, and final by default
    // Initialization can only be done with declaration (No Static Blocks)
    // Compiler Interpretation: public static final int id = 90;
    int id = 90;

    // Abstract method (public and abstract by default)
    // Compiler Interpretation: public abstract void abstractMethod();
    void abstractMethod();

    // Default method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public default void concreteMethod()
    default void concreteMethod() {
        System.out.println("Concrete Method Called");
    }

    // Static method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public static void staticMethod()
    static void staticMethod() {
        System.out.println("Static Method Called");
    }
}
  • この例では、静的メソッド getDefaultLogFileName() は、実装をクリーンに保ち、インターフェース内にカプセル化したまま、デフォルトのログ ファイル名を取得する方法を提供します。

インターフェイスは抽象クラスとどのように異なりますか?

デフォルトのメソッドを使用しても、インターフェースは抽象クラスとは区別されます。

Aspect Interface Abstract Class
Methods Can have abstract, default, and static methods Can have abstract and non-abstract methods
Variables Only public, static, and final variables Can have any access modifier and instance variables
Inheritance Supports multiple inheritance Supports single inheritance
Constructors Cannot have constructors Can have constructors
アスペクト インターフェース 抽象クラス メソッド 抽象メソッド、デフォルトメソッド、静的メソッドを使用できる 抽象メソッドと非抽象メソッドを使用できる 変数 パブリック変数、静的変数、および最終変数のみ 任意のアクセス修飾子とインスタンス変数を含めることができます 継承 多重継承をサポート 単一継承をサポート コンストラクター コンストラクターを含めることはできません コンストラクターを持つことができます テーブル>

デフォルトのメソッドは、下位互換性が必要な場合にのみ、既存のインターフェースを拡張するためにのみ使用してください。これらは抽象クラスの代替ではありません。


インターフェースに関するよくある面接の質問

1.インターフェイス変数は変更できますか?

いいえ、インターフェイス変数は暗黙的に最終変数です。つまり、一度割り当てられた値は変更できません。

package oops.interfaces;

public interface InterfaceBasics {

    // Variables are public, static, and final by default
    // Initialization can only be done with declaration (No Static Blocks)
    // Compiler Interpretation: public static final int id = 90;
    int id = 90;

    // Abstract method (public and abstract by default)
    // Compiler Interpretation: public abstract void abstractMethod();
    void abstractMethod();

    // Default method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public default void concreteMethod()
    default void concreteMethod() {
        System.out.println("Concrete Method Called");
    }

    // Static method - Introduced in Java 8 (public by default)
    // Compiler Interpretation: public static void staticMethod()
    static void staticMethod() {
        System.out.println("Static Method Called");
    }
}

2.メソッドをデフォルトと静的な両方で宣言できますか?

いいえデフォルト メソッド は、クラスを実装することでオーバーライドできる具体的な実装を提供するため、柔軟性が得られます。対照的に、静的メソッド はインターフェイス自体に属し、オーバーライドできず、ユーティリティ関数を提供します。したがって、2 つを一緒に使用することはできません

package oops.interfaces;

// A class implementing the InterfaceBasics interface
public class InterfaceBasicsImpl implements InterfaceBasics {

    // Mandatory: Override all abstract methods from the interface
    @Override
    public void abstractMethod() {
        System.out.println("Overridden Method Called");
    }

    public static void main(String[] args) {
        InterfaceBasics obj = new InterfaceBasicsImpl();

        // Calling interface's default and overridden methods
        obj.concreteMethod();  // Output: Default Method Called
        obj.abstractMethod();  // Output: Overridden Method Called

        // Accessing interface variables (static and final by default)
        // Interface variables are inherited
        // Possible with both interface name and implementing class name
        System.out.println(InterfaceBasics.id);        // Output: 90
        System.out.println(InterfaceBasicsImpl.id);    // Output: 90

        // Cannot assign a value to final variable 'id'
        InterfaceBasicsImpl.id = 100;  // --> Compile Error

        // Calling static method using interface name
        // Cannot access using implementing class name
        // Interface static methods are NOT inherited
        InterfaceBasics.staticMethod();  // Output: Static Method Called
    }
}

3.インターフェイスの静的メソッドを継承できないのはなぜですか?

静的メソッドは、クラスの特定のインスタンスではなく、インターフェース自体に関連付けられています。つまり、静的メソッドは全体としてインターフェースに属します。静的メソッドがクラスの実装によって継承された場合、特に複数のインターフェースが同じ名前のメソッドを定義している場合、どのメソッドが呼び出されているかについての曖昧さと混乱が生じる可能性があります

例:

package oops.interfaces.example;

public interface Logger {

    // Using a variable to store the default log file name
    String DEFAULT_LOG_FILE_NAME = "application.log";

    // Static method to get the default log file name with configuration
    static String getDefaultLogFileName() {
        // Simulating configuration retrieval
        // Could be from a properties file or environment variable
        String logFileName = System.getenv("LOG_FILE_NAME");

        // If a log file name is set in the environment, return it;
        // Otherwise, return the default
        if (logFileName != null && !logFileName.isEmpty()) {
            return logFileName;
        } else {
            return DEFAULT_LOG_FILE_NAME;
        }
    }
}

public class FileLogger implements Logger {

    public static void main(String[] args) {
        // Using the interface variable
        String defaultLogFile = Logger.DEFAULT_LOG_FILE_NAME;

        // Using the static method
        if ("FILE".equals(System.getenv("LOG_TYPE"))) {
            defaultLogFile = Logger.getDefaultLogFileName();
        }

        System.out.println("Log file used: " + defaultLogFile);
    }
}

静的メソッドをインターフェースのみに結び付けることで、Java は明確さを維持し、悪名高い多重継承のダイヤモンド問題につながるメソッド解決の潜在的な競合を回避します。


結論

Java の

インターフェースは、実装クラスが従う必要がある動作を定義することにより、抽象化を実現する上で重要な役割を果たします。 Java 8 での デフォルト静的メソッド の導入により、インターフェースはさらに強力になり、下位互換性が可能になり、インターフェース内でユーティリティ メソッドを直接提供できるようになりました。

ただし、インターフェイスは抽象クラスの代替ではありません。これらは、動作のコントラクトを定義する必要がある場合、特に多重継承が必要な場合に使用する必要があります。


重要なポイント:

  • インターフェイス は、方法を指定せずにクラスが何を行うべきかを定義することで抽象化を提供します。

  • インターフェイスの
  • 変数 は常に public、static、final です。

  • Java 8 で導入された
  • デフォルトおよび静的メソッド により、インターフェース内での下位互換性とユーティリティ実装が可能になります。

  • インターフェース内の
  • 静的メソッドは継承されないため、使用法が明確になります。

インターフェイスをいつどのように使用するかを理解することは、コーディング スキルを向上させるだけでなく、OOP の概念Java デザイン パターン に関する面接の質問への準備にもなります。


関連記事

  • Java の基礎

  • アレイインタビューの要点

  • Java メモリの基礎

  • Java キーワードの基礎

  • コレクション フレームワークの基本

コーディングを楽しんでください!

以上が抽象化: Java のインターフェースのデコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。