方法
什么是方法?
方法定義:方法(Method),函數(function),其實就指一個特定的功能操作,程序中完成獨立功能,可重復使用的一段代碼的集合。
方法的定義
方法定義格式:
[修飾符] 返回值的類型 方法名稱 ( [形式參數,....] ) {
方法體
[ return 值 ];
}
注意點
(1)方法必須聲明在類(class)當中。
(2)創建的方法要定義在其它方法之外(跟其他的方法是兄弟關系)
(3)定義方法不分先后順序。
(4)如果有一個方法前面有static,那么在該方法中調用其它的方法前面也應該有static。
(5)void 返回值為空,什么都不返回;如果有返回值,必須要有return。
(6)兩個方法的名稱不能相同。
(7)方法必須要先定義,再執行。
方法術語
修飾符
public,static等,static修飾的方法屬於類,直接使用類名調用即可。
返回值類型
方法其實是在完成一個功能,該功能操作完畢之后,是否需要給調用者返回一個結果。
如果不需要給調用者返回結果,此時使用關鍵字void來聲明,無返回的意思。
方法名稱
遵循標識符的規范,使用動詞表示,首字母小寫,若是多個單詞組成,使用駝峰表示法,以后的每一個單詞首字母都大寫,myName
形式參數
方法圓括號中的變量,僅僅只是占位而已,參數的名稱其實無所謂,形式參數可以有多個。
參數列表
參數列表 == 參數的類型 + 參數的個數 + 參數的順序。
方法簽名
方法簽名 = 方法名稱 + 方法參數列表;
在同一個類中,方法簽名是唯一的,否則編譯報錯。
方法體
方法的 { } 中的代碼,表示具體完成該功能的代碼。
返回值:
在方法內部,使用return關鍵字;
功能1:給調用者返回一個結果值,此時該方法不能使用void修飾.
功能2:結束當前方法.
實際參數
調用者在調用某一個具體方法的時候,實際傳遞的參數值。
方法重載
什么是方法重載?
重載方法的定義是在同一個類中,某方法允許存在一個以上的同名方法,只要它們的參數列表不同即可。
方法重載作用
解決了 同一功能的方法,由於參數不同所造成方法名稱不同。
判斷的原則
方法重載判斷原則: “兩同一不同”
- 兩同:同類中,方法名相同;
- 一不同:方法參數列表不同(參數類型、參數個數、參數順序);
只要參數類型,參數個數,參數順序有一個不同,參數列表就不同.
注意:方法重載和方法的返回值類型無關,只是一般要求返回值類型一致。
參數列表和參數的名稱沒關系,方法的重載和形參沒關系。
數組
什么是數組?
所謂數組,是在程序設計中,為了處理方便,把具有相同類型的若干變量按有序的形式組織起來的一種數據形式。
這些按一定順序排列的同類型數據的集合稱為數組。
而數組中的每一個數據稱之為數組元素,數組中的元素以索引來表示其存放的位置,索引從0開始,步長是1,有點像Excel表格的行號,逐行遞增。
數組的定義
變量的定義: 數據類型 變量名; 如: int age;
數組的定義:
方式1:: 數組元素的類型[] 數組名; 如: int[] ages;
方式2: 數組元素的類型 數組名[]; 如: int ages[];
推薦方式1: 可以吧 int[] 看成是一種數據類型,int類型的數組類型。
數組必須先初始化,才能使用。因為初始化表示在內存中分配空間。
數組的初始化
Java中數組必先初始化后才能使用,所謂初始化就是給數組元素分配內存,並為每個元素賦初始值。
初始化數組的兩種方式:
- 靜態初始化;
- 動態初始化;
無論以哪種方式初始化數組,一旦初始化完成,數組的長度就固定了,不能改變,除非重新初始化。也就是說數組是定長的。
靜態初始化
數組的靜態初始化操作:
特點:由我們自己來為每一個數組元素設置初始化值,而數組的長度由系統(JVM)決定。
語法:
數組元素類型[] 數組名 = new 數組元素類型[]{元素1,元素2,元素3,.......};
舉例:
int[] nums = new int[]{1,3,5,7,9};
int[] nums = {1,3,5,7,9};
說明:
簡單寫法,必須聲明之后,立刻初始化,不能先聲明后初始化:以下寫法是錯誤的
int[] nums;
nums = {1,3,5,7,9};
動態初始化
數組的動態初始化操作:
特點:由我們來設置數組的元素個數(數組長度),而每一個數組元素的初始值有系統決定。
語法:
數組元素類型[] 數組名 = new 數組元素類型[ length ];
舉例:
int[] ages = new int[100];
說明:
不能同時使用靜態初始化和動態初始化:以下寫法是錯誤的
int[] nums = new int[5]{1,3,5,7,9};
數組的基本操作
基本操作 | 操作說明 |
---|---|
獲取元素 | 元素類型 變量 = 數組名[index]; |
設置元素 | 數組名[index] = 值; |
遍歷數組元素 | 建議使用for循環,事先知道循環的次數。 |
數組長度 | int len = 數組名.length; length是屬性,不是方法。 |
索引范圍 | 從0開始,逐一遞增. [0,數組名.length-1] |
多維數組
什么是多維數組
一維數組:就是數組,數組中的每一個元素都是一個值。
二維數組:數組中的數組,數組中的每一個元素都是一個數組。(可以表示二維空間(行/豎))
三維數組:數組中的每一個元素都是一個二維數組。
舉例:
int[][] a = new int[][] {
{ 1, 2, 3 },
{ 4, 5 },
{ 6 }
};
feach 循環
普通循環
定義數組,給數組元素賦值。當取出數組中的元素值的時候,咱們會使用循環(while,do while,for)來操作,該操作,稱之為循環遍歷,但是循環變量是數組的索引。
增加for循環
從Java5開始,提供了增強for循環(for-each),就可以直接地取出數組中的每一個元素。
for(元素類型 變量 : 數組名)
{
變量就表示每一個元素值
}
舉例:
public static void main(String[] args) {
String[] strs = { "爸爸", "媽媽", "爺爺", "奶奶", "外公", "外婆" };
for (String str : strs) {
System.out.println(str);
}
}
增加for循環本質
增強for循環,其實是一個語法糖(編譯器級別的新特性),但是在字節碼中底層依然是for循環。
代碼反編譯后:
public static void main(String args[])
{
String strs[] = {
"爸爸", "媽媽", "爺爺", "奶奶", "外公", "外婆"
};
String args1[];
int j = (args1 = strs).length;
for (int i = 0; i < j; i++)
{
String str = args1[i];
System.out.println(str);
}
}
那到底,咱們是使用for循環還是使用增強for循環?
- 若需要取出數組元素,則使用for-each更簡單。
- 但是若需要操作數組索引,就只能使用普通的循環。
方法的可變參數
得出結論:可變參數就是,方法的數組參數。
注意::為了避免歧義,語法規定,可變參數必須作為方法的最后一個參數。
static void sum(int[] args) { // 把數組當作參數進行傳遞
int res = 0;
for (int i = 0; i < args.length; i++) {
res += args[i];
}
System.out.println(res);
}
public static void main(String[] args) {
int[] params = { 1, 2, 3 };
sum(params);
}
可變參數:
// 可變參數(他是數組參數的一種簡寫,會自動把...轉成數組)
static void sum(int... args) {
int res = 0;
for (int i = 0; i < args.length; i++) {
res += args[i];
}
System.out.println(res);
}
public static void main(String[] args) {
int[] params = { 1, 2, 3, 4 };
sum(params);
sum(1, 2, 3, 4);
}
可變參數的本質:
可變參數是語法糖的一種,代碼反編譯后:
static transient void sum(int args[])
{
int res = 0;
for (int i = 0; i < args.length; i++)
res += args[i];
System.out.println(res);
}
public static void main(String args[])
{
int params[] = {
1, 2, 3, 4
};
sum(params);
sum(new int[] {
1, 2, 3, 4
});
}
語法糖
什么是語法糖
語法糖(Syntactic Sugar),也稱糖衣語法,是由英國計算機學家 Peter.J.Landin 發明的一個術語,指在計算機語言中添加的某種語法。
這種語法對語言的功能並沒有影響,但是更方便程序員使用。簡而言之,語法糖讓程序更加簡潔,有更高的可讀性。
解語法糖
語法糖的存在主要是方便開發人員使用。但其實,Java 虛擬機並不支持這些語法糖,這些語法糖在編譯階段就會被還原成簡單的基礎語法結構,這個過程就是解語法糖。
說到編譯,大家肯定都知道,Java 語言中,javac命令可以將后綴名為.java的源文件編譯為后綴名為.class的可以運行於 Java 虛擬機的字節碼。
如果你去看com.sun.tools.javac.main.JavaCompiler的源碼,你會發現在compile()中有一個步驟就是調用desugar(),這個方法就是負責解語法糖的實現的。