【JAVA】十三、基礎知識“接口”精細講解!(二)(新手友好版~)

? ? ? ? 哈嘍大家好呀qvq,這里是乎里陳,接口這一知識點博主分為三篇博客為大家進行講解,今天為大家講解第二篇java中實現多個接口,接口間的繼承,抽象類和接口的區別知識點,更適合新手寶寶們閱讀~更多內容持續更新中~

目錄

1. 實現多個接口

完整代碼講解

?2. 接口間的繼承

完整代碼講解

3. 抽象類和接口的區別

定義方式上不同

繼承/實現方式不同

區別表格



1. 實現多個接口

? ? ? ? 在Java中,接口(Interface)定義了一組抽象方法,用于規范類的行為。類和類之間是單繼承的,一個類只能由一個父類,即java不支持類的多重繼承,但是一個類可以實現多個接口,從而擴展類的功能;這種機制使得Java可以實現類似多重繼承的效果。

? ? ? ? 比如說:

  • 一個?Bird 類可以同時實現 Flyable 和 Run 這兩個接口。

  • 一個 Smartphone 類可以同時實現 Callable(可打電話),Playable(可播放音樂)和 Photographable(可拍照)三個接口。

? ? ? ? 像這樣實現多個接口的話,我們可以更靈活地設計程序,避免單繼承的限制,可以讓類具備更多的功能~

首先,我們初步定義了一個狗狗類🐶繼承動物類:

//建立一個動物抽象類:
//1.用abstract修飾,表示這是一個抽象類,不能直接創建實例
//2.包含了所有動物共有的屬性和方法
public abstract class Animal {//公共屬性名字和年齡(所有動物和植物都有的)public String name;public int age;//抽象方法:吃東西//1.用abstract修飾,沒有具體的實現//2.所有的子類必須實現這個方法public abstract void eat();//動物類的構造方法public Animal(String name,int age) {this.name = name;this.age = age;}
}
//定義了一個狗狗類
//1.繼承自動物類(extends Animal)
//2.必須實現父類的抽象方法eat()
public class Dog extends Animal{//狗狗的構造方法public Dog(String name, int age) {//通過super調用父類的構造方法初始化name和agesuper(name, age);}//實現父類的eat()方法@Override//表示重寫public void eat() {System.out.println(name+"吃狗糧啦~");}
}

? ? ? ? 寫完上面代碼后,我們知道狗狗不僅會游泳,也會跑步,則可以讓這個狗狗類實現游泳接口和跑步接口(前提是定義了游泳和跑步的接口):

?定義的三個接口,狗狗只能實現里面的兩個:

public interface Flyable {void fly();
}
public interface Running {void run();
}
public interface Swimming {void swim();
}
  • extends Animal?表示繼承Animal類

  • implements Running, Swimming 表示實現兩個接口,后面可通過逗號再添加幾個狗狗能實現的接口

// Dog通過extends繼承Animal并且通過implemens實現了Running和Swimming接口
public class Dog extends Animal implements Running,Swimming{...
}

在實現接口后,我們必須還要實現Running和Swimming接口里面的方法:

// Dog通過extends繼承Animal并且通過implemens實現了Running和Swimming接口
public class Dog extends Animal implements Running,Swimming{//狗狗的構造方法public Dog(String name, int age) {//通過super調用父類的構造方法初始化name和agesuper(name, age);}//實現父類的eat()方法@Override//表示重寫public void eat() {System.out.println(name+"吃狗糧啦~");}//實現Running接口的run()方法@Overridepublic void run() {System.out.println(name+"正在飛跑~");}//實現Swimming接口的swim()方法@Overridepublic void swim() {System.out.println(name+"正在狗刨~");}
}

? ? ? ? 所以通過上面的代碼我們實現了Dog類繼承Animal類,然后通過implements實現了Running和Swimming兩個接口我們要注意一定是先繼承再實現接口如果把extends放后面是會產生錯誤的啦:

同樣的,我們知道java中一個類只能繼承一個類,若是再繼承一個也會產生錯誤啦:

? ? ? ? 那么我們說過解決多繼承的問題,到底是怎么體現的呢?我們往下看,不妨假設一下,沒有Running和Swimming這兩個接口,而是Running和Swimming兩個類,然后Dog再繼承它們:

? ? ? ? 很顯然是不行的啦~怎么可以繼承多個類呢,所以我們就需要接口,可以將我們這些規則的行為放到我們接口當中,這樣就能解決多繼承。很明顯不是所有的動物都會飛,如果我們將Flyable放到我們Animal類里面,很明顯是不合適的,狗狗是不會飛的。

? ? ? ? 我們再定義一個鳥類繼承父類Animal并通過implements實現Running和Flyable接口來觀察

// Bird通過extends繼承Animal并且通過implemens實現了Running和Flyable接口
public class Bird extends Animal implements Running,Flyable{//小鳥兒的構造方法public Bird(String name, int age) {//通過super調用父類的構造方法初始化name和agesuper(name, age);}//實現父類的eat()方法@Overridepublic void eat() {System.out.println(name+"吃鳥糧");}//實現Flyable接口的fly()方法@Overridepublic void fly() {System.out.println(name+"正在酷酷飛翔");}//實現Running接口的run()方法@Overridepublic void run() {System.out.println(name+"奮力疾走中");}
}

? ? ? ? 很明顯小鳥只能飛和跑,并不能游泳,所以鳥類只能實現Running和Flyable接口,不能實現Swimming接口~

🟢那么我們寫下測試類

public class Test2 {//測試方法1 - 接收Animal類型參數;animal可以是Animal類或其任何子類的對象public static void test1(Animal animal) {// 調用動物的eat方法,具體執行哪個看實際傳入對象類型// 例如:test1(new Dog()) 會調用Dog類的eat()// test1(new Cat()) 會調用Cat類的eat()animal.eat();}//測試方法2 - 接收Running接口類型參數//是任何實現了Running接口的對象public static void test2(Running running) {//調用傳入對象的run()方法//只要對象實現了Running接口就能傳入,不管它是什么具體類running.run();}//測試方法3 - 接收Swimming接口類型參數//是任何實現了Swimming接口的對象public static void test3(Swimming swimming) {//調用傳入對象的swim()方法//可以接收任何"會游泳"的對象swimming.swim();}//測試方法4 - 接收Flyable接口類型參數//是任何實現了Flyable接口的對象public static void test4(Flyable flyable) {//調用傳入對象的fly()方法//可以接收任何"會飛"的對象flyable.fly();}//第一個測試主方法 - 演示接口多態public static void main1(String[] args) {// 創建一只鳥對象,名字叫"憤怒的小鳥兒",年齡2歲Bird bird = new Bird("憤怒的小鳥兒",2);// 創建一只狗對象,名字叫"開心的小狗狗",年齡3歲Dog dog = new Dog("開心的小狗狗",3);// 測試test2方法 - 傳入會跑步的對象test2(bird);// 讓鳥兒跑步(Bird實現了Running接口)test2(dog);// 讓狗狗跑步(Dog實現了Running接口)System.out.println("----------------");// 分隔線// 測試test3方法 - 傳入會游泳的對象test3(dog);// 讓狗狗游泳(Dog實現了Swimming接口)//??不可以test3(bird);Bird沒有實現Swimming接口System.out.println("----------------");// 分隔線// 測試test4方法 - 傳入會飛的對象test4(bird);// 讓鳥兒飛翔(Bird實現了Flyable接口)//??不可以test4(dog);Dog沒有實現Flyable接口}//第二個測試主方法 - 演示繼承多態public static void main2(String[] args) {// 創建一只鳥對象,名字叫"憤怒的小鳥兒",年齡2歲Bird bird = new Bird("憤怒的小鳥兒",2);// 創建一只狗對象,名字叫"開心的小狗狗",年齡3歲Dog dog = new Dog("開心的小狗狗",3);// 測試test1方法 - 傳入動物對象test1(bird);// 讓鳥兒吃東西(調用Bird的eat方法)test1(dog);// 讓狗狗吃東西(調用Dog的eat方法)// 這里因為Bird和Dog都是Animal的子類,所以都可以傳入啦}
}

🌟 我們可以從上述代碼得出以下的一些個人理解:

1. 多態是什么?

  • 就像同一個"動作"在不同對象上有不同表現
  • 例如:同樣是"吃",鳥吃鳥糧,狗吃狗糧

2. 接口多態(main1演示)

  • test2( )中可以接受任何會跑步的對象實現了Running接口就可以)

  • 不管傳入的是鳥還是狗,只要會跑步就行

3.?繼承多態(main2演示)

  • test1( )可以接受任何動物對象(是Animal的子類)

  • 不管傳入的是鳥還是狗,因為它們都是動物

4. 那么為什么這樣設計呢?

  • 能提高代碼靈活性:不需要為每種動物寫單獨的方法

  • 便于擴展:新增一些動物類型的時候不需要修改測試方法

??還是再提一下:每個測試方法(test1-test4)的行為取決于:實際傳入的對象類型,該對象對應方法的實現方式~


完整代碼講解

下面是完整版本的代碼:附帶超詳細注釋,更適合新手寶寶們閱讀~

// 1. 首先定義接口
public interface Flyable {void fly();
}
public interface Running {void run();
}
public interface Swimming {void swim();
}// 2. 定義抽象父類
//建立一個動物抽象類:
//1.用abstract修飾,表示這是一個抽象類,不能直接創建實例
//2.包含了所有動物共有的屬性和方法
public abstract class Animal {//公共屬性名字和年齡(所有動物和植物都有的)public String name;public int age;//抽象方法:吃東西//1.用abstract修飾,沒有具體的實現//2.所有的子類必須實現這個方法public abstract void eat();//動物類的構造方法public Animal(String name,int age) {this.name = name;this.age = age;}
}// 3. 定義具體實現類
// Bird通過extends繼承Animal并且通過implemens實現了Running和Flyable接口
public class Bird extends Animal implements Running,Flyable{//小鳥兒的構造方法public Bird(String name, int age) {//通過super調用父類的構造方法初始化name和agesuper(name, age);}//實現父類的eat()方法@Overridepublic void eat() {System.out.println(name+"吃鳥糧");}//實現Flyable接口的fly()方法@Overridepublic void fly() {System.out.println(name+"正在酷酷飛翔");}//實現Running接口的run()方法@Overridepublic void run() {System.out.println(name+"奮力疾走中");}
}// Dog通過extends繼承Animal并且通過implemens實現了Running和Swimming接口
public class Dog extends Animal implements Running,Swimming{//狗狗的構造方法public Dog(String name, int age) {//通過super調用父類的構造方法初始化name和agesuper(name, age);}//實現父類的eat()方法@Override//表示重寫public void eat() {System.out.println(name+"吃狗糧啦~");}//實現Running接口的run()方法@Overridepublic void run() {System.out.println(name+"正在飛跑~");}//實現Swimming接口的swim()方法@Overridepublic void swim() {System.out.println(name+"正在狗刨~");}
}// 4. 定義測試類
public class Test2 {//測試方法1 - 接收Animal類型參數;animal可以是Animal類或其任何子類的對象public static void test1(Animal animal) {// 調用動物的eat方法,具體執行哪個看實際傳入對象類型// 例如:test1(new Dog()) 會調用Dog類的eat()// test1(new Cat()) 會調用Cat類的eat()animal.eat();}//測試方法2 - 接收Running接口類型參數//是任何實現了Running接口的對象public static void test2(Running running) {//調用傳入對象的run()方法//只要對象實現了Running接口就能傳入,不管它是什么具體類running.run();}//測試方法3 - 接收Swimming接口類型參數//是任何實現了Swimming接口的對象public static void test3(Swimming swimming) {//調用傳入對象的swim()方法//可以接收任何"會游泳"的對象swimming.swim();}//測試方法4 - 接收Flyable接口類型參數//是任何實現了Flyable接口的對象public static void test4(Flyable flyable) {//調用傳入對象的fly()方法//可以接收任何"會飛"的對象flyable.fly();}//第一個測試主方法 - 演示接口多態public static void main1(String[] args) {// 創建一只鳥對象,名字叫"憤怒的小鳥兒",年齡2歲Bird bird = new Bird("憤怒的小鳥兒",2);// 創建一只狗對象,名字叫"開心的小狗狗",年齡3歲Dog dog = new Dog("開心的小狗狗",3);// 測試test2方法 - 傳入會跑步的對象test2(bird);// 讓鳥兒跑步(Bird實現了Running接口)test2(dog);// 讓狗狗跑步(Dog實現了Running接口)System.out.println("----------------");// 分隔線// 測試test3方法 - 傳入會游泳的對象test3(dog);// 讓狗狗游泳(Dog實現了Swimming接口)//不可以test3(bird);Bird沒有實現Swimming接口System.out.println("----------------");// 分隔線// 測試test4方法 - 傳入會飛的對象test4(bird);// 讓鳥兒飛翔(Bird實現了Flyable接口)//不可以test4(dog);Dog沒有實現Flyable接口}//第二個測試主方法 - 演示繼承多態public static void main2(String[] args) {// 創建一只鳥對象,名字叫"憤怒的小鳥兒",年齡2歲Bird bird = new Bird("憤怒的小鳥兒",2);// 創建一只狗對象,名字叫"開心的小狗狗",年齡3歲Dog dog = new Dog("開心的小狗狗",3);// 測試test1方法 - 傳入動物對象test1(bird);// 讓鳥兒吃東西(調用Bird的eat方法)test1(dog);// 讓狗狗吃東西(調用Dog的eat方法)// 這里因為Bird和Dog都是Animal的子類,所以都可以傳入啦}
}

最后的輸出結果為:

憤怒的小鳥兒奮力疾走中??
開心的小狗狗正在飛跑~
----------------
開心的小狗狗正在狗刨~
----------------
憤怒的小鳥兒正在酷酷飛翔

?最后總結一下:

? ? ? ? 上述代碼展示了一個類繼承一個父類,同時實現多種接口。繼承表達的含義是 is-a,而接口表達的含義是具有某某特性。


?2. 接口間的繼承

? ? ? ? 想象你正在設計一個動物園管理系統。最初,你定義了Swimming(可游泳)和Flyable(可飛行)兩個基礎接口但隨著系統發展,你發現有些鳥類既會飛又會潛水(比如企鵝)。這時候,就需要用到接口間的繼承啦~重新定義一個接口,這個接口具備Swimming和Flyable這兩個接口的功能,讓這個新的接口繼承Swimming接口和Flyable接口~

例如我們先定義三個接口:

//分別定義了兩個個接口
//并分別定義了各自的抽象方法
interface A {void testA();
}
interface B {void testB();
}

這時候我們想要有一個接口,擁有A和B這兩個接口的功能,則這樣實現:

//有一個接口,具備A和C接口的功能,extends為擴展
interface C extends A,B {//C這個接口具備了B和C的功能,同時也有自己的抽象方法void testC();
}

那么當一個類實現我們C接口,需要重寫A,B,C里的三個方法:

public class Test4 implements C{@Overridepublic void testA() {}@Overridepublic void testB() {}@Overridepublic void testC() {}
}

完整代碼講解

實現接口間繼承示例完整的代碼如下:

//分別定義了三個接口
//并分別定義了各自的抽象方法
interface A {void testA();
}
interface B {void testB();
}
//有一個接口,具備A和C接口的功能,extends為擴展
interface C extends A,B {//C這個接口具備了B和C的功能,同時也有自己的抽象方法void testC();
}
//實現子接口的類必須實現所有繼承鏈上的抽象方法
public class Test4 implements C{@Overridepublic void testA() {}@Overridepublic void testB() {}@Overridepublic void testC() {}
}

? ? ? ? 接口C通過extends關鍵字繼承了接口A和B,通過上述代碼我們可以總結出接口繼承的特點:

  • 一個接口(C)可以繼承多個父接口(A,B)
  • 子接口(C)可以繼承所有父接口(A,B)的抽象方法
  • 子接口可以定義自己的新方法
  • 接口間的繼承相當于把多個接口合并在一起

3. 抽象類和接口的區別

🔴java中抽象類和接口的區別,這是常見的面試題

抽象類和接口都是 Java 中多態的常見使用方式,我們需要知道:

"抽象類管是什么,接口管能做什么"

抽象類關注類的本質,接口關注行為擴展

定義方式上不同

// 抽象類 - 用abstract修飾
abstract class Animal {// 可以有具體屬性String name;int age;// 可以有具體方法public void sleep() {System.out.println("動物在睡覺");}// 可以有抽象方法public abstract void eat(); 
}// 接口 - 用interface修飾
interface Swimmable {// 只能有常量(默認是public static final)int a = 5;// 只能有抽象方法(Java8前)void swim();
}

繼承/實現方式不同

// 類繼承抽象類(extends)
class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃狗糧");}
}// 類實現接口(implements)
class Fish implements Swimmable {@Overridepublic void swim() {System.out.println("魚在游泳");}
}

區別表格

特性抽象類接口
關鍵字abstract classinterface
子類繼承/實現使用extends關鍵字繼承抽象類(單繼承)使用implements關鍵字實現接口(多實現)
構造方法
結構組成普通類+抽象方法抽象方法+全局變量
設計理念"是什么"(is-a關系)"能做什么"(has-a能力)
適用場景有共同特征的類

定義類的行為規范

關系一個抽象類可以實現多個接口

接口不能繼承抽象類,

但是可以使用extends繼承多個父接口

那么我們該選擇哪個使用,可以根據以下內容選擇:

1. 用抽象類當

  • 多個類有共同屬性和方法
  • 需要定義一些默認實現時
  • 例子:不同種類的鳥都有羽毛,都會飛,但飛行方式不同

2. 用接口當

  • 只想定義行為規范時
  • 需要類具備多種能力
  • 例子:鴨子既能游泳(Swimming)又跑(Running)

💡總結一下

? ? ? ? 抽象類中可以包含普通方法和普通字段這樣的普通方法和字段可以被子類直接使用(不必重寫)。

? ? ? ?而接口中,不能包含普通方法子類必須重寫所有的抽象方法比如此處的 Animal 中包含一個 name 這樣的屬性,這個屬性在任何子類中都是存在的。因此此處的 Animal 只能作為一個抽象類,而不應該成為一個接口。

class Animal {protected String name;public Animal(String name) {this.name = name;}}

在這其中,也經常會有這些面試題:?

  • 一個類能同時繼承類和實現接口嗎?

? 可以的,先extends類后implements接口

  • 接口能繼承類嗎?

? 不能的,接口只能繼承接口


制作不易,更多內容加載中~感謝友友們的點贊收藏關注~~

如有問題歡迎批評指正,祝友友們生活愉快,學習工作順順利利!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77970.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于MuJoCo物理引擎的機器人學習仿真框架robosuite

Robosuite 基于 MuJoCo 物理引擎,能支持多種機器人模型,提供豐富多樣的任務場景,像基礎的抓取、推物,精細的開門、擰瓶蓋等操作。它可靈活配置多種傳感器,提供本體、視覺、力 / 觸覺等感知數據。因其對強化學習友好&am…

企業微信自建應用開發回調事件實現方案

目錄 1. 前言 2. 正文 2.1 技術方案 2.2 策略上下文 2.2 添加客戶策略實現類 2.3 修改客戶信息策略實現類 2.4 默認策略實現類 2.5 接收事件的實體類(可以根據事件格式的參數做修改) 2.6 實際接收回調結果的接口 近日在開發企業微信的自建應用時…

Linux將多個塊設備掛載到一個掛載點

在 Linux 系統中,直接將多個塊設備掛載到同一個掛載點是不可能的。這是因為 Linux 的文件系統掛載機制設計為一個掛載點一次只能關聯一個文件系統。如果嘗試將多個塊設備掛載到同一個掛載點,后一次掛載會覆蓋前一次的掛載,導致只有最后掛載的…

Spark-SQL(四)

本節課學習了spark連接hive數據,在 spark-shell 中,可以看到連接成功 將依賴放進pom.xml中 運行代碼 創建文件夾 spark-warehouse 為了使在 node01:50070 中查看到數據庫,需要添加如下代碼,就可以看到新創建的數據庫 spark-sql_1…

野外價值觀:在真實世界的語言模型互動中發現并分析價值觀

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

el-select+vue-virtual-scroller解決數據量大卡頓問題

解決el-select中數據量過大時,顯示及搜索卡頓問題,及正確的回顯默認選中數據 粗略的封裝了組件,有需要各種屬性自定義的,自己添加設置下 環境 node 16.20.1 npm 8.19.4 vue2、element-ui "vue-virtual-scroller"…

Sqlite3交叉編譯全過程

Sqlite3交叉編譯全過程 一、概述二、下載三、解壓四、配置五、編譯六、安裝七、驗證文件類型八、移植8.1、頭文件sqlite3.h8.2、動態鏈接庫移植8.3、靜態態鏈接庫移植 九、驗證使用9.1. 關鍵函數說明 十、觸發器使用十一、sqlite表清空且恢復id值十二、全文總結 一、概述 SQLi…

軟考軟件設計師考試情況與大綱概述

文章目錄 **一、考試科目與形式****二、考試大綱與核心知識點****科目1:計算機與軟件工程知識****科目2:軟件設計** **三、備考建議****四、參考資料** 這是一個系列文章的開篇 本文對2025年軟考軟件設計師考試的大綱及核心內容進行了整理,并…

【數學建模】孤立森林算法:異常檢測的高效利器

孤立森林算法:異常檢測的高效利器 文章目錄 孤立森林算法:異常檢測的高效利器1 引言2 孤立森林算法原理2.1 核心思想2.2 算法流程步驟一:構建孤立樹(iTree)步驟二:構建孤立森林(iForest)步驟三:計算異常分數 3 代碼實現…

【Android面試八股文】Android系統架構【一】

Android系統架構圖 1.1 安卓系統啟動 1.設備加電后執行第一段代碼:Bootloader 系統引導分三種模式:fastboot,recovery,normal: fastboot模式:用于工廠模式的刷機。在關機狀態下,按返回開機 鍵進…

jvm-獲取方法簽名的方法

在Java中,獲取方法簽名的方法可以通過以下幾種方式實現,具體取決于你的需求和使用場景。以下是詳細的介紹: 1. 使用反射 API Java 提供了 java.lang.reflect.Method 類來獲取方法的相關信息,包括方法簽名。 示例代碼&#xff1a…

DeepSeek和Excel結合生成動態圖表

文章目錄 一、前言二、3D柱狀圖案例2.1、pyecharts可視化官網2.2、Bar3d-Bar3d_puch_card2.3、Deepseek2.4、WPS2.5、動態調整數據 一、前言 最近在找一些比較炫酷的動態圖表,用于日常匯報,于是找到了 DeepseekExcel王牌組合,其等同于動態圖…

探索 .bat 文件:自動化任務的利器

在現代計算機操作中,批處理文件(.bat 文件)是一種簡單而強大的工具,它可以幫助我們自動化重復性任務,工作效率提高。盡管隨著編程語言和腳本工具的發展,.bat 文件的使用頻率有所下降,但它依然是…

PyTorch與自然語言處理:從零構建基于LSTM的詞性標注器

目錄 1.詞性標注任務簡介 2.PyTorch張量:基礎數據結構 2.1 張量創建方法 2.2 張量操作 3 基于LSTM的詞性標注器實現 4.模型架構解析 5.訓練過程詳解 6.SGD優化器詳解 6.1 SGD的優點 6.2 SGD的缺點 7.實用技巧 7.1 張量形狀管理 7.2 廣播機制 8.關鍵技…

【C++】特殊類的設計、單例模式以及Cpp類型轉換

📚 博主的專欄 🐧 Linux | 🖥? C | 📊 數據結構 | 💡C 算法 | 🌐 C 語言 上篇文章: C 智能指針使用,以及shared_ptr編寫 下篇文章: C IO流 目錄 特殊類的設…

探索 Flowable 后端表達式:簡化流程自動化

什么是后端表達式? 在 Flowable 中,后端表達式是一種強大的工具,用于在流程、案例或決策表執行期間動態獲取或設置變量。它還能實現自定義邏輯,或將復雜邏輯委托…… 后端表達式在 Flowable 的后端運行,無法訪問前端…

【Lua】Lua 入門知識點總結

Lua 入門學習筆記 本教程旨在幫助有編程基礎的學習者快速入門Lua編程語言。包括Lua中變量的聲明與使用,包括全局變量和局部變量的區別,以及nil類型的概念、數值型、字符串和函數的基本操作,包括16進制表示、科學計數法、字符串連接、函數聲明…

符號速率估計——小波變換法

[TOC]符號速率估計——小波變換法 一、原理 1.Haar小波變換 小波變換在信號處理領域被成為數學顯微鏡,不同于傅里葉變換,小波變換可以觀測信號隨時間變換的頻譜特征,因此,常用于時頻分析。 ??當小波變換前后位置處于同一個碼元…

android contentProvider 踩坑日記

寫此筆記原因 學習《第一行代碼》到第8章節實現provider時踩了一些坑,因此記錄下來給后來人和自己一個提示,僅此而已。 包含內容 Sqlite數據庫CURD內容provider界面provider項目中書籍管理provider實現邏輯用adb shell確認providercontentResolver接收…

Eureka、LoadBalance和Nacos

Eureka、LoadBalance和Nacos 一.Eureka引入1.注冊中心2.CAP理論3.常見的注冊中心 二.Eureka介紹1.搭建Eureka Server 注冊中心2.搭建服務注冊3.服務發現 三.負載均衡LoadBalance1.問題引入2.服務端負載均衡3.客戶端負載均衡4.Spring Cloud LoadBalancer1).快速上手2)負載均衡策…