接口\設計模式\內部類的初步瞭解

接口

能夠理解爲特殊的抽象類java

關鍵字interface -->接口安全

接口的優勢

  1. 接口是功能體的集合ide

  2. 是一個引用數據類型函數

  3. 可以解耦測試

  4. 規定開發規範this

jdk在1.7以前

屬性:atom

必須是公共的靜態的常量 public static finalspa

public staic final 能夠選擇性省略(默認)線程

方法:必須是公共的抽象的方法設計

public abstract 返回值類型 方法名();

public absract 能夠選擇性省略

注意:

  1. 接口的實現與類的繼承很是像,可是不同在:

    1. 子類繼承父類就能夠直接使用父類的內容

    2. 實現類實現接口,也擁有接口中的能力,可是須要實現列本身去實現這個功能

    3. 接口實現的關鍵字是implement,繼承的關鍵字是extends

  2. 類只能單繼承,接口能夠多實現,一個類須要繼承父類後實現接口.

    1. 若是先接口後繼承,會形成系統沒法判斷接口的個數.

  3. 接口也不能實例化

  4. 接口的使用只能經過類去實現接口

    1. 具體的實現類:重寫了全部的抽象方法+按需新增

    2. 抽象類的實現:按需重寫了抽象方法+按需新增,具體的子類才能使用

      1. 在抽象類中,能夠所有實現,也能夠部分實現

       
       
       
       
       
       
       
      //抽象實現類
      abstract class Demo02 implements InterfaceDemo02{
      // @Override
      // public void demo2() {
      //  // TODO Auto-generated method stub
      //
      // }
       
                 
      }
       
  5. 繼承和實現的幾種狀況

    1. 接口和接口之間是能夠繼承的

    2. 類和接口之間只能實現

    3. 接口之間能夠多繼承

    4. 類和接口之間能夠多實現

 
 
 
 
 
 
 
//定義一個接口InterfaceDemo02
interface InterfaceDemo02{
 public void demo1();
}
//定義一個接口InterfaceDemo03
interface InterfaceDemo03{
 public void demo2();
}
//定義一個接口InterfaceDemo04 並繼承InterfaceDemo02及InterfaceDemo03
interface InterfaceDemo04 extends InterfaceDemo02,InterfaceDemo03{
}
 

實現了接口

 
 
 
 
 
 
 
public class Demo implements InterfaceDemo02, InterfaceDemo03 {//與只實現InterfaceDemo04做用相同
 @Override
 public void demo2() {
  System.out.println("實現了接口02");
 }
 @Override
 public void demo1() {
  System.err.println("實現了接口03");
 }
}
 

jdk1.8中新增的內容

在接口中能夠定義方法體的方法

  1. 默認方法:default關鍵字修飾(必須是顯式的)

    1. 使用:經過實現類使用

  2. 靜態方法

    1. 使用:接口名使用

 
 
 
 
 
 
 
public interface InterfaceDemo05 {
    //默認方法
 public default void moren(){
  System.out.println("我是默認方法");
 }
    //靜態方法
 public static  void test(){
  System.out.println("我是靜態方法");
 }
}
//實現類
class Impl implements InterfaceDemo05{
}
 

測試

 
 
 
 
 
 
 
public class Test {
 public static void main(String[] args) {
        //默認方法經過類實現
  Impl i=new Impl();
  i.moren();
        //靜態方法經過接口名.方法調用
        InterfaceDemo05.test();
 }
}
 

設計模型

單例模式

保證一個類只能有一個對象,這個特色形式的類成爲單例模式,可是不影響類中原有功能.

實現

  1. 構造器私有化

  2. 私有的 靜態的該類引用,存儲建立惟一的對象

  3. 公共的 靜態方法方式

兩種方式

餓漢式

當第一次調用的時候才建立這個實例 ---線程不安全,效率較高

示例

 
 
 
 
 
 
 
//餓漢式
public class SingTon {
//1.構造器私有化
 private SingTon(){
 }
//2.私有的,靜態的該類的引用,存儲建立惟一的對象
 //在類的第一次加載時候,建立一個惟一的實例
 private static SingTon single=new SingTon();
//3.公共的 靜態的方法方式
//返回值:當前數據類型 參數:沒有
 private static SingTon newInstance(){
  //將當前建立的實例返回出去
  return single;
 }
}
 

懶漢式

在類的第一次加載完成以後,就建立這個實例 ---線程安全,效率較低

示例

 
 
 
 
 
 
 
//懶漢式
public class Single {
 //1.私有的構造函數
 private Single(){
 }
 //2.私有的 靜態的 該類的引用,存儲建立惟一的對象
 //先建立一個對象的默認參數爲null
 private static Single single=null;
 //3.公共的靜態的該類的引用
 public static Single newInstance(){
  //先判斷實例是否是爲空,若是爲空則新建
  //若是不爲空則返回上一次對象的地址
  if(single==null){
   Single single=new Single();
  }
   return single;
  }
}
 

代理模式

靜態代理:

  1. 真實角色和代理角色實現相同的接口|繼承相同的父類

  2. 代理角色持有真實角色的引用:成員屬性進行維護

  3. 代理行爲

注意:減小與真實角色的交流,下降耦合度,起到功能的擴展,方便後期維護

 
 
 
 
 
 
 
/*經理要經過人事招人,至關於 技術部經理 找了 人事當代理
真實角色:經理
代理:人事  
行爲:招人(人事和經理都須要實現)
代理模式就是把真實角色做爲代理角色的一個成員變量
*/
public class StaticProxy {
 public static void main(String[] args) {
 
       
 }
}
//經理
class Manager implements Hiring{
 @Override
 public void hiring() {
  System.out.println("我是經理,我要招人");
 }
}
//人事
class Hr implements Hiring{
 Manager manager;
 //徹底能夠經過構造函數把真實角色引入到這個代理角色中
 public Hr(Manager manager) {
  super();
  this.manager = manager;
 }
 @Override
 public void hiring() {
 
       
  System.out.println("我是人事,我要初試");
  //重頭戲 把真實角色當成代理模式的一個成員
  this.manager.hiring();
  System.out.println("成功錄取");
 }
}
//行爲:招人
interface Hiring{
 void hiring();
}
//測試
class Test{
 public static void main(String[] args) {
  Manager m=new Manager();
  Hr h=new Hr(m);
  h.hiring();
 }
}
 

工廠模式

 
 
 
 
 
 
 
/*
 *需求:咱們直接從工廠拿車,若是是兩輪輸出兩輪
 *  四輪輸出四輪 
 * 
 */
public class Factory {
 public static void main(String[] args) {
  Car two=new TwoCar();
  Car four=new FourCar();
  Factory f=new Factory();
  two.make();
  f.factory(two);
  two.run();
  four.make();
  f.factory(four);
  four.run();
 
       
 
       
 
       
 
       
 }
 /*
 有一家工廠能夠造兩個輪子也能夠造四個輪子
 一工廠是能夠生產車的,這個是一個功能(方法)
 結果:肯定這個是方法
 二工廠是能夠生產不一樣的車的,能夠建立不一樣的對象
 結果:肯定方法體的內容
 三工廠不管生產哪一種類型的車都是車,因此返回值必定是車
 結果:肯定返回值類型
 四工廠生產車,須要給輸入值
 結果:肯定參數
 */
 //看傳入的是不是 TwoCar或ForCar的一個實例
 public static Car factory(Car srt){
  if(srt instanceof TwoCar){
   System.out.println("在造兩輪");
  }
  if(srt instanceof FourCar){
   System.out.println("在造四輪");
  }
   return srt;
 }
}
interface Car{
 void make();
 void run();
}
class TwoCar implements Car{
 @Override
 public void make() {
  System.out.println("我是造兩輪的模板");
 }
 @Override
 public void run() {
  System.out.println("烏龜");
 }
 
       
}
class FourCar implements Car{
 @Override
 public void make() {
  System.out.println("我是造四輪的模板");
 }
 @Override
 public void run() {
  System.out.println("飛同樣的感受");
 }
}
 

內部類

  1. 成員內部類

  2. 靜態內部類

  3. 私有內部類

  4. 局部內部類

  5. 匿名內部類

成員內部類

當內部類做爲外部類的成員,就是成員內部類

外部成員----------內部類

特色:

  1. 是成員就具備成員的特色,就是可使用成員修飾符修飾

  2. 是類就有類的特色,能夠繼承及實現

  3. 內部類可使用外部列的內容,包括私有的

  4. 在外部類中能夠經過內部類的對象使用其成員

  5. 成員內部類中不能定義靜態內容除了靜態常量

私有內部類

  1. 私有內部類可使用外部類中的私有內容

  2. 外部類中可使用私有內部了中的私有內容,須要經過內部類對象使用

  3. 私有的內部類中只能在外部類中使用,其餘類中沒法使用

靜態內部類

  1. 只有靜態內部類中能夠定義靜態的內容,除了靜態的內容

  2. 靜態內部類中使用外部類中的成員,經過外部類對象使用,由於內部類是靜態

局部內部類

  1. 方法中的內部列

  2. 不能使用成員修飾符 public static(final能夠)

  3. 局部只能在它當前定義的方法中使用,經過對象使用

  4. 若是想要在局部內部類中使用當前方法的參數,這個參數必須被final修飾,在jdk1.8中final能夠省略,可是默認

匿名內部類

  1. 匿名內部類

  2. 匿名對象的內部類

  3. 方法的參數

相關文章
相關標籤/搜索