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

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 までご連絡ください。
Javaプラットフォームの独立性:異なるOSとの互換性Javaプラットフォームの独立性:異なるOSとの互換性May 13, 2025 am 12:11 AM

javaachievesplatformentenceTheTheTheJavavirtualMachine(JVM)、CodetorunondifferentoperatingSystemswithOutModification.thejvmcompilesjavacodeplatform-IndopentedbyTecodeを承認することを許可します

Javaをまだ強力にしている機能Javaをまだ強力にしている機能May 13, 2025 am 12:05 AM

javaispowerfulfulduetoitsplatformindepentence、object-orientednature、richstandardlibrary、performancecapability、andstrongsecurityfeatures.1)platformendependenceallowseplicationStorunonaydevicesupportingjava.2)オブジェクト指向のプログラマン型

トップJava機能:開発者向けの包括的なガイドトップJava機能:開発者向けの包括的なガイドMay 13, 2025 am 12:04 AM

上位のJava関数には、次のものが含まれます。1)オブジェクト指向プログラミング、サポートポリ型、コードの柔軟性と保守性の向上。 2)例外処理メカニズム、トライキャッチ式ブロックによるコードの堅牢性の向上。 3)ゴミ収集、メモリ管理の簡素化。 4)ジェネリック、タイプの安全性の向上。 5)コードをより簡潔で表現力豊かにするためのAMBDAの表現と機能的なプログラミング。 6)最適化されたデータ構造とアルゴリズムを提供するリッチ標準ライブラリ。

Javaは本当にプラットフォームが独立していますか?どのように「一度書く、どこでも実行」が機能する方法Javaは本当にプラットフォームが独立していますか?どのように「一度書く、どこでも実行」が機能する方法May 13, 2025 am 12:03 AM

javaisnotentirelylylyplatformedent dueTojvmvariations andNativeCodeIntegration、ButlargelyHoldSitsworapromise.1)JavacompilestobyteCoderunbythejvm、Cross-Platformexecution.2を許可します

JVMの分解:Javaの実行を理解するための鍵JVMの分解:Javaの実行を理解するための鍵May 13, 2025 am 12:02 AM

thejavavirtualmachine(jvm)isanabstractcomputingmachineculucialforjavaexecutionsiTrunsjavabytecode、「writeonce、runaynay "capability

Javaはまだ新機能に基づいた良い言語ですか?Javaはまだ新機能に基づいた良い言語ですか?May 12, 2025 am 12:12 AM

JavaremainsagoodlanguagedueToitscontinuousevolution androbustecosystem.1)lambdaexpressionsenhancecodereadability andenableFunctionalprogramming.2)streamsalowsolowsolfisitydataprocessing、特に特にlagedatasets.3)硬化系系統系系統系系統系系統

何がJavaを素晴らしいものにしますか?主な機能と利点何がJavaを素晴らしいものにしますか?主な機能と利点May 12, 2025 am 12:11 AM

Javaisgreatduetoitsplatformindependence、robustoopsupport、extensiveLibraries、andstrongCommunity.1)PlatformentepenteviajvMallowsCodeTorunonVariousPlatforms.2)oopeatureSlikeEncapsulation、遺伝、およびポリモ系系統型皮下皮質皮下Rich

トップ5のJava機能:例と説明トップ5のJava機能:例と説明May 12, 2025 am 12:09 AM

Javaの5つの主要な特徴は、多型、Lambda Expressions、StreamSapi、ジェネリック、例外処理です。 1。多型により、さまざまなクラスのオブジェクトを一般的なベースクラスのオブジェクトとして使用できます。 2。Lambda式は、コードをより簡潔にし、特にコレクションやストリームの処理に適しています。 3.ストリームサピは、大規模なデータセットを効率的に処理し、宣言操作をサポートします。 4.ジェネリックは、タイプの安全性と再利用性を提供し、型刻印中にタイプエラーがキャッチされます。 5.例外処理は、エラーをエレガントに処理し、信頼できるソフトウェアを作成するのに役立ちます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター