【Java入門到精通】(三)Java基礎語法(下)

一、面向對象(類和對象)

1.1 萬事萬物皆對象

? ? ? ? 類:對對象向上抽取出像的部分、公共的部分以此形成類,類就相當于一個模板。

? ? ? ? 對象:模板下具體的產物可以理解為具體對象,對象就是一個一個具體的實例,就相當于這個模板下具體的產品。

? ? ? ? Java中一般先定義類,再創建對象

1.2 類和對象的關系

(1)類的定義
  • 給類起一個見名知意的名字,首字符大寫,駝峰命名原則,
  • 類的特性編寫,特性即類的屬性部分。
  • 類的行為編寫,行為即類的方法部分。
(2)類和對象的創建以及使用

類的定義

public class Person {// 特性編寫-屬性-名詞(只定義和業務邏輯相關的代碼)String name; // 姓名int age; // 年齡double height; // 身高// 行為編寫-方法-動詞// 定義一個學習的方法public void study() {System.out.println("study>>>>>>");}
}

對象的創建和使用類

public class Test {// 程序的入口public static void main(String[] args) {// 對Person類的對象進行創建:創建了一個Person對象,名字叫p1Person p1 = new Person();// 對屬性進行賦值操作p1.name = "張三";p1.age = 18;p1.height = 178.5;// 讀取屬性System.out.println(p1.name);System.out.println(p1.age);// 調用對象的方法p1.study();}
}

二、構造器

2.1 構造器的作用

? ? ? ? 對于一個類來說,一般有三種常見的成員:屬性方法構造器。這三種成員都可以定義零個或多個。

? ? ? ? 構造方法也叫構造器,是一個創建對象時被自動調用的特殊方法,用于對象的初始化。Java通過new關鍵字來調用構造器,從而返回該類的實例。

2.2 構造器聲明格式

????????若無參數列表,稱之為無參構造器(空構造器)

????????若有參數列表,稱之為有參構造器

2.3 構造器四要點

  • 構造器的方法名必須和類名一致
  • 構造器通過new關鍵字調用
  • 構造器不能定義返回值類型,不能在構造器里使用return關鍵字來返回某個值。
  • 如果我們沒有定義構造器,則編譯器會自動定義一個無參的構造方法。如果已定義則把編譯器不會自動添加

2.4 構造器的重載

? ? ? ? 構造方法也是方法,只不過有特殊的作用而已。與普通方法一樣,構造方法也可以重載。

2.5 創建構造器的快捷鍵

8Alt + Insert

2.6 代碼示例

Person類

// 特性編寫-屬性-名詞(只定義和業務邏輯相關的代碼)
String name; // 姓名
int age; // 年齡
double height; // 身高// 行為編寫-方法-動詞
// 定義一個學習的方法
public void study() {System.out.println("study>>>>>>");
}
// 定義一個構造器
public Person() {System.out.println("調用了一個空構造器");
}
// 重載一個構造器
// 構造器的參數名字:如果和屬性名字重名,就會發生就近原則
// 如果重名以后,你想給屬性賦值,那么就在想要表達屬性的變量前加上 this. 修飾
public Person(int age, String name, double height) {this.age = age;this.name = name;this.height = height;
}

Test02對象

public class Test02 {public static void main(String[] args) {// 創建一個Person類的對象/* new Person()解釋Person():空的構造方法new關鍵字:對方法進行調用=》構造器作用:底層會幫我們創建對象,在創建對象之后進行初始化操作如果一個類沒有顯示編寫構造器的話,那么系統會為這個類默認分配一個空構造器調用構造器以后,對對象進行初始化操作,將對象的地址返回給p盡量要保證空構造器的存在,因為某些框架底層需要空構造器,如果你沒有添加就會報錯*//*原始寫法Person p = new Person();p.age = 18;p.name = "小張";p.height = 180.6;Person p2 = new Person();p2.age = 18;p2.name = "小李";p2.height = 160.6;*/// 簡便寫法Person p = new Person(18,"小張",180.6);System.out.println(p.age);Person p2 = new Person(30, "小李",160.6);System.out.println(p2.age);// 如果一個類中有構造器,那么系統就不會為你分配默認的構造器// Person p3 = new Person();  // 會報錯}}

三、面向對象(封裝)

3.1 封裝的思想

? ? ? ? 我們程序設計追求“高內聚,低耦合”。

  • 高內聚:類的內部數據操作細節自己完成,不允許外部干涉;
  • 低耦合:僅對外暴露少量的方法用于使用。

? ? ? ? 隱藏對象內部的復雜性,只對外公開簡單的接口。便于外界調用,從而提高系統的可擴展性、可維護性,提高程序的安全性。通俗的說,把該隱藏的隱藏起來,該暴露的暴露出來。這就是封裝的設計思想。?

3.2 代碼

Gril類

public class Gril {// 屬性private int age; // private表示私有屬性,只能在內部訪問// 封裝思想的使用:// 給age提供一個賦值方法:public void setAge(int age) {if (age > 30) {this.age = 18;} else {this.age = age;}}// 給age提供一個讀取的方法public int getAge(){return age;}
}

?Test對象調用Gril類

public class Test {public static void main(String[] args) {// 創建對象Gril g = new Gril();g.setAge(18);System.out.println(g.getAge());}
}

3.3?上述封裝代碼的解釋

? ? ? ? 上述代碼以屬性為案例進行封裝:

(1)將屬性私有化,被private修飾--》加入權限修飾符(一旦加入了權限修飾符,其他人就不能隨意的獲取這個屬性)

(2)提供public修飾的方法讓別人來訪問/使用

(3)即使外界可以通過方法來訪問屬性了,但是也不能隨意訪問,因為程序員可以在方法中加入限制條件。

四、面向對象(繼承)

4.1 類是對對象的抽象

4.2 繼承是對類的抽象

?4.3 繼承的格式和好處

(1)繼承的格式

子類 extends 父類

public class student extends Person {}

(2)繼承的好處

  • 提高了代碼的復用性;
  • 便于代碼的擴展;
  • 為了多態的使用,是多態使用的前提

4.4 代碼示例

Person繼承類

public class Person {// 父類的公共屬性:private int age;private String name;private double height;//父類的公共方法:public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}// 吃飯public void eat() {System.out.println("人類可以吃飯!!");}//睡覺public void sleep() {System.out.println("人類可以睡覺!!");}//喊叫public void shout() {System.out.println("人類可以喊叫!!");}
}

Student類

public class Student extends Person {// 定義子類額外的、擴展的屬性private int sno;// 定義子類額外的、擴展的方法public int getSno() {return sno;}public void setSno(int sno) {this.sno = sno;}// 學習:public void study() {System.out.println("學生可以學習");}
}

Test對象?

public class Test {public static void main(String[] args) {// 定義一個子類具體的對象:Student s = new Student();s.setSno(10000);s.setAge(18);s.setName("張三");s.setHeight(180.3);s.study();s.eat();s.shout();s.sleep();}
}

4.5 方法的重寫

? ? ? ? 方法的重寫是基于繼承來的

方法重寫的定義:

? ? ? ? 發生在子類和父類中,當子類對父類提供的方法不滿意的時候,要對父類的方法進行重寫。

? ? ? ? 一旦子類對父類的方法進行了重寫,對象訪問的時候,就只能訪問到子類的方法(就近原則)。

方法的重寫有嚴格的格式要求:

? ? ? ? ?子類的方法名和父類必須一致,參數列表(個數,類型,順序)也要和父類一致。

代碼

Person繼承類

public class Person {public void eat(){System.out.println("人可以吃飯");}
}

Student類

public class Student extends Person {// 方法的重寫public void eat(){System.out.println("我喜歡吃燒烤");}
}

Test對象

public class Test {public static void main(String[] args) {// 創建一個Student具體的對象Student s = new Student();s.eat();}
}

面試常問:

重載和重寫有什么區別?

重載:在同一個類中,當方法名相同,形參列表不同的時候,多個方法構成了重載。

重寫:在不同的類中,子類對父類提供的方法不滿意,對父類的方法進行重寫。

五、面向對象(多態)

5.1 多態的概念

? ? ? ? 多態:通俗來所,就是多種形態,具體點就是去完成某個行為,當不同的對象去完成時會產生出不同的狀態。同一種行為,不同的子類呈現出來的狀態是不同的

? ? ? ? ps:多態跟屬性無關,多態指的是方法的多態,而不是屬性的多態。

5.2 多態的三要素和好處

? ? ? ? 多態三要素:繼承、重寫、父類引用指向子類對象

? ? ? ? 多態的好處:提高代碼擴展性

// 這里沒太理解,而且比較亂,可以看一下項目中的java10下面的示例

六、異常處理

6.1 什么是異常

? ? ? ? 異常就是在程序的運行過程中所發生的不正常的事件,它會中斷正在運行的程序。

  • 所需要的文件找不到
  • 網絡連接不同或中斷
  • 算術運算錯(被零除...)
  • 數組下標越界
  • 裝載一個不存在的類或者對null對象操作
  • 類型轉換異常
  • ........

? ? ? ? Java提供異常處理機制。它將異常處理代碼和業務代碼分離,使程序更優雅,更好的容錯性,高健壯性。

? ? ? ? Java的異常處理是通過5個關鍵字來實現的:trycatchfinallythrowthrows?

6.2 程序中異常演示

6.3 try-catch-finally

public static void main(String[] args) {try {// 求兩個數的商int num1 = 12;int num2 = 2;System.out.println("兩個數的商為:"+ num1/num2);} catch (Exception ex){System.out.println("你的程序出現了錯誤"+ ex);} finally {System.out.println("程序無論是否出現異常,這里的邏輯都必須執行");}System.out.println("上面是兩個數相除的邏輯案例1");
}

try-catch執行情況

情況1:try塊中代碼沒有出現異常

? ? ? ? 不執行catch塊代碼,執行catch塊后邊的代碼

情況2:try塊中代碼出現異常,catch中異常類型匹配(相同或者父類)

? ? ? ? Java會生成相應的異常對象,Java系統尋找匹配的catch塊,執行catch塊后面的代碼。try塊中尚未執行的語句不會執行。

情況3:try塊代碼出現異常,catch中異常類型不匹配

? ? ? ? 不執行catch塊代碼,不執行catch塊后面的代碼,程序會中斷運行

catch塊中如何處理異常

? ? ? ? 其中一種方式:自定義內容輸出

6.4 throw/throws

throw/throws的使用

public class Test02 {public static void main(String[] args) {try {devide();} catch (Exception e) {System.out.println("在調用時處理異常");}}// 提取一個方法:兩個數相除操作public static void devide() throws Exception {int num1 = 12;int num2 = 0;if(num2 == 0){// 人為制造一個異常/** 第一種拋異常的方式:try {throw new Exception();} catch (Exception e) {throw new RuntimeException(e);}*/throw new Exception();}System.out.println("兩個數的商是" + num1/num2);}
}

?throw和throws的區別

(1)位置不同

? ? ? ? throw:方法內部

? ? ? ? throws:方法的簽名處,方法的聲明處

(2)內容不同:

? ? ? ? throw+異常對象

? ? ? ? throws+異常的類型

(3)作用不同:

? ? ? ? throw:異常出現的源頭,制造異常。

? ? ? ? throws:在方法的聲明處,告訴方法的調用者,這個方法中可能會出現我聲明的這些異常。然后調用者對這個異常進行處理:要么自己處理,要你再繼續向外拋出異常。

七、集合

7.1 對比數組的缺點引入集合

(1)數組一旦指定了長度,那么長度就被確定了,不可以更改。

(2)刪除、增加元素效率低(如果改變數組中其中一項,后面的項都要跟著變)

(3) 數組中實際元素的數量是沒法獲取到的,沒有提供對應的方法或者屬性來獲取。

(4)數組存儲:有序,可重復,對于無序的,不可重復的場合數組不能滿足要求。

7.2 集合體系預覽

7.3 ArrayList集合的使用

public static void main(String[] args) {// 定義一個集合ArrayList<String> list = new ArrayList<String>();// 增加元素:list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");System.out.println(list); // [aaa, bbb, ccc, ddd]// 刪除元素:list.remove("ccc");System.out.println(list); // [aaa, bbb, ddd]// 修改元素:list.set(0, "eee");System.out.println(list); // [eee, bbb, ddd]// 查看元素:System.out.println(list.get(0)); // eee// 遍歷當前集合// 使用普通的for循環for (int i = 0; i < list.size()-1; i++) {System.out.println(list.get(i));}
}
ArrayList使用方法
增加元素

list.add("aaa");

刪除元素

list.remove("ccc");

修改元素

list.set(0, "eee");

查找元素

System.out.println(list.get(0));

遍歷元素

for (int i = 0; i < list.size()-1; i++) {
System.out.println(list.get(i));
}

八、項目總結實戰?

8.1 需求設計

? ? ? ? 項目名稱:小張書城

? ? ? ? 項目需求設計:

項目任務涉及技能點

1、展示書籍

2、上新書籍

3、下架書籍

4、推出應用

用戶交互-鍵盤錄入

分支結構、循環結構

面向對象思維封裝對象(如何合理定義類)

集合的使用

8.2 項目代碼實現

Books集合

public class Books {// 書籍相關// 書籍類的 屬性// private修飾符:只允許內部訪問,外部無法訪問該屬性// 書籍編號private int bNo;// 書籍名稱private String bName;// 書籍作者private String bAuthor;//快捷鍵:alt + insert 快速創建get和set方法public int getbNo() {return bNo;}public void setbNo(int bNo) {this.bNo = bNo;}public String getbAuthor() {return bAuthor;}public void setbAuthor(String bAuthor) {this.bAuthor = bAuthor;}public String getbName() {return bName;}public void setbName(String bName) {this.bName = bName;}// 構造器public Books(int bNo, String bName, String bAuthor) {this.bNo = bNo;this.bName = bName;this.bAuthor = bAuthor;}// 空構造器public Books() {}
}

Test對象

package com.study.java13;
import java.awt.print.Book;
import java.util.ArrayList;
import java.util.Scanner; // 告訴程序這個類在什么位置/*
【小張書城】項目功能規劃:
1.展示書籍
2.上新書籍書籍信息:書籍編號    書籍名稱       書籍作者01   小張的Java之路    小張快跑   ----》 封裝成一個具體的書籍對象 ---》類:書籍
3.下架書籍
4.退出應用*/
public class Test {public static void main(String[] args) {// 創建一個集合:用于存放相同的個體(列表用來存放書籍)--》書籍對象    --》注意作用范圍:將list放在循環外面ArrayList list = new ArrayList(); // 空集合while (true){// 打印菜單:System.out.println("-------歡迎來到【小張書城】-------");System.out.println("1.展示書籍");System.out.println("2.上新書籍");System.out.println("3.下架書籍");System.out.println("4.退出應用");// 借助Scanner類:Scanner sc = new Scanner(System.in); // 掃描鍵盤錄入事件類// 給一個友好的提示System.out.println("請錄入你想要執行的功能的序號:");// 利用鍵盤,錄入序號:int choice = sc.nextInt(); // 接收鍵盤錄入的事件// 根據choice錄入的功能序號,進行后續的判斷if(choice == 1){System.out.println("<展示書籍>");// 展示書籍(對集合進行遍歷查看)for (int i = 0; i < list.size(); i++) {Books b = (Books)(list.get(i)); // Java 語言中的類型轉換System.out.println(b.getbNo() + "------" + b.getbName() + "------" + b.getbAuthor() + "------");}}if(choice == 2){System.out.println("<上新書籍>");// 從鍵盤錄入書籍信息System.out.println("請錄入書籍編號:");int bNo = sc.nextInt(); // 獲取家鍵盤int類型數據System.out.println("請錄入書籍名稱:");String bName = sc.next(); //獲取家鍵盤String類型數據System.out.println("請錄入書籍作者:");String bAuthor = sc.next(); //獲取家鍵盤String類型數據// 每上新一本書,就要創建一個書籍對象Books b = new Books();b.setbNo(bNo);b.setbName(bName);b.setbAuthor(bAuthor);list.add(b); // 添加個體到集合中去}if(choice == 3){System.out.println("<下架書籍>");// 錄入要下架的書籍的編號System.out.println("請錄入你要下架的書籍的編號:");int deNo = sc.nextInt();// 下架編號對應的書籍for (int i = 0; i < list.size(); i++) {Books b = (Books)(list.get(i));if(b.getbNo() == deNo){ // 如果遍歷的書籍編號和錄入的要刪除的書籍編號一致,那么從集合中移除該書籍即可list.remove(b);System.out.println("書籍下架成功");break; // 如果下架成功,就停止遍歷,不需要后續的遍歷}}}if(choice == 4){System.out.println("<退出應用>");break; // 停止正在執行的循環}}}
}

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

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

相關文章

Java文件傳輸要點

Java文件傳輸要點 一、前端 <form action"/upload" method"post" enctype"multipart/form-data"> <!--<form action"/upload" method"post">-->姓名: <input type"text" name"username…

Spring Boot 中使用 Lombok 進行依賴注入的示例

Spring Boot 中使用 Lombok 進行依賴注入的示例 下面我將展示 Spring Boot 中使用 Lombok 進行依賴注入的不同方式&#xff0c;包括構造器注入、屬性注入和 setter 方法注入&#xff0c;以及相應的測試用例。 1. 構造器注入&#xff08;推薦方式&#xff09; import lombok.Req…

vue3+vit+vue-router路由,側邊欄菜單,面包屑導航設置層級結構

文章目錄注意效果圖目錄結構代碼vite.config.ts需要配置路徑別名符號main.tsApp.vueBreadcrumb.vue面包屑組件menus.ts// src/router/index.ts其他文件注意 目錄結構僅供參考DefaultLayout.vue 沒有用到&#xff0c;我直接寫在APP文件中vux-store我也沒有用到&#xff0c;單獨…

使用Selenium自動化獲取抖音創作者平臺視頻數據

前言 在當今短視頻盛行的時代&#xff0c;抖音作為國內領先的短視頻平臺&#xff0c;吸引了大量內容創作者。對于創作者而言&#xff0c;了解自己發布的視頻表現&#xff08;如播放量、發布時間等&#xff09;至關重要。本文將介紹如何使用Python的Selenium庫來自動化獲取抖音…

SpringCloud之Eureka

SpringCloud之Eureka 推薦參考&#xff1a;https://www.springcloud.cc/spring-cloud-dalston.html#_service_discovery_eureka_clients 1. 什么是Eureka Eureka 用于簡化分布式系統的服務治理&#xff0c;基于REST的服務&#xff0c;用于服務的注冊與發現。通過注冊發現、客戶…

squash壓縮合并

要將test分支的多次提交合并到dev分支并壓縮為一個commit&#xff0c;核心是使用 git merge --squash 命令&#xff08;壓縮合并&#xff09;&#xff0c;具體步驟如下&#xff1a; 詳細步驟&#xff1a; 1. 切換到dev分支并拉取最新代碼先確保本地dev分支是最新的&#xff0c;…

飛書CEO謝欣:挑戰巨頭,打造AI新時代的Office

引言&#xff1a;飛書要做AI時代辦公協作的逐夢者與破局者。文 | 大力財經在AI浪潮席卷的當下&#xff0c;企業對AI既滿懷期待又充滿焦慮。“AI到底能不能用&#xff1f;AI到底怎么用&#xff1f;”成為縈繞在眾多企業心頭的難題。7月9日召開的飛書未來無限大會&#xff0c;飛書…

React 組件中怎么做事件代理?它的原理是什么?

在 React 組件中&#xff0c;**事件代理&#xff08;Event Delegation&#xff09;**其實是 React 內部實現的一部分&#xff0c;開發者通常無需手動實現事件代理&#xff0c;但理解它的原理和使用方式對于優化性能和掌握底層機制非常重要。一、React 中事件代理的原理React 使…

Vue 2現代模式打包:雙包架構下的性能突圍戰

文章目錄一、場景痛點&#xff1a;兼容性與性能的撕裂二、技術解析&#xff1a;Modern Mode的雙引擎驅動1. 基礎認知&#xff1a;什么是Modern Mode&#xff1f;2. 原理深入&#xff1a;HTML智能分發與Safari 10修復3. 性能收益對比表三、Vue 2項目實戰&#xff1a;啟用Modern模…

UniHttp中HttpApiProcessor生命周期鉤子介紹以及公共參數填充-以百度天氣接口為例

目錄 引言 一、UniHttp與HttpApiProcessor簡介 1、生命周期鉤子的重要性 2、公共參數填充的需求 3、生命周期鉤子相關介紹 二、HttpApiProcessor的實際應用 1、在Yml中定義相關參數 2、自定義HttpAPI注解 3、對接接口的定義 4、HttpApiProcessor的具體實現 5、實際調…

pytorch深度學習—RNN-循環神經網絡

結合生活實例&#xff0c;先簡單認識一下什么是循環神經網絡先想個問題&#xff1a;為什么需要 “循環”&#xff1f;你平時看句子、聽語音、看視頻&#xff0c;都是 “按順序” 來的吧&#xff1f;比如 “我吃蘋果” 和 “蘋果吃我”&#xff0c;字一樣但順序不同&#xff0c;…

深度學習常見名詞解釋、評價指標

目錄 一、魯棒性(robustness) 二、泛化能力&#xff08;Generalization Ability&#xff09; 核心含義&#xff1a; 如何衡量泛化能力&#xff1f; 三、先驗信息&#xff08;Prior Information&#xff09; 四、mIoU &#xff08;Mean Intersection over Union&#xff0…

docker-compose安裝常用中間件

分為3大部分&#xff1a;數據庫&#xff1a;mysql&#xff0c;redis&#xff0c;mongodb&#xff0c;elasticsearch&#xff0c;neo4j&#xff0c;minio&#xff0c;influxdb&#xff0c;canal-server應用中間件&#xff1a;nacos&#xff0c;apollo&#xff0c;zookeeper&…

基于無人機 RTK 和 yolov8 的目標定位算法

目錄 背景 算法思路 代碼實現 驗證 背景 在城市交通巡檢中如何進行車輛違停判斷很重要&#xff0c;一個方法是通過精確坐標判斷車輛中心是否位于違停框中&#xff0c;我們假設無人機坐標已知&#xff0c;并且無人機云臺鏡頭垂直地面朝下&#xff0c;可根據圖像分辨率、無人機參…

go入門 - day1 - 環境搭建

0. 介紹 go語言可以做什么&#xff1f; a. 區塊鏈 b. 分布式/微服務/云原生 c. 服務器/游戲軟件go的優勢 a. 代碼量比C和Java少 b. 編譯速度比Java或者C快上5到6倍&#xff0c;比Scale塊10被 c. 性能比C慢20%&#xff0c;但是比Java、python等快上5到10倍 d. 內存管理和C媲美&a…

【華為OD】MVP爭奪戰(C++、Java、Python)

文章目錄題目描述輸入描述輸出描述示例解題思路算法思路核心步驟代碼實現C實現Java實現Python實現算法要點復雜度分析解題總結題目描述 在星球爭霸籃球賽對抗賽中&#xff0c;最大的宇宙戰隊希望每個人都能拿到MVP&#xff0c;MVP的條件是單場最高分得分獲得者。可以并列所以宇…

Datawhale 2025 AI夏令營 MCP Server Task2

魔搭MCP &Agent賽事&#xff08;MCP Server開發&#xff09;/夏令營&#xff1a;動手開發MCP Server學習鏈接&#xff1a;魔搭MCP &Agent賽事&#xff08;MCP Server開發&#xff09; - Datawhale Task1回顧 1.task1應用功能 luner_info每日黃歷 這是一個可以獲取某天…

敏捷開發方法全景解析

核心理念:敏捷開發是以快速響應變化為核心的項目管理方法論,通過迭代式交付、自組織團隊和持續反饋,實現高質量軟件的高效交付。其本質是擁抱變化優于遵循計劃,強調"可工作的軟件高于詳盡的文檔"。 一、敏捷核心思想體系 #mermaid-svg-y7iyWsQGVWn3IpEi {font-fa…

Socket到底是什么(簡單來說)

簡單來說&#xff1a; Socket 抽象了網絡通信的復雜底層細節&#xff0c;讓應用程序開發者可以專注于發送和接收數據&#xff0c;而不用去操心數據在網絡上是如何傳輸的。 它就像一個“黑盒子”&#xff0c;你只需要把數據扔進去&#xff0c;或者從里面取數據&#xff0c;至于數…

linux系統mysql性能優化

1、系統最大打開文件描述符數查看限制 ulimit -n更改配置 # 第一步 sudo vim /etc/security/limits.conf* soft nofile 1048576 * hard nofile 1048576# 第二步 sudo vim /etc/sysctl.conffs.file-max 1048576# 第三步&#xff08;重啟系統&#xff09; sudo reboot驗證生效 u…