目次
1. はじめに
2. 理解する
3.
4. アプリケーション プロキシ モード (Proxy)
1. アプリケーション シナリオ
2. 分类
3. 代码演示
五、接口和抽象类之间的对比
六、经典题目(排错)
ホームページ Java &#&チュートリアル Javaインターフェースを定義して使用する方法

Javaインターフェースを定義して使用する方法

Apr 18, 2023 pm 10:10 PM
java

    1. はじめに

    一方で、いくつかのクラスからサブクラスを派生し、そのすべてのプロパティとメソッドを継承する必要がある場合があります。ただし、Java は多重継承をサポートしていません。インターフェイスを使用すると、多重継承の効果を得ることができます。

    一方で、いくつかのクラスから共通の動作特性を抽出する必要がある場合がありますが、それらの間には関係がなく、単に同じ動作特性を持っているだけです。例: マウス、キーボード、プリンタ、スキャナ、カメラ、充電器、MP3 プレーヤー、携帯電話、デジタル カメラ、モバイル ハード ドライブなどはすべて USB 接続をサポートしています。

    2. 理解する

    インターフェイスは一連のルールを定義し、「...である/したい場合は、...できる必要がある」という考えを具体化する仕様です。 。" 現実世界では。継承は「ある」関係ですが、インターフェイスの実装は「できる」関係です。

    インターフェースの本質は、法律と同じように、契約、標準、仕様です。一度定められたら、全員がそれを遵守しなければなりません。

    3.

    インターフェイスを使用し、キーワード interface を使用して定義します。

    Java では、インターフェイスとクラスは並列関係にあります。または、インターフェイスを特別なクラスとして理解することもできます。本質的に、インターフェイスは、変数とメソッドの実装を含まず、定数とメソッド (JDK7.0 以前) の定義のみを含む特別な抽象クラスです。

    Java クラスを定義するための構文形式: 最初に extends を記述し、次に implements

    class SubClass extends SuperClass implements InterfaceA{ }
    ログイン後にコピー

    インターフェース (interface) is 抽象メソッドと定数値定義のコレクション。

    インターフェースの定義方法:

    JDK7 以前: グローバル定数と抽象メソッドのみ定義可能

    1. インターフェース内のすべてのメンバー変数はデフォルトでは public static FinalModified ですが、省略できます。

    2. インターフェイス内のすべての抽象メソッドは、デフォルトでは public abstract によって変更されます。

    コードのデモ:

    public interface Runner {
      int ID = 1;//<=>public static final int ID = 1;
      void start();//<=>public abstract void start();
      public void run();//<=>public abstract void run();
      void stop();//<=>public abstract void stop();
    }
    ログイン後にコピー

    JDK8: グローバル定数と抽象メソッドの定義に加えて、静的メソッドとデフォルト メソッドも定義できます。

    1. 静的メソッド: static キーワードを使用して変更します。

    インターフェイスで定義された静的メソッドは、インターフェイスを通じてのみ呼び出して、そのメソッド本体を実行できます。相互に使用されるクラスでは静的メソッドをよく使用します。標準ライブラリには、Collection/CollectionsPath/Paths などのインターフェイスとクラスのペアがあります。

    2. デフォルトのメソッド: デフォルトのメソッドは、default キーワードで変更されます。クラスオブジェクトを実装することで呼び出すことができます。古いバージョンのコードとの互換性を維持しながら、既存のインターフェイスに新しいメソッドを提供します。例: Java 8 API は、CollectionListComparator およびその他のインターフェイス用の豊富なデフォルト メソッドを提供します。

    • デフォルト メソッドがインターフェイスで定義されており、同じ名前と同じパラメータを持つメソッドが別のインターフェイスでも定義されている場合 (このメソッドがデフォルト メソッドであるかどうかは関係ありません) 、クラスの実装中にこれら 2 つのインターフェイスを実装すると、インターフェイスの競合が発生します。解決策: 競合を解決するには、実装クラスはインターフェイス内の同じ名前とパラメーターを持つメソッドをオーバーライドする必要があります。

    • デフォルトのメソッドがインターフェイスで定義されており、同じ名前とパラメータを持つ非抽象メソッドも親クラスで定義されている場合、サブクラスはこのメソッドをオーバーライドしません。を使用しない場合、親クラス内の同じ名前と同じパラメーターを持つメソッドがデフォルトで呼び出され、競合の問題は発生しません。現時点では、クラス優先原則を遵守しているためです。同じ名前とパラメータを持つインターフェイス内のデフォルトのメソッドは無視されます。

    • 親クラスでオーバーライドされたメソッドを呼び出す方法、またはサブクラス (または実装クラス) のメソッドでインターフェイスを呼び出す方法は?

    コードのデモ1:

    public void myMethod(){
    		method3();//调用自己定义的重写的方法
    		super.method3();//调用的是父类中声明的
    		//调用接口中的默认方法
    		CompareA.super.method3();
    		CompareB.super.method3();
    	}
    ログイン後にコピー

    コードのデモ 2:

    interface Filial {// 孝顺的
    	default void help() {
    		System.out.println("老妈,我来救你了");
    	}
    }
    interface Spoony {// 痴情的
    	default void help() {
    		System.out.println("媳妇,别怕,我来了");
    	}
    }
    class Father{
    	public void help(){
    		System.out.println("儿子,就我媳妇!");
    	}
    }
    class Man extends Father implements Filial, Spoony {
    	@Override
    	public void help() {
    		System.out.println("我该就谁呢?");
    		Filial.super.help();
    		Spoony.super.help();
    	}	
    }
    ログイン後にコピー

    コンストラクターはインターフェイス内で定義できません。これは、インターフェイスをインスタンス化できないことを意味します。

    インターフェイスは多重継承メカニズムを採用しています。複数のインターフェースを実装して、Java の単一継承の制限を補うことができます。

    形式: class AA extends BBimplements CC,DD,EE;

    Java 開発では、インターフェイスはクラス (implements) 方式で実装されます。使用します。

    • 実装クラスがインターフェイス内のすべての抽象メソッドをカバーする場合、この実装クラスをインスタンス化できます。

    • 実装クラスがインターフェイス内のすべての抽象メソッドをカバーしていない場合でも、実装クラスは抽象クラスのままです。

    コードのデモ:

    /*
    实现类SubAdapter必须给出接口SubInterface以及父接口MyInterface
    中所有方法的实现。否则,SubAdapter仍需声明为abstract的。
    */
    interface MyInterface{
        String s=“MyInterface”;
        public void absM1();
        }
    interface SubInterface extends MyInterface{
        public void absM2();
        }
    public class SubAdapter implements SubInterface{
        public void absM1(){System.out.println(“absM1”);}
        public void absM2(){System.out.println(“absM2”);}
    }
    ログイン後にコピー

    インターフェイスは相互に継承でき、複数の継承も可能です。

    クラスは複数の無関係なインターフェイスを実装できます。

    コードのデモ:

    interface Runner { public void run();}
    interface Swimmer {public double swim();}
    class Creator{public int eat(){…}} 
    class Man extends Creator implements Runner ,Swimmer{
        public void run() {……}
        public double swim() {……}
        public int eat() {……}
    }
    ログイン後にコピー

    継承関係と同様に、インターフェイスと実装クラスの間にはポリモーフィズムがあります

    コードのデモ:

    public class Test{
      public static void main(String args[]){
        Test t = new Test();
        Man m = new Man();
        t.m1(m);
        t.m2(m);
        t.m3(m);
      }
      public String m1(Runner f) { f.run(); }
      public void m2(Swimmer s) {s.swim();}
      public void m3(Creator a) {a.eat();}
    }
    ログイン後にコピー

    匿名性インターフェイス実装クラス匿名オブジェクト

    コードのデモ:

    public class USBTest {
    	public static void main(String[] args) {
    		Computer com = new Computer();
    		//1.创建了接口的非匿名实现类的非匿名对象
    		Flash flash = new Flash();
    		com.transferData(flash);
    		//2. 创建了接口的非匿名实现类的匿名对象
    		com.transferData(new Printer());
    		//3. 创建了接口的匿名实现类的非匿名对象
    		USB phone = new USB(){
    			@Override
    			public void start() {
    				System.out.println("手机开始工作");
    			}
    			@Override
    			public void stop() {
    				System.out.println("手机结束工作");
    			}			
    		};
    		com.transferData(phone);
    		//4. 创建了接口的匿名实现类的匿名对象
    		com.transferData(new USB(){
    			@Override
    			public void start() {
    				System.out.println("mp3开始工作");
    			}
    			@Override
    			public void stop() {
    				System.out.println("mp3结束工作");
    			}
    		});
    	}
    }
    class Computer{	
    	public void transferData(USB usb){//USB usb = new Flash();
    		usb.start();		
    		System.out.println("具体传输数据的细节");		
    		usb.stop();
    	}		
    }
    interface USB{
    	//常量:定义了长、宽、最大最小的传输速度等	
    	void start();	
    	void stop();	
    }
    class Flash implements USB{
    	@Override
    	public void start() {
    		System.out.println("U盘开启工作");
    	}
    	@Override
    	public void stop() {
    		System.out.println("U盘结束工作");
    	}	
    }
    class Printer implements USB{
    	@Override
    	public void start() {
    		System.out.println("打印机开启工作");
    	}
    	@Override
    	public void stop() {
    		System.out.println("打印机结束工作");
    	}	
    }
    ログイン後にコピー

    4. アプリケーション プロキシ モード (Proxy)

    1. アプリケーション シナリオ

    • SecurityProxy: 実際のロールへの直接アクセスをブロックします。

    • リモート プロキシ: プロキシ クラスを通じてリモート メソッド呼び出し (RMI) を処理します。

    • 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象,比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时,不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。

    2. 分类

    • 静态代理(静态定义代理类)

    • 动态代理(动态生成代理类)

    3. 代码演示

    //举例一:
    interface Network {
        public void browse();
        }
    // 被代理类
    class RealServer implements Network { @Override
        public void browse() {
        System.out.println("真实服务器上
        网浏览信息");
        } 
    }
    // 代理类
    class ProxyServer implements Network {
        private Network network;
        public ProxyServer(Network network) {
        this.network = network; }
        public void check() {
        System.out.println("检查网络连接等操作");
    }
        public void browse() {
        check();
        network.browse();
        } 
    }
    public class ProxyDemo {
        public static void main(String[] args) {
        Network net = new ProxyServer(new
        RealServer());
        net.browse();
        } 
    }
    //举例二:
    public class StaticProxyTest {
    	public static void main(String[] args) {
    		Proxy s = new Proxy(new RealStar());
    		s.confer();
    		s.signContract();
    		s.bookTicket();
    		s.sing();
    		s.collectMoney();
    	}
    }
    interface Star {
    	void confer();// 面谈
    	void signContract();// 签合同
    	void bookTicket();// 订票
    	void sing();// 唱歌
    	void collectMoney();// 收钱
    }
    //被代理类
    class RealStar implements Star {
    	public void confer() {
    	}
    	public void signContract() {
    	}
    	public void bookTicket() {
    	}
    	public void sing() {
    		System.out.println("明星:歌唱~~~");
    	}
    	public void collectMoney() {
    	}
    }
    //代理类
    class Proxy implements Star {
    	private Star real;
    	public Proxy(Star real) {
    		this.real = real;
    	}
    	public void confer() {
    		System.out.println("经纪人面谈");
    	}
    	public void signContract() {
    		System.out.println("经纪人签合同");
    	}
    	public void bookTicket() {
    		System.out.println("经纪人订票");
    	}
    	public void sing() {
    		real.sing();
    	}
    	public void collectMoney() {
    		System.out.println("经纪人收钱");
    	}
    }
    ログイン後にコピー

    五、接口和抽象类之间的对比

    No.区别点抽象类接口
    1定义包含抽象方法的类主要是抽象方法和全局常量的集合
    2组成构造方法、抽象方法、普通方法、常量、变量常量、抽象方法、(jdk8.0:默认方法、静态方法)
    3使用子类继承抽象类(extends)子类实现接口(implements)
    4关系抽象类可以实现多个接口接口不能继承抽象类,但允许继承多个接口
    5常见设计模式模板方法简单工厂、工厂方法、代理模式
    6对象都通过对象的多态性产生实例化对象都通过对象的多态性产生实例化对象
    7局限抽象类有单继承的局限接口没有此局限
    8实际作为一个模板是作为一个标准或是表示一种能力
    9选择如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限

    六、经典题目(排错)

    //题目一:
    interface A {
        int x = 0;
        }
    class B {
        int x = 1;
        }
    class C extends B implements A {
        public void pX() {
        System.out.println(x);
        }
    public static void main(String[] args) {
        new C().pX();
        } 
    }
    //题目二:
    interface Playable {
        void play();
        }
    interface Bounceable {
        void play();
    }
    interface Rollable extends Playable, Bounceable {
        Ball ball = new Ball("PingPang");
    }
    class Ball implements Rollable {
        private String name;
        public String getName() {
        return name; 
        }
        public Ball(String name) {
        this.name = name; 
        }
        public void play() {
        ball = new Ball("Football");
        System.out.println(ball.getName());
        } 
    }
    ログイン後にコピー

    以上がJavaインターフェースを定義して使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

    ホット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衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

    Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

    Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

    Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

    Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

    Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

    ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

    Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

    Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

    Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

    Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

    この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

    Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

    Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

    Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

    Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

    See all articles