この記事は上記の続きです:java - オブジェクト指向の詳細な入門 (2)
11. インターフェイス
はじめに: 抽象クラスは、複数のクラスから抽象化されたテンプレートです。この抽象化をより完全に実装したい場合は、特別な「抽象クラス」→インターフェースを使用する必要があります。
例:
私たちが日常で耳にする USB インターフェイスは、実際に目にするスロットではなく、それらのスロットが従う仕様です。私たちが目にするスロットは、USB 仕様に従って設計された単なるインスタンスです。 、これは、スロットが USB のインスタンスであることを意味します。
は、USB デバイスのさまざまなモデルに対応しており、それぞれの USB スロットは従う必要がある仕様があります。この仕様に準拠すると、デバイスが確実に動作するようになります。スロットに挿入された USB スロットはマザーボードと正常に通信できます;
同じモデルのマザーボード上の複数の USB スロットのデータ交換方法は同じです。実装内容が同じであれば、異なるものと見なすことができます。
私の要約:
インターフェイスは、クラスが従うべき仕様を定義するだけであり、これらのクラスの内部データやその内部の実装の詳細については考慮しません。そのメソッド。
インターフェイスは、これらのクラスで提供する必要があるメソッドのみを規定するため、仕様と実装が分離されます。システムの拡張性と保守性が向上します。
インターフェイスを使用する利点拡張性や保守性が優れているため、開発ではインターフェースを使用することがよくあります (標準を定義することに相当します)
インターフェース定義
インターフェースは、何を規定するかを規定する仕様を定義します。クラスは行う必要がありますが、その方法は問題ではありません。
##[修飾子] インターフェイス インターフェイス名は、親インターフェイス 1、親インターフェイス 2 を拡張します....構築メソッドはありませんインスタンス化できません。#インターフェイスはクラスではなくインターフェイスのみを継承できます。
インターフェイスには通常のメソッドはなく、メソッドはすべて抽象です。
デフォルトの修飾子インターフェイス内のメソッドのは public abstract です;
インターフェイス内のフィールドはすべてグローバル定数であり、デフォルトの修飾子は public static Final です;
インターフェイス内のメンバーには (主に最初の 2 つ):
グローバル定数
パブリック抽象メソッド
内部クラス (内部クラス、内部インターフェイス、内部列挙クラスを含む);
私の要約:
インターフェイスにはコンストラクターがないため、インスタンス化できません。
インターフェース内のすべてのメソッドは抽象です。通常のメソッドはありません。これらにはデフォルトの修飾子 public abstract があり、オーバーライドする必要があります。
12. インターフェースの使用形式:
public class SubImpl extends Superimplements IA,IBインターフェースは継承可能複数のソースから継承できますが、継承できるのはインターフェイスのみであり、クラスは継承できません。
実装インターフェース (複数の実装をサポート)
[修飾子] クラス クラス名はインターフェース 1、インターフェース 2 を実装します...
インターフェースの実装は extends の後にある必要があります。
インターフェイスを実装するメソッドはパブリック型である必要があります
##インターフェイスとクラスの間の関係: 実装関係または継承関係。クラスであると言えます インターフェイスのメソッドを実装すると、クラスはインターフェイスのメソッドを継承するとも言えますが、状況によって理解が異なります。13. インターフェイス指向プログラミングのための標準とシンプルなファクトリ モデルの確立
標準を設定し、他の人がそれを実装または満足できるようにしましょう。
Eg: interface USB{//定义USB标准 void useUSB();//USB有使用USB的行为 }シンプルな工場パターン工場を構築し、そこで生産し、直接使用する 私の要約: 利点: シールドさまざまなサブクラスの実装により、コードのスケーラビリティと保守性が向上します;
package reviewDemo; //简单工厂模式 interface Phone{//制定标准,都要实现send()方法 public void send(); } class Iphone implements Phone{ @Override public void send() { System.out.println("Iphone手机在发短信"); } } class AndroidPhone implements Phone{ @Override public void send() { System.out.println("AndroidPhone手机在发短信"); } } class MyPhone implements Phone{ @Override public void send() { System.out.println("MyPhone手机在发短信"); } } class Factory{ public static void show(String type){//传入参数,根据不同的类型个性化定制 if(type.equals("")){//为空的情况,不用往下执行 System.out.println("对不起,类型为空!,请重新输入!"); return; } Phone p = null; if("Iphone".equals(type)){//判断类型 p = new Iphone(); }else if("AndroidPhone".equals(type)){ p = new AndroidPhone(); }else{ p = new MyPhone(); } p.send(); } } public class FactoryDemo17 { public static void main(String[] args) { new Factory().show("Iphone");//调用方法 new Factory().show("AndroidPhone"); new Factory().show("MyPhone"); new Factory().show("YourPhone"); new Factory().show(""); } }出力:Iphone がテキスト メッセージを送信していますAndroidPhone がテキスト メッセージを送信しています MyPhone がテキスト メッセージを送信していますMyPhone がテキスト メッセージを送信しています申し訳ありませんが、タイプが空です。
14、面向接口编程之适配器模式
使用一个现成的类,但是它的接口不完全符合你的需求,我只想要它其中的一个方法,不想覆写其他的方法。
比如,窗体有变大,变小,关闭的行为,但是我现在只需要关闭行为;
package reviewDemo; //适配器模式:只想用其中的某一个方法,用适配器作为中间的过渡 interface Windows{ void max(); void min(); void close(); } //适配器模式,实现接口所有的方法,但是不写方法体! class AdapterWindows implements Windows{ @Override public void max() { } @Override public void min() { } @Override public void close() { } } class MyWindows extends AdapterWindows{ //覆写父类的方法 public void close(){ System.out.println("这个实现的是关闭功能!"); } } public class Demo17 { public static void main(String[] args) { new MyWindows().close(); } }
接口和抽象类的比较
相同点:
都位于继承的顶端,用于被其他实现或继承;
都不能实例化;
都包含抽象方法,其子类都必须覆写这些抽象方法;
区别:
抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;接口只能包含抽象方法;
一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
二者的选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
总结:接口不能有构造函数,抽象类是可以有构造函数的,
abstract可以定义构造函数(包括带函数的构造函数),因为要保证其子类在创建的时候能够进行正确的初始化,但是Abstract类不能被实例化。
知识点:如果不可以或者没有创建对象,那么我们必须加上static修饰,不能用对象调用,就只好用类去调用。
16、匿名内部类
适合只使用一次的类
不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。
匿名内部类不能定义构造器,因为匿名内部类没有类名。
格式: new 父类构造器([实参列表]) 或 接口() { //匿名内部类的类体部分 }
17、枚举类
使用enum声明,默认直接继承了java.lang.Enum类,而不是Object类;
枚举类的对象是固定的,实例个数有限,不可以再new( ),枚举对象后可以跟()。
枚举元素必须位于枚举类体中的最开始部分,枚举元素后要有分号与其他成员分隔。
枚举类的构造方法的权限修饰符默认是private;
一旦枚举对象后面加上{},那么该对象实际是枚举匿名内部类对象;
所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;
所有枚举类都提供一个静态的valueOf(String name)方法, 返回枚举类中对象名等于 name的对象。
Eg:public enum Color{ RED(), GREEN(){}, BLUE{}; } package reviewDemo; //枚举 enum Color{ Green,Blue,Yellow; @Override public String toString() { String ret = super.toString(); switch (this) { case Green: ret = "绿色"; break; case Blue: ret = "蓝色"; break; case Yellow: ret = "黄色"; break; default: break; } return ret; } } class Personp{ Color c = Color.Blue; void show(){ System.out.println(c); } } public class Demo18 { public static void main(String[] args) { Color []color = Color.values(); for (Color c : color) { System.out.println(c); } new Personp().show(); } }
输出:
绿色
蓝色
黄色
蓝色
枚举类覆写接口抽象方法的两种方式:
在枚举类中实现接口的抽象方法;
在枚举匿名内部类中实现接口的抽象方法;
interface I{ void show(); } enum Color implements I{ RED(){ public void show(){ } }, GREEN{ public void show(){ } }, BLUE{ public void show(){ } }; } enum Color implements I{ RED(), GREEN, BLUE; public void show() { } }
总结:枚举不可以new();即便是反射也不可以!
备注:一个类如果没有构造方法,那么一定有相对应的某个方法可以获取对象!
以上がオブジェクト指向について書きたいことのすべてです、もし間違っているところがあれば修正してください。ありがとう!
その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください: JAVA ビデオ チュートリアル
以上がJava - オブジェクト指向の詳細な入門 (3)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。