3.5インタフェースのインタフェース
①時々そのプロパティとメソッドをすべて継承サブクラス内で複数のクラスから派生する必要があります。しかし、Javaは多重継承をサポートしていません。インターフェースを使用すると、多重継承の効果を得ることができます。
②インタフェース(インタフェース)が一定値と抽象メソッドのセットによって定義されます。
③本質的に、インターフェースは、抽象クラスが達成変数とメソッドせず定数とメソッドを含ん定義特別な抽象クラスです。
3.5.1インタフェースの基本的な文法:
インタフェースは、クラスが同等とみなすことができ、また、参照型です。
①インターフェース、構文を定義する方法:
[修飾]インターフェースインターフェース名} {
定数、抽象メソッド:②インタフェースが表示されます。
インターフェイスのすべてのメンバ変数は、デフォルトのpublic static final変更によるものです。
すべてのインターフェイスメソッドは、変更既定のパブリック抽象的です。
③実際には、インタフェースは特別な抽象クラスであり、特別なインタフェースは完全に抽象的です。
④インターフェースのコンストラクタにはありませんし、インスタンス化することはできません。
⑤インターフェースとインターフェースとの間の多重継承することができます。
⑥クラスは、複数のインターフェースを実装することができます。(ここでは「実現は、」「継承」と同等と見なすことができます)
⑦非抽象クラスが実装インタフェース、インタフェースは、インスタンス化する前に、すべてのメソッド「を実施/書き換え/カバレッジを」必要になります。それ以外の場合は、クラスがまだ抽象的です。
実装されていないすべてのインタフェースのメソッドは、抽象クラスとして定義されなければならない場合⑧クラスは、インターフェイスを実装します
⑨主な目的は、インタフェースの実装クラスの実装であることです。(指向プログラミングインタフェース)
同様の継承、インターフェースと実装クラス間の多型。
Javaクラスの構文定義:書き込みへの最初の実装を書いた後、拡張
パブリックインターフェースA { // 定数(でなければならないのpublic static final 変更) public static final文字列SUCCESS = "成功"; public static finalダブルPI = 3.14; MAX_VALUE = 127バイト; // 定数//パブリック静的決勝を省略することができます。 // 抽象メソッド(すべての抽象インタフェースメソッドは抽象パブリック) 公共の抽象無効M1(); M2ボイド(); //パブリック抽象を省略することができます。 } インターフェースB { 空M1(); } インターフェースC { 空平方メートル(); } インターフェースD { 空立方メートル(); } インターフェイスEは、B、C、Dを{延び 空M4(); } //実装は、キーワードの意味を実現します。 //実装と同じ意味を拡張します。 クラスMyClassの実装B、C { 公共ボイドM1(){} 公共ボイドM2(){} } クラスF実装E { 公共ボイドM1(){} 公共ボイドM2(){} 公共ボイドM3(){} 公共ボイドM4(){} } |
3.5.2インタフェースの役割
①は、プロジェクト階層、すべての層が配向しているインタフェースの開発にする開発効率を向上させることができます。
②インタフェースは、コード間の結合度を可能にし、コードがあると、マザーボードとメモリとの間の関係として、減少する「取り外し可能」。あなたは自由に切り替えることができます。
③インターフェースと特定の機能を完了することが抽象クラス、優先選択インターフェース。インターフェイスは、より多くの多重継承を実現することができるので。そして、実装インタフェース、そのクラスに加えて、あなたも(クラスの継承を維持するために)他のクラスから継承するに行くことができます。
举例1:
public interface CustomerService{
//定义一个退出系统的方法 void logout();
} |
/* 编写接口的实现类. 该类的编写完全是面向接口去实现的。 */ public class CustomerServiceImpl implements CustomerService{ //对接口中的抽象方法进行实现。 public void logout(){ System.out.println("成功退出系统!"); } } |
public class Test{ //入口 public static void main(String[] args){ //要执行CustomerServiceImpl中的logout方法.
//以下程序面向接口去调用 CustomerService cs = new CustomerServiceImpl(); //多态 //调用 cs.logout(); } } |
举例2:
/* 汽车和发动机之间的接口。
生产汽车的厂家面向接口生产。 生产发动机的厂家面向接口生产。 */ public interface Engine{
//所有的发动机都可以启动. void start(); } |
//生产汽车 public class Car{
//Field //引擎 //面向接口编程 Engine e;
//Constructor Car(Engine e){ this.e = e; }
//汽车应该能够测试引擎 public void testEngine(){ e.start();//面向接口调用 } } |
public class YAMAHA implements Engine{ public void start(){ System.out.println("YAMAHA启动"); } } |
public class HONDA implements Engine{ public void start(){ System.out.println("HONDA启动"); } } |
public class Test{
public static void main(String[] args){
//1.生产引擎 YAMAHA e1 = new YAMAHA();
//2.生产汽车 Car c = new Car(e1);
//3.测试引擎 c.testEngine();
//换HONDA c.e = new HONDA();
c.testEngine(); } } |
3.5.3接口的应用:工厂方法(FactoryMethod)& 代理模式(Proxy)
①工厂方法(FactoryMethod)
概述:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
适用性:
1)当一个类不知道它所必须创建的对象的类的时候
2)当一个类希望由它的子类来指定它所创建的对象的时候
3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
工厂方法举例:
总结:
FactoryMethod模式是设计模式中应用最为广泛的模式,在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。FactoryMethod解决的就是这个问题,它通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。
//接口的应用:工厂方法的设计模式
public class TestFactoryMethod { public static void main(String[] args) { IWorkFactory i = new StudentWorkFactory(); i.getWork().doWork();
IWorkFactory i1 = new TeacherWorkFactory(); i1.getWork().doWork(); } }
interface IWorkFactory{ Work getWork(); } |
class StudentWorkFactory implements IWorkFactory{
@Override public Work getWork() { return new StudentWork(); }
} class TeacherWorkFactory implements IWorkFactory{
@Override public Work getWork() { return new TeacherWork(); }
}
interface Work{ void doWork(); } class StudentWork implements Work{ @Override public void doWork() { System.out.println("学生写作业"); } } class TeacherWork implements Work{ @Override public void doWork() { System.out.println("老师批改作业"); } } |
②代理模式(Proxy)
概述:
为其他对象提供一种代理以控制对这个对象的访问。
interface Object{ void action(); } class ProxyObject implements Object{ Object obj; public void action(){ System.out.println("代理开始"); obj.action(); System.out.println("代理结束"); } public ProxyObject(){ System.out.println("这是代理类"); obj = new ObjectImpl(); } } class ObjectImpl implements Object{ public void action(){ System.out.println("======"); System.out.println("======"); System.out.println("被代理的类"); System.out.println("======"); System.out.println("======"); } } public class Test2 { public static void main(String[] args) { Object ob = new ProxyObject(); ob.action(); } } |
//接口的应用:代理模式(静态代理)
public class TestProxy { public static void main(String[] args) { Object obj = new ProxyObject(); obj.action(); } } interface Object{ void action(); } //代理类 class ProxyObject implements Object{ Object obj; public ProxyObject(){ System.out.println("代理类创建成功"); obj = new ObjctImpl(); } public void action(){ System.out.println("代理类开始执行"); obj.action(); System.out.println("代理类执行结束"); } } //被代理类 class ObjctImpl implements Object{ @Override public void action() { System.out.println("=====被代理类开始执行======"); System.out.println("=====具体的操作======"); System.out.println("=====被代理类执行完毕======"); } } |