/ *
- 使用できるインターフェイス(インターフェイス)の
- 図1は、{}インターフェイスを定義するインターフェイス名インターフェイスフォーマットを使用して、インタフェースが主な目的は、実装クラスを達成することです。(指向プログラミングインタフェース)
- 図2に示すように、Javaクラスの構造でインターフェースと並置され、
- 図3に示すように、インターフェース部材内部
- JDK7 3.1および以前のバージョンのみグローバル定数及び抽象メソッドを定義することができるインターフェース
-
グローバル定数:のpublic static final変数の型変数名=値;デフォルトのpublic static定数ので、書き込みフロント省略することができます
- あなたは、インターフェイス名を使用することができます。モード変数名はグローバル定数と呼ばれています。
-
抽象メソッド:パブリック抽象メソッド名();書き込みの前に省略することができます
- JDK8 3.2およびそれ以降のバージョンでは、インターフェースは、静的メソッド及びデフォルトメソッド内で定義することができます。
- 4、インターフェイス、コンストラクタを持っていないことができ、インスタンス化できません
- 図5に示すように、インターフェースの実装クラス(実装)で使用される必要があります
- 5.1抽象クラスの実装にインタフェースのすべてのメソッドを実装する場合、実装クラスをインスタンス化されます。
- 5.2何のオーバーライドすべての抽象メソッドが存在しない場合は、実装クラスは、まだ抽象クラスをインスタンス化することができません
- 図6は、Java実装クラスが偽装機能を達成するために、複数のインタフェース、多重継承を実装することができます。
- クラス名、クラス実装の形式インタフェース名、インタフェース名2、...} {
- あなたが親クラスを持っている場合は、最初のクラスに父親の書き込みを継承している実装インタフェース
- フォーマットは、クラス名を実装するためのインタフェース名、インタフェース名2クラスの親クラスの名前を拡張し、...} {
- 複数のインターフェースを実装するすべての抽象メソッドのクラスの必要性をインスタンス化することができます。
- メソッドのサブクラスを実装し、抽象親クラスのインタフェースを実現もはや、継承することはできません
- 7、インターフェイスとインターフェイスとの間の単一の継承はまた、多重継承することができ
- 2 1インタフェースインタフェース名の形式は、インタフェース名、インタフェース3の名前を、...} {延び
- インターフェイスの継承とのインタフェースを実装するための実装クラスのニーズインタフェース他のすべての抽象メソッドのみをインスタンス化することができます。
- インタフェースは、メソッドが唯一のメソッドを実装するクラスの必要性を達成するために、同じパラメータを同じ名前を持つ継承されました。
- 図8に示すように、インターフェースは、抽象クラスまたはインタフェース、受信パラメータで定義することができ、特定の多型のメソッドパラメータを使用して具現化することができます
- 抽象クラスのインターフェイスクラスまたはサブクラスのオブジェクトを実装するオブジェクトが渡されました。
- 9、インターフェースは一連のルールによって定義された仕様として理解することができ、それが現実世界を反映している。「あなたは/したい場合は...その後、
- ...できなければなりません「の考え方。継承は」缶「の関係「のインターフェースであるが、関係」ではありません。
- 抽象クラスインターフェースの実装クラスに似10は、匿名のまたは匿名オブジェクトであってもよいです。抽象クラスと同じ形式。
- 11、アプリケーションインタフェース:プロキシモード
- アプリケーションシナリオ:
*Ø1、セキュリティエージェント:への直接アクセスが本当の役割をシールド。 - 図2に示すように、リモートエージェント:呼び出し(RMI)遠隔処理方法プロキシクラス
- 3、遅延ロード:ロードに軽量プロキシオブジェクト本当に例えば実際のオブジェクトをロードする必要があり、あなたがソフトウェアを見て大きな文書を開発したいです、
- 大きな画像での大きな文書は、100メガバイトのファイルを開くときに、プロキシを使用することができますので、不可能では、すべての画像が表示されて入れて、そこにある絵があるかもしれない、があります
- あなたは大きな画像を開くにはプロキシを使用して、写真を見る必要があるモード。
- 分類
- 1、帯電防止剤(静的に定義されたプロキシクラス)
- 2、動的プロキシ(動的に生成されたプロキシクラス)JDK自身の動的プロキシは、知識反射を必要とします
- 12、抽象クラスとインタフェースの間の類似点と相違点:
- 同じポイント:使用するためには、インスタンス化することはできません継承することができ、抽象メソッドをそこに持っていることができ、あなたは後に、サブクラスのオーバーライドを持っている必要があります
- 違い:
- 定義1:抽象クラスであったクラス抽象メソッドで、インターフェイスは、主にグローバル定数及び抽象メソッドのコレクションです
- 組成物2:抽象クラスのコンストラクタを持つことができ、抽象メソッド、通常の方法で、定数、変数。インターフェイスは、グローバル定数、抽象メソッド、(jdk8.0デフォルトの方法、静的メソッドを増加)であってもよいです
- 使用3:サブクラス(延び)、サブクラス実装インターフェース(実装)抽象クラスを継承
- 4の関係:抽象クラスは複数のインタフェースを実装することができ、インターフェイスは、抽象クラスを継承するが、継承された複数のインタフェースを可能にすることができません
- 5つの一般的なデザインパターン:抽象クラスは、テンプレート方式で、インターフェイスはシンプル工場、ファクトリメソッド、プロキシモードであり、
- 6つの目的:オブジェクト多型を生成することによってインスタンス化されるすべてのオブジェクト
- 図7は、制限:抽象クラスは、この制限を持たない単一のインタフェースの制約を継承します
- 8実用:テンプレートとして抽象クラスは、インターフェイスは、標準または能力として表現されます
- 抽象クラスとインタフェースは、単一継承の制限を回避するために、インタフェースの優先順位を使用して、使用することができる場合
- 開発では、頻繁に参照クラスが良いクラスが達成された継承しようとしますが、抽象クラスを継承するか、インターフェイスを実装のいずれかされていません。
* /
package object_chapter2;
import javax.management.RuntimeErrorException;
public class Object_Interface {
public static void main(String[] args) {
System.out.println(A.MAX_SPEED);//可以通过接口名.属性名的方式调用接口中的全局常量
D d = new D();
d.method();
new E().method();
new E().method(10);
new E().out();
//非匿名实现类非匿名对象调用
USB m = new MP3();//多态性
Computer c = new Computer();
c.connect(m);
//非匿名实现类匿名对象调用
c.connect(new Camera());
//匿名实现类非匿名对象调用
USB u = new USB() {
@Override
public void transferDate() {
// TODO Auto-generated method stub
System.out.println("手机传输文件");
}
@Override
public void charge() {
// TODO Auto-generated method stub
System.out.println("手机充电中");
}
};
c.connect(u);
//匿名实现类匿名对象调用
c.connect(new USB() {
@Override
public void transferDate() {
// TODO Auto-generated method stub
System.out.println("移动硬盘传输电影");
}
@Override
public void charge() {
// TODO Auto-generated method stub
System.out.println("移动硬盘供电中");
}});
//测试代理模式
Designer design = new Customer();
Designer company = new Company(design);
company.CAD();
//测试比较类实现比较接口抽象方法
CompareableCamera c1 = new CompareableCamera(3.2,8);
CompareableCamera c2 = new CompareableCamera(3.3,7);
System.out.println(c1.compareTo(c2));
System.out.println(c2.compareTo(c1));
System.out.println(c2.compareTo(d));
System.out.println(c1.compareToWeight(c2));
System.out.println(c2.compareToWeight(c1));
}
}
interface A{
public static final int MAX_SPEED = 120;
public abstract void method();
}
interface B{
int MIN_SPEED = 80;
void method(int n);
}
interface C extends A,B{
E e = new E();
int MID_SPEED = 100;
void method();
}
class D implements A{
int MAX_SPEED = 160;
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("我是谁");
}
}
class E extends D implements C{
// @Override
// public void method() {
// // TODO Auto-generated method stub
// System.out.println("我在哪里");
// }
@Override
public void method(int n) {
// TODO Auto-generated method stub
System.out.println("我要干什么");
System.out.println(Math.sqrt(n));
}
void out() {
// e = new E();//e为全局常量,不能修改
// System.out.println(MAX_SPEED);//因为重名,编译不通过
System.out.println(super.MAX_SPEED);//调取父类的MAX_SPEED方式
System.out.println(A.MAX_SPEED);//调取接口的MAX_SPEED方式
}
}
class Computer{
public void connect(USB u) {
u.transferDate();
u.charge();
}
}
interface USB{
void transferDate();
void charge();
}
class MP3 implements USB{
@Override
public void transferDate() {
// TODO Auto-generated method stub
System.out.println("传输音乐");
}
@Override
public void charge() {
// TODO Auto-generated method stub
System.out.println("MP3充电中");
}
}
class Camera implements USB{
private double f;
Integer weight;
public Camera(double f, Integer weight) {
super();
this.f = f;
this.weight = weight;
}
public Camera() {
super();
}
public double getF() {
return f;
}
public void setF(double f) {
this.f = f;
}
@Override
public void transferDate() {
// TODO Auto-generated method stub
System.out.println("传输照片");
}
@Override
public void charge() {
// TODO Auto-generated method stub
System.out.println("相机充电中");
}
}
//代理模式
interface Designer{
void CAD();
}
class Customer implements Designer{
@Override
public void CAD() {
// TODO Auto-generated method stub
System.out.println("得到设计图纸");
}
}
class Company implements Designer{
private Designer d;
Company(Designer d){
this.d = d;
}
void professionalDesign() {
System.out.println("专业人员精心设计");
}
@Override
public void CAD() {
// TODO Auto-generated method stub
professionalDesign();
d.CAD();
}
}
//创建比较接口
interface CompareObject{
int compareTo(Object o);
}
//创建比较接口的实现类,比较Camera类的对象。
class CompareableCamera extends Camera implements CompareObject{
public CompareableCamera() {
super();
// TODO Auto-generated constructor stub
}
public CompareableCamera(double f, Integer weight) {
super(f, weight);
// TODO Auto-generated constructor stub
}
@Override
public int compareTo(Object o) {
if(this == o) {
return 0;
}
if(o instanceof Camera) {
Camera cam = (Camera)o;
if(this.getF() > cam.getF()) {
return 1;
}else if(this.getF() < cam.getF()) {
return -1;
}else {
return 0;
}
// return new Double(this.getF()).compareTo(new Double(cam.getF()));//可以将数据转换为包装类,直接调取包装类的比较方法
}else {
throw new RuntimeException("数据类型错误");
}
}
public int compareToWeight(Object o) {
if(this == o) {
return 0;
}
if(o instanceof Camera) {
Camera cam = (Camera)o;
return this.weight.compareTo(cam.weight); //对于包装类可以直接调取包装类中的比较方法
}else {
throw new RuntimeException("数据类型错误");
}
}
}