Java基礎教程 - 7 面向對象-1

更好的閱讀體驗:點這里 ( www.doubibiji.com
更好的閱讀體驗:點這里 ( www.doubibiji.com
更好的閱讀體驗:點這里 ( www.doubibiji.com

7 面向對象

面向對象,首先涉及到的兩個概念就是:對象

什么是類?

類就是對現實事物的抽象設計。

例如設計學生的類,可能包括屬性:學號,姓名、年齡、性別等。

設計狗的類,可能包括屬性:名字、年齡、品種。

類表示的是對一個事物的抽象,不是具體的某個事物。

什么是對象?

對象就是一個具體的實例,這個實例是從類派生出來的。

我們將類的屬性賦值,就產生了一個個實例,也就是對象。

例如通過學生的類,我們賦值:學號=001,姓名=張三,年齡=16,性別=男,班級=三年二班,產生了就是一個名字叫張三的具體的學生,這樣我們通過給類可以派生出一個個不同屬性值的對象,李四、王五、趙六…。

所以是先設計類,然后根據類來生成一個個對象。

7.1 類和對象

1 類的定義

類中可以定義屬性和行為,屬性也就是成員變量,表示這個類有哪些數據信息,行為也叫成員方法,表示這個類能干什么。

例如,對于學生類而言,學號、姓名、年級就是屬性,學習這個行為,可以定義為方法。

那么我們可以定義以下學生類:

/***定義類使用class關鍵字,后面跟類名*/
class Student {public String sid;public String name;public int age;public void study() {System.out.println("我是" + name + ", 我在學習");}
}

上面的類定義了三個成員變量(sid、name、age),public 表示訪問修飾符,用來限制屬性的訪問權限,后面再講,現在使用 public。后面是變量類型和變量的名稱。

還定義了一個成員方法 study(),定義成員方法和之前定義靜態方法是一樣的,只是沒有 static 關鍵字。

2 類的使用

上面我們定義好類了,現在可以使用類來創建對象了。

/*** 定義學生類*/
class Student {public String sid;public String name;public int age;public void study() {System.out.println("我是" + name + ", 我在學習");}
}/*** 測試類*/
public class Test {public static void main(String[] args) {Student stu = new Student();   // 創建對象stu.sid = "001";        // 為對象的sid屬性賦值stu.name = "張三";       // 為對象的name屬性賦值,現在學生是張三了stu.age = 18;System.out.println(stu.name);   // 打印名稱stu.study();       // 使用對象調用方法}
}

因為 Java 中所有的代碼都要放到類中,這里將測試的 main 方法放到了另一個類中,當然 main 方法放到 Student 中也是可以的,這里為了結構清晰。

首先通過 new Student() 可以創建一個 Student 對象,賦值給 Student 類型的變量 stu

創建對象后,我們可以通過 對象.屬性 來訪問變量,也可以通過 對象.屬性=值 來給屬性賦值。

使用 對象.方法() 可以調用方法。

執行結果:

張三
我是張三, 我在學習

面向對象編程就是先設計類,然后通過類創建對象,由對象做具體的工作。

3 默認構造方法

在上面創建對象后,使用 對象.屬性=值 來給屬性賦值,有點麻煩,我們可以在創建對象的時候,直接傳遞參數,給屬性賦值。

這里就需要用到 構造方法。構造方法會在創建對象的時候自動執行,通過傳遞的屬性值,給屬性進行初始化。

舉個栗子:

構造方法的名稱和類的名稱是一致的,沒有返回值類型。

/*** 定義類*/
class Student {public String sid;public String name;public int age;/*** 構造方法*/public Student(String sid, String name, int age) {this.sid = sid;			// this.sid 訪問的是屬性,sid 是方法的形參this.name = name;this.age = age;}public void study() {System.out.println("我是" + name + ", 我在學習");}
}/*** 測試類*/
public class Test{public static void main(String[] args) {// 創建張三Student stu1 = new Student("001", "張三", 18);stu1.study();// 創建李四Student stu2 = new Student("002", "李四", 19);stu2.study();}
}

在上面的代碼中,定義了構造方法,接收三個參數 (String sid, String name, int age),在構造方法中,分別將三個參數賦值給類中的成員變量。

因為構造方法的參數和類中的成員變量名稱相同了(也可以不同),所以如果在構造方法中直接使用變量名,訪問的將是構造方法的參數,訪問不到成員變量,如果要訪問成員,需要使用 this 關鍵字。

當然在 study() 方法中,沒有參數和成員變量 name 同名,所以 name 訪問到的就是成員變量,可以不用 this (當然使用也沒毛病)。

在創建對象的時候,就可以傳遞參數為對象的屬性賦值: new Student("001", "張三", 18)每次 new 就會創建新的對象,每個對象是獨立的,所以上面張三和李四對象是獨立的兩個對象,修改其中一個對象的值,不會影響另一個對象。

執行結果:

我是張三, 我在學習
我是李四, 我在學習

4 this的作用

在上面的代碼中用到了 this,因為上面我們寫構造方法的時候,形參和類的屬性名相同(當然也可以不同),導致在構造方法中,使用 sid/name/age 無法訪問到類的屬性,使用this,就表示訪問的是屬性 。

其實 this 表示的是調用當前方法的對象。如何理解?

舉個栗子:

下面的代碼,我們定義了學生類,創建了兩個學生的對象。

/*** 定義類*/
class Student {public String sid;public String name;public int age;/*** 構造方法*/public Student(String sid, String name, int age) {this.sid = sid;			// this.sid 訪問的是屬性,sid 是方法的形參this.name = name;this.age = age;}public void study() {System.out.println("我是" + this.name + "我" + age +"歲了" + ", 我在學習");}
}/*** 測試類*/
public class Test{public static void main(String[] args) {// 創建張三Student stu1 = new Student("001", "張三", 18);stu1.study();// 創建李四Student stu2 = new Student("002", "李四", 19);stu2.study();}
}

執行結果:

我是張三, 我18歲了, 我在學習
我是李四, 我19歲了, 我在學習

當我們使用 stu1 調用 study() 方法的時候,this 就是指 張三 (stu1)這個對象,那么 this.name 的值就是張三;當我們使用 stu2 調用 study() 方法的時候,this 就是指 李四 (stu2) 這個對象,那么 this.name 的值就是李四。this 就是調用當前方法的對象。

5 對象內存解析

先查看下面的代碼:

Student stu1 = new Student();   // 創建張三對象
stu1.sid = "001";        
stu1.name = "張三";
stu1.age = 18;Student stu2 = new Student();   // 創建李四對象
stu2.sid = "002";        
stu2.name = "李四";
stu2.age = 19;Student stu3 = stu1;
stu3.name = "王五";        System.out.println(stu1.name);   // 王五
System.out.println(stu2.name);   // 李四
System.out.println(stu3.name);   // 王五

在上面的代碼中,首先創建了兩個對象賦值給了 stu1 和 stu2,并對屬性進行賦值,然后定義了一個 stu3 的變量,將 stu1 賦值給了 stu3,我們前面說過 stu1 和 stu2 是獨立的兩個對象,那么 stu1 和 stu3 是獨立的兩個對象嗎?兩個是同一個對象。下面畫一下內存示意圖:

創建完 stu1 并賦值后,內存結構如下(其實字符串是不保存在堆或棧中的,這里簡化了):

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

創建完 stu2 并賦值后,內存結構如下:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

Student stu3 = stu1 執行完,內存結構如下:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

stu3.name = "王五"; 執行完成,內存結構如下:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

所以只在 new 的時候才會創建新的對象,stu3 = stu1 只是將 stu1 執行的對象的引用賦值給了 stu3 。

6 靜態變量

上面我們定義的屬性和方法,是實例變量和實例方法,也叫成員變量和成員方法。

實例變量對于每個實例而言,是獨立的數據,每個對象之間相互不會影響。創建一個對象,就會開辟獨立的內存空間保存對象的實例變量數據。但是無論創建多少對象,實例方法只有一份,所有對象共享,通過 this,來確定是哪個對象調用了實例方法。

在類中還可以定義各個對象共享的數據,也就是靜態變量。

打個比方,我們定義了一個 Student 類,然后通過 Student 類來創建對象,我們想知道一共創建了多少個 Student 對象,應該如何操作呢?

我們可以通過定義 靜態變量 來實現,靜態變量和成員變量的區別就是:前面通過 static 關鍵字來修飾。

/*** 定義類*/
class Student {public static int stuCount = 0;		// 定義一個靜態變量,用于記錄創建的對象個數public String sid;public String name;public int age;/*** 構造方法*/public Student(String sid, String name, int age) {stuCount++;				  // 創建對象會調用構造方法,調用一次就+1this.sid = sid;			// this.sid 訪問的是屬性,sid 是方法的形參this.name = name;this.age = age;}
}/*** 測試類*/
public class Test{public static void main(String[] args) {Student stu1 = new Student("001", "張三", 18);Student stu2 = new Student("002", "李四", 19);Student stu3 = new Student("003", "王五", 20);// 通過類名訪問System.out.println(Student.stuCount);		// 輸出: 3// 通過對象也可以訪問System.out.println(stu1.stuCount);		// 輸出: 3System.out.println(stu2.stuCount);		// 輸出: 3System.out.println(stu3.stuCount);		// 輸出: 3}
}

在上面的代碼中,我們定義了一個類,然后在類中定義了一個 stuCount 靜態變量。當創建對象的時候,會調用構造方法,我們在構造方法中將 stuCount++,這樣就可以記錄調用構造方法的次數。

靜態變量用來定義那些所有對象共享的數據。

**靜態變量是屬于類的,而不是屬于類的實例。在類的方法中,如果沒有局部變量和靜態變量重名,那么可以直接使用靜態變量,就像上面在構造方法中一樣,如果有局部變量和靜態變量重名,可以使用 類名.靜態變量 來訪問。 **

在類外,像上面在 Test 類中訪問 Student 類中的靜態變量,那么可以通過 類名.靜態變量 來賦值和訪問,也可以通過 對象.靜態變量 來訪問,但是推薦使用 類名.靜態變量

7 靜態方法

除了靜態變量,還有靜態方法。靜態變量也是屬于類的,而不是屬于類的實例。

靜態方法通過 static 關鍵字來修飾的方法,之前在學習方法的時候,我們定義的全是靜態方法。

/*** 定義類*/
class Student {public static int stuCount = 0;		// 定義一個靜態變量,用于記錄創建的對象個數public String sid;public String name;public int age;/*** 構造方法*/public Student(String sid, String name, int age) {stuCount++;				// 創建對象會調用構造方法,調用一次就+1this.sid = sid;			// this.sid 訪問的是屬性,sid 是方法的形參this.name = name;this.age = age;}public void study() {System.out.println("我正在學習");}/*** 定義靜態方法*/public static void getStuCount() {System.out.println("一共創建了" + stuCount + "個學生");// System.out.println(name);   // 靜態方法中無法訪問成員變量// study();  // 靜態方法中無法調用成員方法}
}/*** 測試類*/
public class Test{public static void main(String[] args) {// 創建張三new Student("001", "張三", 18);// 創建李四new Student("002", "李四", 19);// 創建王五new Student("003", "王五", 20);Student.getStuCount();		// 輸出: 一共創建了3個學生}
}

在靜態方法不能訪問成員變量和成員方法,因為靜態方法是通過 類.靜態方法() 調用的,不是通過對象實例來調用的,所以如果在靜態方法中調用的成員變量沒法確定是哪個實例的變量。但是在成員方法中是可以訪問靜態變量和靜態方法的。


靜態方法一般用來定義一些工具類,例如定義一個字符串的工具類:

public class StringUtils {/*** 判斷字符串是否為空*/public static boolean isEmpty(String arg) {// trim()方法是去掉字符串的前后空格return (null == arg || arg.trim().length() < 1);}/*** 判斷字符串是否不為空*/public static boolean isNotEmpty(String arg) {return !isEmpty(arg);}// ...定義其他的工具方法
}

定義完工具類,我就可以在其他的類中,通過 StringUtils.isEmpty("字符串") 來調用這個工具類中的方法了。

8 局部變量和全局變量

變量的作用域也就是在哪里可以訪問到這個變量。按照作用域的不同,變量可分為 局部變量全局變量

什么是局部變量?

局部變量就是在方法中(包括方法的參數)或代碼塊中(例如for循環中定義的變量)定義的變量,這些變量只能在該方法中進行訪問,其他方法中無法訪問。

什么是全局變量?

全局變量就是類的屬性,這些變量可以在多個方法中進行訪問。


局部變量和全局變量除了作用域不同,還有一些地方也不同:

  • 權限修飾符:全局變量是類的屬性,可以添加權限修飾符,我們目前只使用了 public,局部變量沒有權限修飾符,關于權限修飾符后面再講解;
  • 初始化:全局變量有初始化值,而局部變量在使用前,需要自己進行初始化,否則無法使用;
  • 內存中的位置:全局變量是保存在堆中的,而局部變量(非static,static是保存在虛擬機的方法區中的)是保存在棧中的。

關于全局變量的初始化值,在這里舉個栗子:

/*** 定義類*/
class DataClass {public byte byteValue;public short shortValue;public int intValue;public long longValue;public float floatValue;public double doubleValue;public boolean booleanValue;public char charValue;public String stringValue;
}/*** 測試類*/
public class Test{public static void main(String[] args) {DataClass data = new DataClass();System.out.println(data.byteValue);     // 0System.out.println(data.shortValue);    // 0System.out.println(data.intValue);      // 0System.out.println(data.longValue);     // 0System.out.println(data.floatValue);    // 0.0System.out.println(data.doubleValue);   // 0.0System.out.println(data.booleanValue);  // falsechar c = 0;System.out.println(data.charValue == c);// trueSystem.out.println(data.stringValue);   // null}
}

在上面的代碼中,我們并沒有對類的屬性進行初始化,但是類中的屬性會默認有初始化值。

byte、short、int、long、char默認初始化值為 0float、double 默認初始化值為 0.0boolean 默認初始化值為 false引用類型的默認初始化值為 null

9 構造方法的重載

如果一個類中,沒有顯式的構造方法,那么會有一個隱式的無參構造方法。

class Student {public String sid;public String name;public int age;
}public class ObjectTest {public static void main(String[] args) {// 這里的Student()調用的就是默認隱式的構造方法Student stu = new Student();}
}

此時創建 Student 類對象,就是調用的隱式無參構造方法。當然,我們也可以手動寫一個無參構造方法。

class Student {public String sid;public String name;public int age;public Student() {System.out.println("無參構造方法");}
}public class ObjectTest {public static void main(String[] args) {Student stu = new Student();	// 打印:無參構造方法}
}

當我們手動寫了顯式的無參構造方法,那么就會調用這個顯式的無參構造方法了。

如果我們顯式的寫了有參的構造方法,那么隱式的無參構造方法就沒有了,所以在創建對象的時候,就必須傳遞參數。

舉個栗子:

class Student {public String sid;public String name;public int age;public Student(String sid, String name, int age) {this.sid = sid;this.name = name;this.age = age;}
}public class ObjectTest {public static void main(String[] args) {// Student stu = new Student();  // 報錯,沒有無參構造方法了Student stu = new Student("001", "ZhangSan", 18);}
}

當然構造方法也是可以重載的,我們可以定義多個構造方法。

class Student {public String sid;public String name;public int age;public Student() {System.out.println("無參構造方法");}public Student(String sid, String name) {System.out.println("有參構造方法: sid, name");this.sid = sid;this.name = name;}public Student(String sid, String name, int age) {System.out.println("有參構造方法: sid, name, age");this.sid = sid;this.name = name;this.age = age;}
}public class ObjectTest {public static void main(String[] args) {Student stu1 = new Student();Student stu2 = new Student("001", "ZhangSan");Student stu3 = new Student("001", "ZhangSan", 18);}
}

執行結果:

無參構造方法
有參構造方法: sid, name
有參構造方法: sid, name, age


那么如何在一個構造方法中調用另一個構造方法呢?

使用 this([參數]) 來調用,舉個栗子:

class Student {public String sid;public String name;public int age;public Student() {System.out.println("無參構造方法");}public Student(String sid, String name) {this();	// 調用無參構造方法System.out.println("有參構造方法: sid, name");this.sid = sid;this.name = name;}public Student(String sid, String name, int age) {this(sid, name);	// 調用其他的構造方法System.out.println("有參構造方法: sid, name, age");this.sid = sid;this.name = name;this.age = age;}
}public class ObjectTest {public static void main(String[] args) {Student stu1 = new Student();Student stu2 = new Student("001", "ZhangSan");Student stu3 = new Student("001", "ZhangSan", 18);}
}

需要注意,使用 this([參數]) 調用其他的構造方法,這句代碼必須放在構造方法的第一句。

執行結果:

無參構造方法
無參構造方法
有參構造方法: sid, name
無參構造方法
有參構造方法: sid, name
有參構造方法: sid, name, age

10 代碼塊

在類中還有代碼塊,代碼塊的主要作用也是進行一些初始化的工作。

代碼塊有靜態代碼塊和非靜態代碼塊。

靜態代碼塊主要用于 初始化類的靜態變量 或執行只需在類加載時運行一次的代碼。

非靜態代碼塊主要是對成員變量進行初始化工作。

舉個栗子:

class Student {// 靜態變量public static int staticValue;// 成員變量public int value;// 靜態代碼塊static {staticValue = 10;System.out.println("執行靜態代碼塊");}// 非靜態代碼塊{value = 20;System.out.println("執行非靜態代碼塊");}// 構造方法public Student() {System.out.println("執行構造方法");}
}/*** 測試類*/
public class ObjectTest {public static void main(String[] args) {new Student();new Student();}
}

執行結果:

執行靜態代碼塊
執行非靜態代碼塊
執行構造方法
執行非靜態代碼塊
執行構造方法

從執行結果可以看出,靜態代碼塊只會在類加載的時候執行一次,后面不會再執行了。靜態代碼塊在每次創建對象的時候都會執行,而且會在構造方法之前執行。在代碼塊中也是可以調用類中的方法的,當然靜態代碼塊只能調用靜態方法。

靜態代碼塊可以在需要進行一些邏輯處理后,再初始化靜態變量的時候會用到,非靜態代碼塊用的不多,一般使用構造方法就可以完成相同的功能。


需要注意,代碼塊和屬性的顯式賦值是同級的。誰寫在后面,誰后生效。

舉個栗子:

class Student {// 靜態變量public static int staticValue = 20;// 靜態代碼塊static {staticValue = 10;}
}class Teacher {// 靜態代碼塊static {staticValue = 10;}// 靜態變量public static int staticValue = 20;
}/*** 測試類*/
public class ObjectTest {public static void main(String[] args) {System.out.println(Student.staticValue);    // 10System.out.println(Teacher.staticValue);    // 20}
}

上面的 Student 和 Teacher 兩個類中的靜態變量,分別使用了顯式賦值和靜態代碼塊賦值,可以看到它們是同級的,誰在后面誰后執行,覆蓋前面的初始化值。

11 屬性的初始化順序

類中的屬性,有靜態變量和成員變量,我們可以不初始化,會有默認值,也可以顯式的進行初始化,也可以在靜態代碼塊中對靜態變量進行初始化,也可以構造方法中進行初始化。

這么多地方可以對屬性進行初始化,那么初始化順序是怎么樣的呢?

  1. 靜態變量默認初始化;
  2. 靜態變量顯式初始化;
  3. 靜態代碼塊初始化;
  4. 成員變量默認初始化;
  5. 成員變量顯式初始化;
  6. 構造方法中初始化;

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

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

相關文章

無人售貨奶柜:掘金新零售藍海,

無人售貨奶柜&#xff1a;掘金新零售藍海&#xff0c; 在日新月異的商業浪潮中&#xff0c;無人奶柜猶如一股清新的創業颶風&#xff0c;正以不可阻擋之勢吸引著眾多創業者的目光。這股新興力量以其獨到之處和龐大的市場藍海&#xff0c;預示著一場關于健康、便捷消費方式的深…

【C#】DateTime類型數組含有null?并排序

代碼 internal class Program{static void Main(string[] args){List<DateTime?> dateTimes new List<DateTime?> { null,DateTime.MinValue,DateTime.MaxValue};var temp new List<DateTime?> { };dateTimes.Sort();//dateTimes.Reverse();foreach (va…

石碑之謎:滾動機關

描述 在蒙德和璃月的邊界地帶&#xff0c;有一個被遺忘的神廟&#xff0c;里面有一個奇怪的機關&#xff1a;滾動石碑。小熊必須操作這個112的長方體石碑&#xff0c;使其通過不同的地面環境&#xff0c;最終放置到神秘的符號“O”上&#xff0c;以解開通往寶藏的大門。 石碑…

Edwards愛德華PHM3000培訓PPT課件內容可見圖片詳情

Edwards愛德華PHM3000培訓PPT課件內容可見圖片詳情

golang encoding/json 使用基礎

json 與 encoding/json JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式&#xff0c;它基于 ECMAScript&#xff08;歐洲計算機協會制定的js規范&#xff09;的一個子集&#xff0c;采用完全獨立于語言的文本格式來存儲和表示數據。簡潔和…

SDL系列(一)—— 小白入門

SDL &#xff08; Simple DirectMedia Layer &#xff09; 是一套開放源代碼的 跨平臺多媒體開發庫 &#xff0c;使用 C 語 言寫成。 SDL 提供了數種控制圖像、聲音、輸出入的函數&#xff0c;讓開發者只要用相同或是相似的 代碼就可以開發出 跨多個平臺&#xff08; Linu…

618有什么劃算的數碼產品?4款精選數碼好物清單分享,趕緊碼住!

隨著618購物節慢慢開始&#xff0c;數碼產品的大門已經向你敞開&#xff0c;等你來發現里面的各種樂趣。在這個購物的好時節&#xff0c;我們為你準備了一些很不錯的數碼東西&#xff0c;不管是喜歡新鮮科技的你&#xff0c;還是需要實用小工具的朋友們&#xff0c;這里都有可能…

安卓、iOS、iPad三端搞定,不再劇荒!

哈嘍&#xff0c;各位小伙伴們好&#xff0c;我是給大家帶來各類黑科技與前沿資訊的小武。 之前給大家推薦過各種看劇姿勢&#xff0c;但很多蘋果、平板端的小伙伴還是存在更好的需求體驗&#xff0c;今天給大家推薦這款可以在安卓、iOS和平板上都能安裝使用&#xff0c;不再劇…

2024自學網絡安全的三個必經階段(含路線圖)_網絡安全自學路線

一、為什么選擇網絡安全&#xff1f; 這幾年隨著我國《國家網絡空間安全戰略》《網絡安全法》《網絡安全等級保護2.0》等一系列政策/法規/標準的持續落地&#xff0c;網絡安全行業地位、薪資隨之水漲船高。 未來3-5年&#xff0c;是安全行業的黃金發展期&#xff0c;提前踏入…

基于Django的圖書管理系統

文章目錄 前言一、頁面展示1.登錄2.前端頁面3.后端頁面 總結 前言 本網站調用Django編寫了圖書管理網站&#xff0c;可以在后端控制書籍&#xff0c;前端進行書籍預覽 一、頁面展示 1.登錄 2.前端頁面 3.后端頁面 — ![在這里插入圖片描述](https://img-blog.csdnimg.cn/dir…

低功耗音頻編解碼器CJC8990

由工采網代理的CJC8990是一款低功耗音頻編解碼器&#xff0c;擁有先進的功能并提供高質量音頻&#xff0c;非常適合于便攜式數字音頻應用&#xff0c;支持多種音頻數據格式&#xff0c;包括I2S, DSP模式。 產品介紹&#xff1a; 該芯片工作電壓&#xff1a;1.5V&#xff5e;3…

甲方運營工具——安天威脅情報中心每日熱點事件爬取

一、背景 本次是采用python爬取安天威脅情報中心的每日熱點事件,進行甲方內部威脅情報同步的這樣一個需求開發。 界面及內容: 二、逐步實現 2.1、分析請求頁面的數據來源 通過請求頁面我們看到安天對于第三方引用這些內容的真實性等是不予負責的;我們看到該頁面的數據來源…

mysql 行轉列 case when 和 聚合函數實現

一、原始數據## 二、行轉列 第一步 SELECTCASE WHEN SUBSTRING( aaa.cost_code, 1, 3 ) 100 THEN aaa.budget_cost_budget ELSE 0 END b1,CASE WHEN SUBSTRING( aaa.cost_code, 1, 3 ) 300 THEN aaa.budget_cost_budget ELSE 0 END b2,CASE WHEN SUBSTRING( aaa.cost_cod…

Math.Round()函數說明

Math.Round()并不是嚴格意義上的是四舍五入函數。它默認的執行的是“銀行家舍入”算法&#xff0c;即四舍六入五取偶。概括為&#xff1a;四舍六入五考慮、五后非零就進一&#xff0c;五后皆零看奇偶&#xff0c;五前為偶應舍去、五前為奇要進一。 當為5時&#xff0c;取離著最…

數據庫第九次作業官方答案

文章目錄 1.12.12.22.32.4 1.1 列出下圖所示關系滿足的所有非平凡的函數依賴(忽略蘊含的函數依賴)。 A B C ? ? ? ? ? ? ? ? ? ? ? ? ------------ ???????????? a1 b1 c1 a1 b1 c2 a2 b1 c1 a2 b1 c3 非平凡的函數依賴有&#xff1a;A→B和C→B 2.1 …

淘寶店鋪運營爆流課:助你打造高流量店鋪,實現銷售持續增長(52節課)

課程目錄 01【開店類型第1課】貨架式店鋪.mp4 02【開店類型第2課】短視頻店鋪.mp4 03【開店類型第3課】直播型店鋪.mp4 04【店鋪基礎操作第1課】如何發布一個成功的寶貝.mp4 05【店鋪基礎操作第2課】商品SKU設置技巧及庫存設置方法.mp4 06【標題】如何制作一個爆款標題.mp…

微前端的概念

微前端是一種架構模式&#xff0c;用于構建單個現代web應用程序的多個小型獨立前端應用。每個前端應用都有自己的代碼庫、技術棧和團隊&#xff0c;并可以獨立開發、測試、部署和運行。這些小型前端應用被組合在一起以形成一個完整的前端應用程序。 微前端的核心思想是將前端應…

寄大件家具用什么物流便宜,寄沙發大件物流便宜

在現代生活中&#xff0c;搬家或重新布置家居時&#xff0c;沙發作為體積較大、價值較高的家具&#xff0c;選擇一個經濟實惠的物流服務至關重要。 1、對于近距離的運輸&#xff0c;同城寄沙發可以找個車直接拉過去比較劃算&#xff0c;省外的可以試試像我這樣郵寄&#xff1b;…

2244. 完成所有任務需要的最少輪數 --力扣 -- JAVA

題目 給你一個下標從 0 開始的整數數組 tasks &#xff0c;其中 tasks[i] 表示任務的難度級別。在每一輪中&#xff0c;你可以完成 2 個或者 3 個 相同難度級別 的任務。 返回完成所有任務需要的 最少 輪數&#xff0c;如果無法完成所有任務&#xff0c;返回 -1 。 解題思路 找…

手機怎么制作搞笑gif?來看看這一個方法

動態圖片是現在網絡中很流行的一種圖片格式&#xff0c;可以把多個jpg、png格式靜圖變成一張gif格式的動圖。在各大社交媒體中非常的受歡迎&#xff0c;用簡單快速的方法傳遞信息。當我們想要通過手機制作gif動畫的時候&#xff0c;要如何操作呢&#xff1f;這時候&#xff0c;…