【詳識JAVA語言】面向對象程序三大特性之一:封裝

封裝的概念

面向對象程序三大特性:封裝、繼承、多態。而類和對象階段,主要研究的就是封裝特性。何為封裝呢?簡單來說 就是套殼屏蔽細節

比如:對于電腦這樣一個復雜的設備,提供給用戶的就只是:開關機、通過鍵盤輸入,顯示器,USB插孔等,讓用 戶來和計算機進行交互,完成日常事務。

但實際上:電腦真正工作的卻是CPU、顯卡、內存等一些硬件元件。

對于計算機使用者而言,不用關心內部核心部件,比如主板上線路是如何布局的,CPU內部是如何設計的等,用戶 只需要知道,怎么開機、怎么通過鍵盤和鼠標與計算機進行交互即可。因此計算機廠商在出廠時,在外部套上殼 子,將內部實現細節隱藏起來,僅僅對外提供開關機、鼠標以及鍵盤插孔等,讓用戶可以與計算機進行交互即可。

封裝:將數據和操作數據的方法進行有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來和對象進行 交互

訪問限定符?

Java中主要通過類和訪問權限來實現封裝:類可以將數據以及封裝數據的方法結合在一起,更符合人類對事物的認 知,而訪問權限用來控制方法或者字段能否直接在類外使用。Java中提供了四種訪問限定符:

比如:

public:可以理解為一個人的外貌特征,誰都可以看得到

default: 對于自己家族中(同一個包中)不是什么秘密,對于其他人來說就是隱私了

private:只有自己知道,其他人都不知道?

說明

protected主要是用在繼承中,繼承部分詳細介紹

default權限指:什么都不寫時的默認權限

訪問權限除了可以限定類中成員的可見性,也可以控制類的可見性

public class Computer {private String cpu; // cpuprivate String memory; // 內存public String screen; // 屏幕String brand; // 品牌---->default屬性public Computer(String brand, String cpu, String memory, String screen) {this.brand = brand;this.cpu = cpu;this.memory = memory;this.screen = screen;}public void Boot(){System.out.println("開機~~~");}public void PowerO?(){System.out.println("關機~~~");}public void SurfInternet(){System.out.println("上網~~~"); }}public class TestComputer {public static void main(String[] args) {Computer p = new Computer("HW", "i7", "8G", "13*14");System.out.println(p.brand);?// default屬性:只能被本包中類訪問System.out.println(p.screen); //?public屬性: 可以任何其他類訪問// ?System.out.println(p.cpu);??// private屬性:只能在Computer類中訪問,不能被其他類訪問}}

注意:一般情況下成員變量設置為private,成員方法設置為public。

封裝擴展之包

包的概念

在面向對象體系中,提出了一個軟件包的概念,即:為了更好的管理類,把多個類收集在一起成為一組,稱為軟件包。有點類似于目錄。比如:為了更好的管理電腦中的歌曲,一種好的方式就是將相同屬性的歌曲放在相同文件 下,也可以對某個文件夾下的音樂進行更詳細的分類。

在Java中也引入了包,包是對類、接口等的封裝機制的體現,是一種對類或者接口等的很好的組織方式,比如:一 個包中的類不想被其他包中的類使用。包還有一個重要的作用:在同一個工程中允許存在相同名稱的類,只要處在不同的包中即可。

導入包中的類?

Java 中已經提供了很多現成的類供我們使用. 例如Date類:可以使用類. java.util.Date 導入java.util 這個包中的 Date類

public class Test {public static void main(String[] args) {java.util.Date date = new java.util.Date();// 得到一個毫秒級別的時間戳System.out.println(date.getTime());}}

但是這種寫法比較麻煩一些, 可以使用 import語句導入包.

import java.util.Date; public class Test {public static void main(String[] args) {Date date = new Date(); // 得到一個毫秒級別的時間戳System.out.println(date.getTime());}}

如果需要使用 java.util 中的其他類, 可以使用 import java.util.*

import java.util.*;public class Test {public static void main(String[] args) {Date date = new Date(); // 得到一個毫秒級別的時間戳System.out.println(date.getTime());}}

但是我們更建議顯式的指定要導入的類名. 否則還是容易出現沖突的情況.

import java.util.*;import java.sql.*;public class Test {public static void main(String[] args) {// util 和 sql 中都存在一個 Date 這樣的類, 此時就會出現歧義, 編譯出錯Date date = new Date();System.out.println(date.getTime());}}// 編譯出錯 Error:(5, 9) java: 對Date的引用不明確 java.sql 中的類 java.sql.Date 和 java.util 中的類 java.util.Date 都匹配

在這種情況下需要使用完整的類名

import java.util.*;import java.sql.*;public class Test {public static void main(String[] args) {java.util.Date date = new java.util.Date();System.out.println(date.getTime());}}

可以使用import static導入包中靜態的方法和字段?

注意事項: import 和 C++ 的 #include import 只是為了寫代碼的時候更方便.

import static java.lang.Math.*;public class Test {public static void main(String[] args) {double x = 30;double y = 40;// 靜態導入的方式寫起來更方便一些.// double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));double result = sqrt(pow(x, 2) + pow(y, 2));System.out.println(result);}
}

注意事項: import 和 C++ 的 #include 差別很大. C++ 必須 #include 來引入其他文件內容, 但是 Java 不需要. import 只是為了寫代碼的時候更方便.?import 更類似于 C++ 的 namespace 和 using

自定義包

基本規則

1. 在文件的最上方加上一個 package 語句指定該代碼在哪個包中.

2. 包名需要盡量指定成唯一的名字, 通常會用公司的域名的顛倒形式(例如 com.bit.demo1).

3. 包名要和代碼路徑相匹配. 例如創建 com.bit.demo1 的包, 那么會存在一個對應的路徑

com/bit/demo1?來存儲代碼.

4. 如果一個類沒有 package 語句, 則該類被放到一個默認包中.

操作步驟

1. 在 IDEA 中先新建一個包: 右鍵 src -> 新建 -> 包

2. 在彈出的對話框中輸入包名, 例如 com.bit.demo1?在包中創建類, 右鍵包名 -> 新建 -> 類, 然后輸入類名即可.

4. 此時可以看到我們的磁盤上的目錄結構已經被 IDEA 自動創建出來了

?

5. 同時我們也看到了, 在新創建的 Test.java 文件的最上方, 就出現了一個 package 語句

?包的訪問權限控制舉例

Computer類位于com.bit.demo1包中,TestComputer位置com.bit.demo2包中:

package com.bit.demo1;public class Computer {private String cpu; // cpu 
private String memory; // 內存 
public String screen; // 屏幕 
String brand; // 品牌public Computer(String brand, String cpu, String memory, String screen) { this.brand = brand; 
this.cpu = cpu; 
this.memory = memory; 
this.screen = screen; 
}public void Boot(){ 
System.out.println("開機~~~"); 
}public void PowerO?(){ 
System.out.println("關機~~~"); 
}public void SurfInternet(){ 
System.out.println("上網~~~"); 
} 
}/// package com.bite.demo2;import com.bite.demo1.Computer;public class TestComputer { public static void main(String[] args) {Computer p = new Computer("HW", "i7", "8G", "13*14");System.out.println(p.screen); 
// System.out.println(p.cpu); // 報錯:cup是私有的,不允許被其他類訪問 // System.out.println(p.brand); // 報錯:brand是default,不允許被其他包中的類訪問}}// 注意:如果去掉Computer類之前的public修飾符,代碼也會編譯失敗

常見的包?

1. java.lang:系統常用基礎類(String、Object),此包從JDK1.1后自動導入。

2. java.lang.re?ect:java 反射編程包;

3. java.net:進行網絡編程開發包。

4. java.sql:進行數據庫開發的支持包。

5. java.util:是java提供的工具程序包。(集合類等) 非常重要

6. java.io:I/O編程開發包。

static成員

再談學生類

使用前文中介紹的學生類實例化三個對象s1、s2、s3,每個對象都有自己特有的名字、性別,年齡,學分績點等成 員信息,這些信息就是對不同學生來進行描述的,如下所示:

public class Student{// ...public static void main(String[] args) {Student s1 = new Student("Li leilei", "男", 18, 3.8);Student s2 = new Student("Han MeiMei", "女", 19, 4.0);Student s3 = new Student("Jim", "男", 18, 2.6); }}

?

假設三個同學是同一個班的,那么他們上課肯定是在同一個教室,那既然在同一個教室,那能否給類中再加一個成 員變量,來保存同學上課時的教室呢?答案是不行的。

之前在Student類中定義的成員變量,每個對象中都會包含一份(稱之為實例變量),因為需要使用這些信息來描述 具體的學生。而現在要表示學生上課的教室,這個教室的屬性并不需要每個學生對象中都存儲一份,而是需要讓所 有的學生來共享。在Java中,被static修飾的成員,稱之為靜態成員,也可以稱為類成員,其不屬于某個具體的對象,是所有對象所共享的。

static修飾成員變量

?static修飾的成員變量,稱為靜態成員變量,靜態成員變量最大的特性:不屬于某個具體的對象,是所有對象所共享的。

【靜態成員變量特性】

1. 不屬于某個具體的對象,是類的屬性,所有對象共享的,不存儲在某個對象的空間中

2. 既可以通過對象訪問,也可以通過類名訪問,但一般更推薦使用類名訪問

3. 類變量存儲在方法區當中

4. 生命周期伴隨類的一生(即:隨類的加載而創建,隨類的卸載而銷毀)

public class Student{public String name; 
public String gender; 
public int age; 
public double score; 
public static String classRoom = "Bit306";// ...public static void main(String[] args) {// 靜態成員變量可以直接通過類名訪問 
System.out.println(Student.classRoom);Student s1 = new Student("Li leilei", "男", 18, 3.8); 
Student s2 = new Student("Han MeiMei", "女", 19, 4.0); 
Student s3 = new Student("Jim", "男", 18, 2.6);// 也可以通過對象訪問:但是classRoom是三個對象共享的 
System.out.println(s1.classRoom); 
System.out.println(s2.classRoom);
System.out.println(s3.classRoom); 
}}

大家以調試方式運行上述代碼,然后在監視窗口中可以看到,靜態成員變量并沒有存儲到某個具體的對象中。

static修飾成員方法

一般類中的數據成員都設置為private,而成員方法設置為public,那設置之后,Student類中classRoom屬性如何 在類外訪問呢?

public class Student{
private String name; 
private String gender; 
private int age; 
private double score; 
private static String classRoom = "Bit306";// ...}public class TestStudent { 
public static void main(String[] args) { 
System.out.println(Student.classRoom); 
} 
}編譯失敗:Error:(10, 35) java: classRoom 在 extend01.Student 中是 private 訪問控制

那static屬性應該如何訪問呢?

Java中,被static修飾的成員方法稱為靜態成員方法,是類的方法,不是某個對象所特有的。靜態成員一般是通過 靜態方法來訪問的。

public class Student{ // ...private static String classRoom = "Bit306";// ...public static String getClassRoom(){ 
return classRoom; 
}}public class TestStudent {public static void main(String[] args) { System.out.println(Student.getClassRoom()); }} 
輸出:Bit306

【靜態方法特性】

1. 不屬于某個具體的對象,是類方法

2. 可以通過對象調用,也可以通過類名.靜態方法名(...)方式調用,更推薦使用后者

3. 不能在靜態方法中訪問任何非靜態成員變量

public static String getClassRoom(){ 
System.out.println(this); 
return classRoom; 
}// 編譯失敗:Error:(35, 28) java: 無法從靜態上下文中引用非靜態 變量 thispublic static String getClassRoom(){age += 1;return classRoom;}// 編譯失敗:Error:(35, 9) java: 無法從靜態上下文中引用非靜態 變量 age

4. 靜態方法中不能調用任何非靜態方法,因為非靜態方法有this參數,在靜態方法中調用時候無法傳遞this引用

public static String getClassRoom(){ 
doClass(); 
return classRoom; 
}// 編譯報錯:Error:(35, 9) java: 無法從靜態上下文中引用非靜態 方法 doClass()

static成員變量初始化

注意:靜態成員變量一般不會放在構造方法中來初始化,構造方法中初始化的是與對象相關的實例屬性 靜態成員變量的初始化分為兩種:就地初始化 和 靜態代碼塊初始化。

1. 就地初始化

就地初始化指的是:在定義時直接給出初始值

public class Student{private String name;private String gender;private int age;private double score;private static String classRoom = "Bit306";// ...}

2. 靜態代碼塊初始化

那什么是代碼塊呢?繼續往后看 :) ~~~

代碼塊

代碼塊概念以及分類

使用 {}定義的一段代碼稱為代碼塊。根據代碼塊定義的位置以及關鍵字,又可分為以下四種:

普通代碼塊

構造塊

靜態塊

同步代碼塊(后續講解多線程部分再談)

普通代碼塊

普通代碼塊:定義在方法中的代碼塊.

public class Main{public static void main(String[] args) { 
{ //直接使用{}定義,普通方法塊int x = 10 ;System.out.println("x1 = " +x);}int x = 100 ;System.out.println("x2 = " +x);}}// 執行結果x1 = 10x2 = 100

這種用法較少見

構造代碼塊

構造塊:定義在類中的代碼塊(不加修飾符)。也叫:實例代碼塊。構造代碼塊一般用于初始化實例成員變量。

public class Student{//實例成員變量private String name;private String gender;private int age;private double score;public Student() {System.out.println("I am Student init()!");}//實例代碼塊{this.name = "bit";this.age = 12;this.sex = "man";System.out.println("I am instance init()!");}public void show(){System.out.println("name: "+name+" age: "+age+" sex: "+sex);}}public class Main {public static void main(String[] args) {Student stu = new Student(); stu.show();}}// 運行結果I am instance init()!I am Student init()!name: bit age: 12 sex: man

靜態代碼塊

使用static定義的代碼塊稱為靜態代碼塊。一般用于初始化靜態成員變量。

public class Student{private String name;private String gender;private int age; private double score;private static String classRoom;//實例代碼塊{this.name = "bit";this.age = 12;this.gender = "man";System.out.println("I am instance init()!");}// 靜態代碼塊static {classRoom = "bit306";System.out.println("I am static init()!");}public Student(){System.out.println("I am Student init()!");}public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();}}

注意事項

靜態代碼塊不管生成多少個對象,其只會執行一次

靜態成員變量是類的屬性,因此是在JVM加載類時開辟空間并初始化的

如果一個類中包含多個靜態代碼塊,在編譯代碼時,編譯器會按照定義的先后次序依次執行(合并)

實例代碼塊只有在創建對象時才會執行

內部類

當一個事物的內部,還有一個部分需要一個完整的結構進行描述,而這個內部的完整的結構又只為外部事物提供服 務,那么這個內部的完整結構最好使用內部類。在 Java 中,可以將一個類定義在另一個類或者一個方法的內部, 前者稱為內部類,后者稱為外部類。內部類也是封裝的一種體現。

public class OutClass { 
class InnerClass{}}// OutClass是外部類 
// InnerClass是內部類

【注意事項】

1. 定義在class 類名{}花括號外部的,即使是在一個文件里,都不能稱為內部類

public class A{}class B{}// A 和 B是兩個獨立的類,彼此之前沒有關系

2. 內部類和外部類共用同一個java源文件,但是經過編譯之后,內部類會形成單獨的字節碼文件

內部類的分類

先來看下,內部類都可以在一個類的那些位置進行定義

public class OutClass {// 成員位置定義:未被static修飾 --->實例內部類 
public class InnerClass1{ }// 成員位置定義:被static修飾 ---> 靜態內部類 
static class InnerClass2{}public void method(){// 方法中也可以定義內部類 ---> 局部內部類:幾乎不用 
class InnerClass5{}}}

根據內部類定義的位置不同,一般可以分為以下幾種形式:

1. 成員內部類(普通內部類:未被static修飾的成員內部類 和 靜態內部類:被static修飾的成員內部類)

2. 局部內部類(不談修飾符)、匿名內部類

注意:內部類其實日常開發中使用并不是非常多,大家在看一些庫中的代碼時候可能會遇到的比較多,日常開始中 使用最多的是匿名內部類。

內部類

在外部類中,內部類定義位置與外部類成員所處的位置相同,因此稱為成員內部類。

實例內部類

即未被static修飾的成員內部類。

public class OutClass {private int a; 
static int b; 
int c; public void methodA(){a = 10;System.out.println(a);}public static void methodB(){ System.out.println(b); }// 實例內部類:未被static修飾 class InnerClass{int c; public void methodInner(){ // 在實例內部類中可以直接訪問外部類中:任意訪問限定符修飾的成員a = 100;b =200;methodA(); methodB();// 如果外部類和實例內部類中具有相同名稱成員時,優先訪問的是內部類自己的c = 300;System.out.println(c);// 如果要訪問外部類同名成員時候,必須:外部類名稱.this.同名成員名字 OutClass.this.c = 400; System.out.println(OutClass.this.c);}}public static void main(String[] args) {// 外部類:對象創建 以及 成員訪問 OutClass outClass = new OutClass(); System.out.println(outClass.a); System.out.println(outClass.b); System.out.println(outClass.c); outClass.methodA(); outClass.methodB();System.out.println("=============實例內部類的訪問=============");// 要訪問實例內部類中成員,必須要創建實例內部類的對象 
// 而普通內部類定義與外部類成員定義位置相同,因此創建實例內部類對象時必須借助外部類// 創建實例內部類對象 
OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();// 上述語法比較怪異,也可以先將外部類對象先創建出來,然后再創建實例內部類對象 OutClass.InnerClass innerClass2 = outClass.new InnerClass(); innerClass2.methodInner();} }

【注意事項】

1. 外部類中的任何成員都可以在實例內部類方法中直接訪問

2. 實例內部類所處的位置與外部類成員位置相同,因此也受public、private等訪問限定符的約束

3. 在實例內部類方法中訪問同名的成員時,優先訪問自己的,如果要訪問外部類同名的成員,必須:外部類名 稱.this.同名成員 來訪問

4. 實例內部類對象必須在先有外部類對象前提下才能創建

5. 實例內部類的非靜態方法中包含了一個指向外部類對象的引用

6. 外部類中,不能直接訪問實例內部類中的成員,如果要訪問必須先要創建內部類的對象。

靜態內部類

被static修飾的內部成員類稱為靜態內部類。

public class OutClass {private int a; 
static int b; 
public void methodA(){a = 10;System.out.println(a);}public static void methodB(){ 
System.out.println(b); }// 靜態內部類:被static修飾的成員內部類 
static class InnerClass{public void methodInner(){ 
// 在內部類中只能訪問外部類的靜態成員 
// a = 100; // 編譯失敗,因為a不是類成員變量b =200;// methodA(); methodB();// 編譯失敗,因為methodB()不是類成員方法}}public static void main(String[] args) { 
// 靜態內部類對象創建 & 成員訪問 
OutClass.InnerClass innerClass = new OutClass.InnerClass(); innerClass.methodInner(); }}

【注意事項】

1. 在靜態內部類中只能訪問外部類中的靜態成員

如果確實想訪問,我們該如何做?

2. 創建靜態內部類對象時,不需要先創建外部類對象

局部內部類

定義在外部類的方法體或者{}中,該種內部類只能在其定義的位置使用,一般使用的非常少,此處簡單了解下語法格式。

public class OutClass {int a = 10;public void method(){int b = 10;// 局部內部類:定義在方法體內部 // 不能被public、static等訪問限定符修飾 
class InnerClass{public void methodInnerClass(){System.out.println(a);System.out.println(b);} 
}// 只能在該方法體內部使用,其他位置都不能用 
InnerClass innerClass = new InnerClass(); 
innerClass.methodInnerClass();}public static void main(String[] args) { 
// OutClass.InnerClass innerClass = null; 編譯失敗 }}

【注意事項】

1. 局部內部類只能在所定義的方法體內部使用

2. 不能被public、static等修飾符修飾

3. 編譯器也有自己獨立的字節碼文件,命名格式:外部類名字$數字內部類名字.class

4. 幾乎不會使用

對象的打印

public class Person { String name; String gender; int age;public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; 
}public static void main(String[] args) { Person person = new Person("Jim","男", 18); System.out.println(person); }}// 打印結果:day20210829.Person@1b6d3586

如果想要默認打印對象中的屬性該如何處理呢?答案:重寫toString方法即可。

public class Person { String name; String gender; int age;public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; 
}@Override 
public String toString() { return "[" + name + "," + gender + "," + age + "]"; }public static void main(String[] args) { Person person = new Person("Jim","男", 18); System.out.println(person); }}// 輸出結果:[Jim,男,18]

???????

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

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

相關文章

飛槳模型轉ONNX模型教程

文章目錄 飛槳模型轉ONNX模型教程1. ONNX簡介2. Paddle2ONNX安裝3. 獲取Paddle2ONNX模型庫4. 飛槳轉ONNX教程4.1 飛槳訓練模型導出為ONNX模型4.2 飛槳部署模型轉為ONNX模型4.3 驗證ONNX模型4.4 使用ONNX模型進行推理 5. 注意事項 飛槳模型轉ONNX模型教程 1. ONNX簡介 ONNX是一…

管理系統提升:列表頁構成要素,拒絕千篇一律

大家伙,我是大千UI工場,專注UI知識案例分享和接單,本期帶來B端系統列表頁的分享,歡迎大家關注、互動交流。 一、什么是列表頁 管理系統列表頁是指管理系統中用于展示和管理數據的頁面,通常以表格或列表的形式呈現。列…

【appium】APP元素操作Api、androidDriver操作Api

一、元素操作Api 主要是做斷言 text 1、click()——觸發當前元素的點擊事件 2、sendKeys(...)——輸入數據 3、clear()——清空內容 4、getAttribute() ——獲取屬性值 字符串類型屬性: content-desc(返回content-desc屬性值) text(返…

C語言中結構體成員訪問操作符的含義及其用法

1.直接訪問操作符 用法&#xff1a;結構體名.成員名。 含義&#xff1a;直接訪問結構體中的成員變量。 示例&#xff1a; #include<stdio.h> struct student {char name[20];int age; }; int main() {//定義了一個結構體數組arrstruct student arr[4] { {"cxk&q…

產品經理相關的學習網站

一、原型案例 AxureShop產品原型網&#xff1a; https://www.axureshop.com/ 人人都是產品經理&#xff1a;https://www.woshipm.com/ 二、如何找各類圖標、各類圖表 各類圖標&#xff1a; IconPark&#xff1b; 各類圖表&#xff1a;echarts.apache.org&#xff08;柱狀圖、餅…

深入淺出HTTP/2預檢請求(CORS Preflight Request)

前言 在現代Web開發中&#xff0c;跨域資源共享&#xff08;Cross-Origin Resource Sharing&#xff0c;簡稱CORS&#xff09;是一項關鍵技術&#xff0c;它允許瀏覽器在不同源之間安全地執行Ajax請求。當一個來自不同源的請求涉及到一些特殊 HTTP 頭部或者方法時&#xff0c;…

23端口登錄的Telnet命令+傳輸協議FTP命令

一、23端口登錄的Telnet命令 Telnet是傳輸控制協議/互聯網協議&#xff08;TCP/IP&#xff09;網絡&#xff08;如Internet&#xff09;的登錄和仿真程序&#xff0c;主要用于Internet會話。基本功能是允許用戶登錄進入遠程主機程序。 常用的Telnet命令 Telnet命令的格式為&…

有人吐槽:可視化大屏面向領導的設計,真相是這樣嗎?

某些老鐵的態度很極端&#xff0c;看到可視化大屏頁面就一口斷定&#xff0c;除了討好領導之外&#xff0c;屁用沒有。真相是這樣嗎&#xff1f;貝格前端工場嘗試給老鐵們分析下。 一、可視化大屏確實要面向領導&#xff0c;但不是討好領導 可視化大屏的設計需要考慮領導和管理…

整理的一些腦模板及節點的名稱

整理的一些腦模板及節點的名稱 前言模板簡介AAL90模板HOA112 模板 前言 自己看論文找的&#xff0c;因為有些數據集網站的確有點難找到模板的名稱等等。所以主要是看一些論文&#xff0c;因為有文獻&#xff0c;所以更有保障一些。當然也有一些在數據網站上比較容易找到所以一…

社交軟件----

story feed(聚合服務) 查 聯表查詢 表冗余字段java拼接user_service查詢用戶的avator和nick_namefollow_service查詢我是否關注item_service查詢我的in_box in_box如何設計redis zset 關注 數據庫設計 MySQL 根據ER圖設計表 create table follow(id bigint unsigned n…

小興教你做平衡小車-stm32程序開發(按鍵掃描)

文章目錄 1 單片機最小系統板按鍵原理圖介紹2 庫函數程序設計3 寄存器程序設計4 效果展示 1 單片機最小系統板按鍵原理圖介紹 從圖中看出單片機的PB12引腳接到了按鍵上。 根據按鍵的原理圖&#xff0c;可以分析得到&#xff0c;如果不按下按鍵的時候&#xff0c;引腳輸入的是…

【Linux】frp內網穿透詳細教程(簡單易懂)

frp內網穿透詳細教程&#xff08;簡單易懂&#xff09; 文章目錄 frp內網穿透詳細教程&#xff08;簡單易懂&#xff09;frp是什么&#xff1f;工作原理準備工作frp工具的使用第一步&#xff1a;下載安裝包第二步&#xff1a;公網部署frps第三步&#xff1a;內網部署frpc第四步…

適配華為“純血鴻蒙”,抖音開始招聘相關人才

目前&#xff0c;字節跳動上線了“大前端高級開發工程師”一職&#xff0c;開始招聘鴻蒙人才。 根據職位描述&#xff0c;該崗位負責抖音大前端基礎工程與架構設計&#xff0c;以及抖音大前端基礎設施建設。 該職位需要有前端工程化經驗&#xff0c;熟悉JavaScript/TypeScrip…

關于BT站

BT站&#xff0c;全稱BitTorrent站點&#xff0c;是一種基于BitTorrent協議的P2P&#xff08;點對點&#xff09;文件共享網站。BitTorrent是一種分布式文件共享協議&#xff0c;允許用戶直接在彼此之間傳輸文件&#xff0c;而不需要依賴于中央服務器。BT站提供種子文件&#x…

斐波那契數列模型---使用最小花費爬樓梯

746. 使用最小花費爬樓梯 - 力扣&#xff08;LeetCode&#xff09; 1、狀態表示&#xff1a; 題目意思即&#xff1a;cost[i]代表從第i層向上爬1階或者2階&#xff0c;需要花費多少力氣。如cost[0]&#xff0c;代表從第0階爬到第1階或者第2階需要cost[0]的力氣。 一共有cost.…

springboot/ssm學院個人信息管理系統Java高校課程作業管理系統web

springboot/ssm學院個人信息管理系統Java高校課程作業管理系統web 基于springboot(可改ssm)vue項目 開發語言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xf…

編寫高質量Python (第35條) 不要通過 throw 變換生成器狀態

第 35 條 不要通過 throw 變換生成器狀態 ? 除 yield from 表達式(參見 第 33 條) 與 send 方法&#xff08;參見 第 34 條&#xff09;外&#xff0c;生成器還有一個高級功能&#xff0c;就是可以把調用者通過 throw 方法傳過來的 Exception 實例重新拋出。這個 throw 方法用…

Vue 3 中的 Teleport 特性詳解

引言 在 Vue 3 中&#xff0c;引入了一個名為 Teleport 的新特性。這個特性允許開發者將組件的子組件“傳送”到 DOM 中的任意位置&#xff0c;而不僅僅是它們的直接父級內部。這一功能在處理如模態框、彈出菜單、提示框等需要從其原始位置在視覺上移動到其他地方的用戶界面元…

Spring Boot與Spring Boot MVC:構建現代化Web應用的利器

Spring Boot與Spring Boot MVC&#xff1a;構建現代化Web應用的利器 在當今的軟件開發領域&#xff0c;特別是在Java生態系統中&#xff0c;Spring框架已經成為構建企業級應用程序的首選。而在Spring的眾多子項目中&#xff0c;Spring Boot和Spring MVC是兩個非常重要的組成部…