ホームページ >Java >&#&チュートリアル >抽象化: 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.インターフェースの変数:
注: 静的最終変数は、宣言時または静的ブロック内で初期化できます。ただし、インターフェイスでは静的ブロックが許可されないため、これらの変数は宣言中に初期化する必要があります。
2.抽象メソッド:
3.デフォルトのメソッド:
4.静的メソッド:
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"); } }
メソッドアクセス:
デフォルト メソッド (concreteMethod()) とオーバーライドされたメソッド (abstractMethod()) は、クラス インスタンス obj を使用してアクセスされ、両方のタイプのメソッドをどのように呼び出すことができるかを示しています。
インターフェイス変数へのアクセス:
インターフェイス変数 id には、インターフェイス名 (InterfaceBasics.id) と実装クラス名 (InterfaceBasicsImpl.id) の両方を使用してアクセスできます。これは、インターフェイス内の静的な Final 変数が継承され、実装クラスがその変数を参照できることを示しています。
静的メソッドアクセス:
静的メソッド staticMethod() は、インターフェイス名 (InterfaceBasics.staticMethod()) を使用してのみ呼び出すことができます。インターフェイスの静的メソッドは継承されないため、実装クラス (InterfaceBasicsImpl.staticMethod()) を通じてアクセスしようとすると、コンパイル時エラーが発生します。
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"); } }
デフォルトのメソッドを使用しても、インターフェースは抽象クラスとは区別されます。
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 8 での デフォルト と 静的メソッド の導入により、インターフェースはさらに強力になり、下位互換性が可能になり、インターフェース内でユーティリティ メソッドを直接提供できるようになりました。
ただし、インターフェイスは抽象クラスの代替ではありません。これらは、動作のコントラクトを定義する必要がある場合、特に多重継承が必要な場合に使用する必要があります。
インターフェイス は、方法を指定せずにクラスが何を行うべきかを定義することで抽象化を提供します。
変数 は常に public、static、final です。
デフォルトおよび静的メソッド により、インターフェース内での下位互換性とユーティリティ実装が可能になります。
静的メソッドは継承されないため、使用法が明確になります。
インターフェイスをいつどのように使用するかを理解することは、コーディング スキルを向上させるだけでなく、OOP の概念 と Java デザイン パターン に関する面接の質問への準備にもなります。
Java の基礎
アレイインタビューの要点
Java メモリの基礎
Java キーワードの基礎
コレクション フレームワークの基本
コーディングを楽しんでください!
以上が抽象化: Java のインターフェースのデコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。