インターフェース
これは、抽象クラスの特別な種類として理解することができます。interfaceキーワードは、インターフェイスを定義して使用してください。
抽象クラス:機能を備えたものです。
インターフェース:それは余分な機能を持っているものです。
それらの間の選択は、インターフェースは抽象クラス、親クラスの機能を達成するためのメンバ関数を持っている場合、唯一の関数定義関数は、サブクラスを持つことができますがあり、お勧めしますが、実装されていません。
インタフェースの利点:
- コードの再利用性を向上させます。
- デカップリング。
- カスタムプログラミング仕様。
- マルチインタフェースの実装。
前jdk1.7ではと:
属性:使用のpublic static finalのpublic static定数変更。
変更は書くことはできませんが、デフォルトがあります。
例えば:のpublic static final int型のA = 5;
とは= 5 int型;同じです。
方法:パブリック抽象パブリック抽象メソッドの変更。
変更は書くことはできませんが、デフォルトがあります。
例えば:パブリック抽象無効笑を() ;
及び笑を(int型);それは抽象的です。
注意:
- インタフェースは、インスタンス化することはできません。
- インターフェースはキーワード道具を使用して、インターフェイスを実装、実装する必要があり、(多くの継承のような)インタフェース機能を持つようにインターフェイスを実装しています。
- インタフェース使用した:
1)特定のカテゴリ:このインターフェイス+新しい需要のすべての抽象メソッドを書き換える必要があり、インターフェイスを実装しています。
2)抽象クラスの実装は、抽象特徴+書き換え可能な部分は、必要に応じて添加しました。 - クラスでは唯一のインタフェースが継承することができない、インターフェイスを実装することができますが、唯一のクラスを継承できるクラスは、クラスA、単一継承クラス、インターフェイスなどを実装するクラスを達成することはできません。
- 継承することができないインタフェースと実装クラスは、インターフェイスのみを実装することができないインタフェースを継承することができるインタフェースは、インタフェースは、複数の継承インターフェイスとすることができます。
- 相続後の最初のクラスを実現。
jdk1.8の新機能:
- 静的メソッドは、
使用します。インターフェイスは、名前だけで呼び出すことができます - デフォルトの方法で
使用することは:唯一のオブジェクトクラスを実装することにより、使用します
一般的なデザインパターン
シングルトン:クラスのみのインスタンスを構築することができます保証。
空腹中国風:あなたは、クラスのインスタンス最初にロードされる作成-スレッドセーフ
怠惰なタイプ:インスタンスを作成する関数の最初の呼び出し-スレッドセーフな、高効率の
実装手順:
- コンストラクタの民営化
- プライベート静的クラスを参照
- パブリック静的アクセス方法
//饿汉式单例
public class Single {
//2.私有的静态的该类的引用
private static Single single=new Single();
//1.构造器私有化
private Single(){ //不允许随意再外部创建对象
}
//3.公共的静态的访问方式
public static Single newInstance(){
return single;
}
//懒汉式单例
public class SingleTon {
//2.私有的静态的该类的引用
private static SingleTon single=null;
//1.私有构造
private SingleTon(){}
//3.公共静态的访问方式
//A B C
/*public static SingleTon newInstance(){
//A B C
if(single==null){
// A B C
single=new SingleTon();
}
return single;
}*/
//锁方法
/*public synchronized static SingleTon newInstance(){
//A B C
if(single==null){
// A B C
single=new SingleTon();
}
return single;
}*/
//锁代码块
public static SingleTon newInstance(){
//A B C
synchronized (SingleTon.class) {
if(single==null){
// A B C
single=new SingleTon();
}
}
return single;
}
}
public class Test {//测试类
public static void main(String[] args) {
Single single1=Single.newInstance();
Single single2=Single.newInstance();
System.out.println(single1==single2); //true
SingleTon s1=SingleTon.newInstance();
SingleTon s2=SingleTon.newInstance();
System.out.println(s1==s2); //true
}
}
静的プロキシモード
- 本当の役割:プロジェクトマネージャー
- 演技の役割:時間
- エージェントの行動
プロキシモードの特徴:
1。本当の役割とエージェントの役割が同じインターフェイスを実装|親
2.エージェントの役割は、真の文字参照を保持
3.エージェントの行動を
public class StaticProxy {
public static void main(String[] args) {
UserManager UserManager=new UserManager();
Hr hr=new Hr(UserManager);
hr.addUser();
}
}
//相同的接口
interface AddUser{
void addUser();
}
//真实角色:项目经理
class UserManager implements AddUser{
@Override
public void addUser() {
System.out.println("项目经理录用人");
}
}
//代理角色:hr
class Hr implements AddUser{
//代理角色持有真实角色的引用
private UserManager manager;
public Hr() {
// TODO Auto-generated constructor stub
}
public Hr(UserManager manager) {
super();
this.manager = manager;
}
@Override
public void addUser() {
System.out.println("------筛选简历---------");
System.out.println("------通知面试---------");
manager.addUser();
System.out.println("---------------------");
}
}
シンプル工場パターン
抽象製品の役割:特定の製品の役割のインタフェースを実装|親クラスを継承します。
public class Factory {
public static void main(String[] args) {
//接口多态 接口指向不同的实现类
Car car=factory("BMW");
car.run();
}
//工厂
public static Car factory(String type){
Car car=null;
if("Mes".equals(type)){ //比较字符串的内容使用equals方法
car=new Mes();
}else{
car=new BMW();
}
return car;
}
}
//抽象产品角色
interface Car{
void run();
}
//具体产品角色
class BMW implements Car{
@Override
public void run() {
System.out.println("坐在..哭");
}
}
class Mes implements Car{
@Override
public void run() {
System.out.println("坐在引擎盖上哭...");
}
}