11_Java面向對象_第11天(介面、多態)_講義

来源:https://www.cnblogs.com/wanghui1234/archive/2018/08/26/9536270.html
-Advertisement-
Play Games

今日內容介紹 1、介面 2、多態 01介面的概念 A:介面的概念 介面是功能的集合,同樣可看做是一種數據類型,是比抽象類更為抽象的”類”。 介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的 實現類(相當於介面的子類)來完成。這樣將功能的定義與實現分離,優化了程式設計。 請記住:一切事物 ...


今日內容介紹
1、介面
2、多態

01介面的概念

* A:介面的概念
    介面是功能的集合,同樣可看做是一種數據類型,是比抽象類更為抽象的”類”。
    介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的
    實現類(相當於介面的子類)來完成。這樣將功能的定義與實現分離,優化了程式設計。
    請記住:一切事物均有功能,即一切事物均有介面。

02介面的定義

  • A: 介面的定義
  •   與定義類的class不同,介面定義時需要使用interface關鍵字。
      定義介面所在的仍為.java文件,雖然聲明時使用的為interface關鍵字的編譯後
      仍然會產生.class文件。這點可以讓我們將介面看做是一種只包含了功能聲明的特殊類。
  • B : 定義格式
  •   public interface 介面名 {
          抽象方法1;
          抽象方法2;
          抽象方法3;
      }
  • C: 定義步驟
  •   使用interface代替了原來的class,其他步驟與定義類相同:
      介面中的方法均為公共訪問的抽象方法
      介面中無法定義普通的成員變數

03介面的實現類

  • A: 類與介面的關係
  •   類與介面的關係為實現關係,即類實現介面。實現的動作類似繼承,只是關鍵字不同,實現使用implements。
      其他類(實現類)實現介面後,就相當於聲明:”我應該具備這個介面中的功能”。實現類仍然需要重寫方法以實現具體的功能。
  • B: 類實現介面的格式
  •   class 類 implements 介面 {
          重寫介面中方法
      } 
  • C:註意事項
  •   在類實現介面後,該類就會將介面中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。
      介面中定義功能,當需要具有該功能時,可以讓類實現該介面,只聲明瞭應該具備該方法,是功能的聲明。
      在具體實現類中重寫方法,實現功能,是方法的具體實現。

04介面中成員變數的特點

  • A:成員變數特點
    • a 介面中可以定義變數,但是變數必須有固定的修飾符修飾,public static final 所以介面中的變數也稱之為常量,其值不能改變。後面我們會講解static與final關鍵字
  • B:案例
  •   interface Demo { ///定義一個名稱為Demo的介面。
          public static final int NUM = 3;// NUM的值不能改變
      }

05介面中成員方法的特點

  • A: 成員方法特點

    • a 介面中可以定義方法,方法也有固定的修飾符,public abstract
    • b 子類必須覆蓋掉介面中所有的抽象方法後,子類才可以實例化。否則子類是一個抽象類。
  • B: 案例
  •   interface Demo { ///定義一個名稱為Demo的介面。
          public abstract void show1();
          public abstract void show2();
      }
    
      //定義子類去覆蓋介面中的方法。類與介面之間的關係是 實現。通過 關鍵字 implements
      class DemoImpl implements Demo { //子類實現Demo介面。
          //重寫介面中的方法。
          public void show1(){}
          public void show2(){}
      }

06實現類還是一個抽象類

A: 介面的實現類
   一個類如果實現類介面,有兩種操作方法:
   第一:實現類是非抽象類,就需要重寫介面中所有的抽象方法.
   第二:實現類也聲明為抽象類,那麼實現類可以不重寫介面中的抽象方法。

07類和介面的多實現

  • A:介面的多實現
    瞭解了介面的特點後,那麼想想為什麼要定義介面,使用抽象類描述也沒有問題,介面到底有啥用呢?
    介面最重要的體現:解決多繼承的弊端。將多繼承這種機制在java中通過多實現完成了。

  • B 多實現的優點
    • 怎麼解決多繼承的弊端呢?
    • 弊端:多繼承時,當多個父類中有相同功能時,子類調用會產生不確定性。
    • 其實核心原因就是在於多繼承父類中功能有主體,而導致調用運行時,不確定運行哪個主體內容。
    • 為什麼多實現能解決了呢?
    • 因為介面中的功能都沒有方法體,由子類來明確。
  • C :案例演示

      interface Fu2{
          void show2();
      }
      class Zi implements Fu1,Fu2 {    // 多實現。同時實現多個介面。
          public void show1(){}
          public void show2(){}
      }

08類在繼承類的同時實現多介面

  • A: 繼承的同時實現介面
    • 介面和類之間可以通過實現產生關係,同時也學習了類與類之間可以通過繼承產生關係。當一個類已經繼承了一個父類,它又需要擴展額外的功能,這時介面就派上用場了。
    • 子類通過繼承父類擴展功能,通過繼承擴展的功能都是子類應該具備的基礎功能。如果子類想要繼續擴展其他類中的功能呢?這時通過實現介面來完成。
    • 介面的出現避免了單繼承的局限性。父類中定義的事物的基本功能。介面中定義的事物的擴展功能。
  • B: 代碼演示
  •   class Fu {
          public void show(){}
      }
      interface Inter {
          pulbic abstract void show1();
      }
      class Zi extends Fu implements Inter {
          public void show1() {
          }
      }
    
      介面的出現避免了單繼承的局限性。父類中定義的事物的基本功能。介面中定義的事物的擴展功能。

09介面的多繼承

  • A: 介面的多繼承
    • 學習類的時候,知道類與類之間可以通過繼承產生關係,介面和類之間
    • 可以通過實現產生關係,那麼介面與介面之間會有什麼關係。
    • 多個介面之間可以使用extends進行繼承。
  • B 代碼演示
    interface Fu1{
    void show();
    }
    interface Fu2{
    void show1();
    }
    interface Fu3{
    void show2();
    }
    interface Zi extends Fu1,Fu2,Fu3{
    void show3();
    }

      在開發中如果多個介面中存在相同方法,這時若有個類實現了這些介面,那麼就要實現接
      口中的方法,由於介面中的方法是抽象方法,子類實現後也不會發生調用的不確定性。

10介面思想

  • A:介面的思想
    • 前面學習了介面的代碼體現,現在來學習介面的思想,接下里從生活中的例子進行說明。
    • 舉例:我們都知道電腦上留有很多個插口,而這些插口可以插入相應的設備,這些設備為什麼能插在上面呢?
    • 主要原因是這些設備在生產的時候符合了這個插口的使用規則,否則將無法插入介面中,更無法使用。發現這個插口的出現讓我們使用更多的設備。
  • B: 介面的好處
    • 總結:介面在開發中的它好處
    • 1、介面的出現擴展了功能。
    • 2、介面其實就是暴漏出來的規則。
    • 3、介面的出現降低了耦合性,即設備與設備之間實現瞭解耦。

    • 介面的出現方便後期使用和維護,一方是在使用介面(如電腦),一方在實現介面(插在插口上的設備)。例如:筆記本使用這個規則(介面),電腦外圍設備實現這個規則(介面)。

11介面和抽象類的區別

  • A: 明白了介面思想和介面的用法後,介面和抽象類的區別是什麼呢?介面在生活體現也基本掌握,那在程式中介面是如何體現的呢?
    通過實例進行分析和代碼演示抽象類和介面的用法。
  • B: 舉例:
    • 犬:
      行為:
      吼叫;
      吃飯;
    • 緝毒犬:
      行為:
      吼叫;
      吃飯;
      緝毒;
  • C:思考:
    • 由於犬分為很多種類,他們吼叫和吃飯的方式不一樣,在描述的時候不能具體化,也就是吼叫和吃飯的行為不能明確。
    • 當描述行為時,行為的具體動作不能明確,這時,可以將這個行為寫為抽象行為,那麼這個類也就是抽象類。
    • 可是當緝毒犬有其他額外功能時,而這個功能並不在這個事物的體系中。這時可以讓緝毒犬具備犬科自身特點的同時也有其他額外功能,可以將這個額外功能定義介面中。
  • D: 代碼演示
  •   interface 緝毒{
          public abstract void 緝毒();
      }
      //定義犬科的這個提醒的共性功能
      abstract class 犬科{
      public abstract void 吃飯();
      public abstract void 吼叫();
      }
      // 緝毒犬屬於犬科一種,讓其繼承犬科,獲取的犬科的特性,
      //由於緝毒犬具有緝毒功能,那麼它只要實現緝毒介面即可,這樣即保證緝毒犬具備犬科的特性,也擁有了緝毒的功能
      class 緝毒犬 extends 犬科 implements 緝毒{
    
          public void 緝毒() {
          }
          void 吃飯() {
          }
          void 吼叫() {
          }
      }
      class 緝毒豬 implements 緝毒{
          public void 緝毒() {
          }
      }
  • E: 介面和抽象類區別總結
  •   相同點:
          都位於繼承的頂端,用於被其他類實現或繼承;
          都不能直接實例化對象;
          都包含抽象方法,其子類都必須覆寫這些抽象方法;
      區別:
          抽象類為部分方法提供實現,避免子類重覆實現這些方法,提高代碼重用性;介面只能包含抽象方法;
          一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個介面;(介面彌補了Java的單繼承)
          抽象類是這個事物中應該具備的你內容, 繼承體系是一種 is..a關係
          介面是這個事物中的額外內容,繼承體系是一種 like..a關係
    
      二者的選用:
          優先選用介面,儘量少用抽象類;
          需要定義子類的行為,又要為子類提供共性功能時才選用抽象類;

12多態概述

  • A: 多態概述
  • 多態是繼封裝、繼承之後,面向對象的第三大特性。

    現實事物經常會體現出多種形態,如學生,學生是人的一種,則一個具體的同學張三既是學生也是人,即出現兩種形態。

    Java作為面向對象的語言,同樣可以描述一個事物的多種形態。如Student類繼承了Person類,一個Student的對象便既是Student,又是Person。

    Java中多態的代碼體現在一個子類對象(實現類對象)既可以給這個子類(實現類對象)引用變數賦值,又可以給這個子類(實現類對象)的父類(介面)變數賦值。

    如Student類可以為Person類的子類。那麼一個Student對象既可以賦值給一個Student類型的引用,也可以賦值給一個Person類型的引用。

    最終多態體現為父類引用變數可以指向子類對象。

    多態的前提是必須有子父類關係或者類實現介面關係,否則無法完成多態。

    在使用多態後的父類引用變數調用方法時,會調用子類重寫後的方法。

13多態調用的三種格式

  • A:多態的定義格式:

    • 就是父類的引用變數指向子類對象
    • 父類類型 變數名 = new 子類類型();
      變數名.方法名();
  • B: 普通類多態定義的格式
  •   父類 變數名 = new 子類();
      舉例: 
          class Fu {}
          class Zi extends Fu {}
          //類的多態使用
          Fu f = new Zi();
  • C: 抽象類多態定義格式
  •       抽象類 變數名 = new 抽象類子類();
          舉例: 
          abstract class Fu {
                   public abstract void method();
                   }
          class Zi extends Fu {
          public void method(){
                        System.out.println(“重寫父類抽象方法”);
          }
          }
          //類的多態使用
          Fu fu= new Zi();
  • D: 介面多態定義的格式
  •       介面 變數名 = new 介面實現類();
          如: interface Fu {
                       public abstract void method();
          }
          class Zi implements Fu {
                       public void method(){
                        System.out.println(“重寫介面抽象方法”);
          }
          }
          //介面的多態使用
          Fu fu = new Zi();
  • E: 註意事項
    •   同一個父類的方法會被不同的子類重寫。在調用方法時,調用的為各個子類重寫後的方法。
        如 Person p1 = new Student();
           Person p2 = new Teacher();
           p1.work(); //p1會調用Student類中重寫的work方法
           p2.work(); //p2會調用Teacher類中重寫的work方法
        當變數名指向不同的子類對象時,由於每個子類重寫父類方法的內容不同,所以會調用不同的方法。

14多態成員方法的特點

  • A: 掌握了多態的基本使用後,那麼多態出現後類的成員有啥變化呢?前面學習繼承時,我們知道子父類之間成員變數有了自己的特定變化,
    • 那麼當多態出現後,成員變數在使用上有沒有變化呢?
    • 多態出現後會導致子父類中的成員變數有微弱的變化
  • B: 代碼演示
  •   class Fu {
          int num = 4;
      }
      class Zi extends Fu {
          int num = 5;
      }
      class Demo {
          public static void main(String[] args)  {
              Fu f = new Zi();
              System.out.println(f.num);
              Zi z = new Zi();
              System.out.println(z.num);
          }
      }
  • C: 多態成員變數
    • 當子父類中出現同名的成員變數時,多態調用該變數時:

      編譯時期:參考的是引用型變數所屬的類中是否有被調用的成員變數。沒有,編譯失敗。

      運行時期:也是調用引用型變數所屬的類中的成員變數。

      簡單記:編譯和運行都參考等號的左邊。編譯運行看左邊。

  • D: 多態出現後會導致子父類中的成員方法有微弱的變化。看如下代碼
  •   class Fu {
          int num = 4;
          void show() {
              System.out.println("Fu show num");
          }
      }
      class Zi extends Fu {
          int num = 5;
          void show() {
              System.out.println("Zi show num");
          }
      }
      class Demo {
          public static void main(String[] args)  {
              Fu f = new Zi();
              f.show();
          }
      }
  • E: 多態成員方法
    • 編譯時期:參考引用變數所屬的類,如果沒有類中沒有調用的方法,編譯失敗。

      運行時期:參考引用變數所指的對象所屬的類,並運行對象所屬類中的成員方法。

      簡而言之:編譯看左邊,運行看右邊。

15instanceof關鍵字

  • A: 作用
    可以通過instanceof關鍵字來判斷某個對象是否屬於某種數據類型。如學生的對象屬於學生類,學生的對象也屬於人類

  • 格式:
    boolean b = 對象 instanceof 數據類型;

  • 舉例:
  •   Person p1 = new Student(); // 前提條件,學生類已經繼承了人類
      boolean flag = p1 instanceof Student; //flag結果為true
      boolean flag2 = p2 instanceof Teacher; //flag結果為false

16多態-向上轉型

* A: 多態的轉型分為向上轉型與向下轉型兩種:
    
* B: 向上轉型:當有子類對象賦值給一個父類引用時,便是向上轉型,多態本身就是向上轉型的過程。
* 
    使用格式:
    父類類型  變數名 = new 子類類型();
    如:Person p = new Student();

17多態-向下轉型

* A: 向下轉型:一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用轉為子
* 類引用,這個過程是向下轉型。如果是直接創建父類對象,是無法向下轉型的!
* 
    使用格式:
    子類類型 變數名 = (子類類型) 父類類型的變數;
    如:Student stu = (Student) p;  //變數p 實際上指向Student對象
    

18多態的好處和弊端

* A: 多態的好處和弊端
    * 當父類的引用指向子類對象時,就發生了向上轉型,即把子類類型對象轉成了父類類型。
      向上轉型的好處是隱藏了子類類型,提高了代碼的擴展性。
    * 但向上轉型也有弊端,只能使用父類共性的內容,而無法使用子類特有功能,功能有限制。
    
* B: 看如下代碼
    //描述動物類,並抽取共性eat方法
    abstract class Animal {
        abstract void eat();
    }
     
    // 描述狗類,繼承動物類,重寫eat方法,增加lookHome方法
    class Dog extends Animal {
        void eat() {
            System.out.println("啃骨頭");
        }
    
        void lookHome() {
            System.out.println("看家");
        }
    }
    
    // 描述貓類,繼承動物類,重寫eat方法,增加catchMouse方法
    class Cat extends Animal {
        void eat() {
            System.out.println("吃魚");
        }
    
        void catchMouse() {
            System.out.println("抓老鼠");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Animal a = new Dog(); //多態形式,創建一個狗對象
            a.eat(); // 調用對象中的方法,會執行狗類中的eat方法
            // a.lookHome();//使用Dog類特有的方法,需要向下轉型,不能直接使用
            
            // 為了使用狗類的lookHome方法,需要向下轉型
    // 向下轉型過程中,可能會發生類型轉換的錯誤,即ClassCastException異常
            // 那麼,在轉之前需要做健壯性判斷 
            if( !a instanceof Dog){ // 判斷當前對象是否是Dog類型
                    System.out.println("類型不匹配,不能轉換"); 
                    return; 
            } 
            Dog d = (Dog) a; //向下轉型
            d.lookHome();//調用狗類的lookHome方法
        }
    }


* C 多態總結:
    什麼時候使用向上轉型:
        當不需要面對子類類型時,通過提高擴展性,或者使用父類的功能就能完成相應的操作,
        這時就可以使用向上轉型。
        如:Animal a = new Dog();
            a.eat();
    什麼時候使用向下轉型
        當要使用子類特有功能時,就需要使用向下轉型。
            如:Dog d = (Dog) a; //向下轉型
                d.lookHome();//調用狗類的lookHome方法
            向下轉型的好處:可以使用子類特有功能。
            弊端是:需要面對具體的子類對象;在向下轉型時容易發生
        ClassCastException類型轉換異常。在轉換之前必須做類型判斷。
        如:if( !a instanceof Dog){…}

19多態舉例

 * A: 畢老師和畢姥爺的故事
 * 案例:
  /*
    描述畢老師和畢姥爺,
    畢老師擁有講課和看電影功能
    畢姥爺擁有講課和釣魚功能
  */
    class 畢姥爺 {
        void 講課() {
            System.out.println("政治");
        }
    
        void 釣魚() {
            System.out.println("釣魚");
        }
    }
    
    // 畢老師繼承了畢姥爺,就有擁有了畢姥爺的講課和釣魚的功能,
    // 但畢老師和畢姥爺的講課內容不一樣,因此畢老師要覆蓋畢姥爺的講課功能
    class 畢老師 extends 畢姥爺 {
        void 講課() {
            System.out.println("Java");
        }
    
        void 看電影() {
            System.out.println("看電影");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            // 多態形式
            畢姥爺 a = new 畢老師(); // 向上轉型
            a.講課(); // 這裡表象是畢姥爺,其實真正講課的仍然是畢老師,因此調用的也是畢老師的講課功能
            a.釣魚(); // 這裡表象是畢姥爺,但對象其實是畢老師,而畢老師繼承了畢姥爺,即畢老師也具有釣魚功能
    
            // 當要調用畢老師特有的看電影功能時,就必須進行類型轉換
            畢老師 b = (畢老師) a; // 向下轉型
            b.看電影();
        }
    

20筆記本電腦案例

  • A:案例介紹
    • 定義USB介面(具備開啟功能、關閉功能),筆記本要使用USB設備,即筆記本在生產時需要預留可以插入USB設備的USB介面,即就是筆記本具備使用USB設備的功能,
    • 但具體是什麼USB設備,筆記本並不關心,只要符合USB規格的設備都可以。滑鼠和鍵盤要想能在電腦上使用,那麼滑鼠和鍵盤也必須遵守USB規範,不然滑鼠和鍵盤的生產出來無法使用
    • 進行描述筆記本類,實現筆記本使用USB滑鼠、USB鍵盤
      USB介面,包含開啟功能、關閉功能
      筆記本類,包含運行功能、關機功能、使用USB設備功能
      滑鼠類,要符合USB介面
      鍵盤類,要符合USB介面
  • B: 案例分析
    • 階段一:
      使用筆記本,筆記本有運行功能,需要筆記本對象來運行這個功能
    • 階段二:
      想使用一個滑鼠,又有一個功能使用滑鼠,並多了一個滑鼠對象。
    • 階段三:
      還想使用一個鍵盤 ,又要多一個功能和一個對象
    • 問題:每多一個功能就需要在筆記本對象中定義一個方法,不爽,程式擴展性極差。
      降低滑鼠、鍵盤等外圍設備和筆記本電腦的耦合性。

21筆記本電腦案例代碼實現

 * A: 代碼實現
    定義滑鼠、鍵盤,筆記本三者之間應該遵守的規則
    interface USB {
        void open();// 開啟功能
    
        void close();// 關閉功能
    }
    
        滑鼠實現USB規則
    class Mouse implements USB {
        public void open() {
            System.out.println("滑鼠開啟");
        }
    
        public void close() {
            System.out.println("滑鼠關閉");
        }
    }
    
        鍵盤實現USB規則
    class KeyBoard implements USB {
        public void open() {
            System.out.println("鍵盤開啟");
        }
    
        public void close() {
            System.out.println("鍵盤關閉");
        }
    }
    
        定義筆記本
    class NoteBook {
        // 筆記本開啟運行功能
        public void run() {
            System.out.println("筆記本運行");
        }
    
        // 筆記本使用usb設備,這時當筆記本對象調用這個功能時,必須給其傳遞一個符合USB規則的USB設備
        public void useUSB(USB usb) {
            // 判斷是否有USB設備
            if (usb != null) {
                usb.open();
                usb.close();
            }
        }
    
        public void shutDown() {
            System.out.println("筆記本關閉");
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            // 創建筆記本實體對象
            NoteBook nb = new NoteBook();
            // 筆記本開啟
            nb.run();
    
            // 創建滑鼠實體對象
            Mouse m = new Mouse();
            // 筆記本使用滑鼠
            nb.useUSB(m);
    
            // 創建鍵盤實體對象
            KeyBoard kb = new KeyBoard();
            // 筆記本使用鍵盤
            nb.useUSB(kb);
    
            // 筆記本關閉
            nb.shutDown();
        }
    }

作業測試

1、多態是什麼,多態的前提條件是什麼?

2、多態中成員訪問的特點分別是什麼?
成員變數
成員方法(非靜態方法)
靜態方法

3、什麼是介面,它的特點是什麼?

4、介面的成員特點有哪些?

5、抽象類和介面的區別是什麼?

6:定義一個父類Animal eat方法 , 定義兩個子類 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;並且 重寫eat方法
測試類中寫一個方法,參數列表有一個參數Animla類型,
要求: 調用該方法分別傳遞Dog對象 和Cat 對象, 使用instanceof進行將轉後調用eat,和他們的特有方法

7.測試: 如果一個方法的返回值類型是父類,那麼能否返回一個子類對象.(該父類不管是類,抽象類還是介面)

8.現有兩種 OldPhone NewPhone; 兩個類都有call() sendMessage() 方法(考慮向上抽取一個父類);

    已知介面IPlay中有一個方法 playGame(),NewPhone添加玩游戲的功能;
要求: 分別測試OldPhone和NewPhone的兩個方法,再測試新手機palyGame()的方法.

9 .(完成下麵的汽車案例)

描述:汽車都具有跑的功能,普通的奧迪車也不例外,但是高端的奧迪車除了具有跑的功能外,還具有自動泊車和無人駕駛的功能!
需求:定義普通奧迪車,高端奧迪車,實現描述中的功能並測試

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 會員登錄在我們的好多項目中都有用到,比如在後臺管理系統,它的第一步就需要你進行登錄,還有在我們常見的京東、淘寶、網易雲音樂等一系列的軟體上面都需要進行登錄。 下麵我們直接上代碼 現在我們可以看到,我使用的post方法向伺服器端發送數據,當請求成功的時候,我們暫時把它存儲在本地,這裡也可以結合redu ...
  • 一,實現拼圖的搭建: <div class="box"> <table id="table1" class="mytable"> <tr> <td id="1"><img src="Files/01.gif" /></td> <td id="2"><img src="Files/02.gif" /> ...
  • 1、jQuery中的prop()和attr()的區別 prop()是在jQuery1.6版本之後才有的,在之前一直都是使用attr(), prop()修複了attr()的一些小bug。 2、推薦用法: prop() :在HTML元素固有屬性的時候用prop() attr() : 推薦在HTML非固有 ...
  • 這是設計模式的最後一篇,最近事還是挺多,自己的東西還是沒進步。其實我這個人不用和領導套近乎,我有自己的職業素養,工匠精神。我喜歡獨處,喜歡自由,也喜歡女人,我訂婚後也很幸福。 今年我31周歲了,現在不是回想以前的時候,但是還是我應該努力的時候,不停的上進,堅持最後一定會成功!最怕傻逼式的堅持! 朋友 ...
  • 概述 面向消息的中間件(message-oriented middleware 簡稱 MOM)支持在分散式系統之間發送和接收消息的軟體或硬體基礎橋梁。MOM允許應用程式模塊分佈在各個平臺上,並減少了跨多個操作系統和網路協議的開發應用程式的複雜性。中間件創建了一個分散式通信層,將應用程式開發人員與各種 ...
  • 1、自定義類型的定義及使用 2、自定義類的記憶體圖 3、ArrayList集合的基本功能 4、隨機點名器案例及庫存案例代碼優化 ...
  • Asp.Net MVC EF之一:使用Database類在EF框架中執行Sql語句 ...
  • Flask簡介 Flask是用 Python 語言基於 Werkzeug 工具箱編寫的輕量級Web開發框架。 其 WSGI 工具箱採用 Werkzeug(路由模塊),模板引擎則使用 Jinja2。這兩個也是 Flask 框架的核心。 搭建虛擬環境(Ubuntu) 一、安裝虛擬環境命令: 二、創建虛擬 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...