方法概述
所謂方法七咧,就是用來解決一類問題的代碼的有序組合,是一個功能模塊
作用:封裝重復(fù)邏輯叮叹,邏輯更清晰
語法格式:
訪問修飾符 返回類型 方法名(參數(shù)列表){
方法體
}
訪問修飾符:允許被訪問的權(quán)限范圍艾栋,可以是public/private/default/protected
返回類型:可以是void(無返回值) 以及任何數(shù)據(jù)類型,帶返回值方法使用return語句進行返回蛉顽。
參數(shù)列表:傳遞給方法的參數(shù)列表蝗砾,可省略,參數(shù)可以有多個携冤,以逗號分隔悼粮,每個參數(shù)由參數(shù)類型及參數(shù)名組成。
根據(jù)方法是否帶參數(shù)曾棕、是否帶返回值扣猫,可分為四類:
? 無參無返回值方法
? 無參帶返回值方法
? 帶參無返回值方法
? 帶參帶返回值方法
無參無返回值方法
如果方法不包含參數(shù),且沒有返回值翘地,我們稱為無參無返回值的方法申尤。
該方法的返回類型為void,且方法中不能使用return返回值衙耕!(可以單獨使用return;)
public class HelloMethod {
//定義方法
public void show(){
//方法體
System.out.println("welcome to learn java");
}
public static void main(String[] args) {
//創(chuàng)建一個HelloMethod類的對象hello
HelloMethod hello = new HelloMethod();
//使用對象名.方法名()去調(diào)用方法
hello.show();
}
}
無參帶返回值方法
如果方法不包含參數(shù)昧穿,但有返回值,我們稱為無參帶返回值的方法臭杰。
返回使用return語句粤咪,返回的數(shù)據(jù)類型要與方法聲明的返回類型相匹配(兼容)。
public class HelloMethod {
//定義求長方形面積的方法
public int getArea(){
int length = 10, width = 5;
return length * width; //返回語句
}
public static void main(String[] args) {
HelloMethod hello = new HelloMethod();
//打印返回值渴杆,或者可以定義變量接收返回值:int area = hello.getArea();
System.out.println("長方形的面積為:" + hello.getArea());
}
}
帶參無返回值方法
可以通過在方法中加入?yún)?shù)列表接收外部傳入的數(shù)據(jù)信息寥枝,來完成特定的功能實現(xiàn)。
參數(shù)可以是任意的基本類型數(shù)據(jù)或引用類型數(shù)據(jù)磁奖,調(diào)用帶參方法時囊拜,必須保證實參的數(shù)量、類型比搭、順序與形參一一對應(yīng)冠跷。
形參:我們把定義方法時的參數(shù)稱為形參,目的是用來定義方法需要傳入的參數(shù)的個數(shù)和類型
實參:把調(diào)用方法時的參數(shù)稱為實參身诺,是傳遞給方法真正被處理的值
實參可以傳遞變量或者字面值蜜托,當傳遞變量時變量名不需要與形參名相同
public class HelloMethod {
//輸出兩個數(shù)的最大值
public void max(float a, float b){
float max = a > b ? a : b;
System.out.println("兩個數(shù)" + a + "和" + b + "的最大值為:" + max);
}
public static void main(String[] args) {
HelloMethod hello = new HelloMethod();
int a = 3, b = 5;
hello.max(a, b); //可以傳遞int值,因為可以自動轉(zhuǎn)換為float型
float m = 5.6f, n = 3.4f;
//傳遞實參名
hello.max(m, n);
//傳遞字面值
hello.max(6.6f, 3.3f);
//hello.max(1.2, 3.4); 錯誤霉赡,不能傳遞double類型
}
}
帶參帶返回值方法
如果方法既包含參數(shù)橄务,又帶有返回值,我們稱為帶參帶返回值的方法穴亏。
public class HelloMethod {
//求階乘的方法
public int factorial(int num){
int s = 1;
for (int i = 1; i <= num; i++) {
s *= i;
}
return s;
}
public static void main(String[] args) {
HelloMethod hello = new HelloMethod();
int fac = hello.factorial(5);
System.out.println("5! = " + fac); //120
int sum = 0;
//求1! + 2! + 3! + 4! + 5!
for (int i = 1; i <= 5; i++) {
fac = hello.factorial(i);
sum += fac;
}
System.out.println("1!+2!+3!+4!+5!=" + sum); //153
}
}
方法重載
如果同一個類中包含了兩個或兩個以上方法名相同蜂挪、方法參數(shù)的個數(shù)重挑、順序或類型不同的方法,則稱為方法的重載棠涮。
特點:同一個類中谬哀,方法名相同,參數(shù)列表不同(參數(shù)類型或者參數(shù)個數(shù)或者參數(shù)順序)严肪,與方法修飾符和返回值無關(guān)
好處:對于具有相同功能的方法可以重用方法名史煎,使其更符合語義
//求兩個int類型數(shù)的和(重載方法)
public int plus(int m, int n){
return m + n;
}
//求兩個double類型數(shù)的和(重載方法)
public double plus(double m, double n){
return m + n;
}
//求數(shù)組元素的累加和(重載方法)
public int plus(int[] arr){
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
public static void main(String[] args) {
HelloMethod hello = new HelloMethod();
int a = 5, b = 10;
int[] arr = {1,2,3,4,5};
//當調(diào)用被重載的方法時, Java會根據(jù)參數(shù)的個數(shù)和類型來判斷應(yīng)該調(diào)用哪個重載方法诬垂,參數(shù)完全匹配的方法將被執(zhí)行
System.out.println("int類型的和為:" + hello.plus(a, b));
System.out.println("double類型的和為:" + hello.plus(5.6, 3.4));
System.out.println("數(shù)組元素的和為:" + hello.plus(arr));
}
方法傳值問題
基本數(shù)據(jù)類型的參數(shù)傳遞
基本數(shù)據(jù)類型的參數(shù)傳遞屬于值傳遞劲室,即方法調(diào)用時,實際參數(shù)把它的值傳遞給對應(yīng)的形式參數(shù)结窘,函數(shù)接收的是原始值的一個copy很洋,在方法的內(nèi)部改變參數(shù)的值并不會影響傳遞進來的外部對象。
public class HelloMethod {
//基本數(shù)據(jù)類型的參數(shù)傳遞
public void add(int n){
n++;
System.out.println("方法中n=" + n);
}
public static void main(String[] args) {
int n = 10;
HelloMethod hello = new HelloMethod();
hello.add(n);
System.out.println("方法調(diào)用后n的值:" + n);
//方法中n=11
//方法調(diào)用后n的值:10
}
}
引用類型的參數(shù)傳遞
引用類型的參數(shù)傳遞屬于引用傳遞隧枫,方法調(diào)用時喉磁,實際參數(shù)的引用(地址)被傳遞給方法中相對應(yīng)的形式參數(shù),函數(shù)接收的是原始值的內(nèi)存地址官脓,此時方法參數(shù)和實參指向了同一個內(nèi)存空間协怒。
a) 如果在函數(shù)中沒有改變這個引用地址,而是改變了地址中的內(nèi)容卑笨,那么在函數(shù)內(nèi)的改變就會影響到傳入的實際參數(shù)孕暇。
b) 如果在函數(shù)中改變了引用地址,比如重新new一個赤兴,那么形參就指向了一個新的地址妖滔,此時傳入的參數(shù)還是指向原來的地址,所以函數(shù)內(nèi)的改變不會影響到傳入的實際參數(shù)桶良。
public class HelloMethod {
//引用類型的參數(shù)傳遞
public void updateArray(int[] a){
a[3] = 15;
}
//引用類型的參數(shù)傳遞
public void updateArray2(int[] a){
a = new int[a.length]; //a重新指向了新的內(nèi)存空間(地址)
a[3] = 20;
}
public static void main(String[] args) {
HelloMethod hello = new HelloMethod();
int[] a1 = {1,2,3,4,5}, a2 = {1,2,3,4,5};
hello.updateArray(a1);
System.out.println("方法調(diào)用后數(shù)組元素為:");
for (int n : a1) {
System.out.print(n + " ");
}
System.out.println();
//方法調(diào)用后數(shù)組元素為:
//1 2 3 15 5
hello.updateArray2(a2);
System.out.println("方法調(diào)用后數(shù)組元素為:");
for (int n : a2) {
System.out.print(n + " ");
}
System.out.println();
//方法調(diào)用后數(shù)組元素為:
//1 2 3 4 5
}
}
特別注意包裝類以及String類(后續(xù)介紹)的不可變性座舍,也就是說對它們的值的改變實際上都是創(chuàng)建新的對象。
public void append(String str){
str += " hehe"; //str指向了新的字符串對象
}
public static void main(String[] args) {
HelloMethod hello = new HelloMethod();
String str = "hello";
hello.append(str);
System.out.println(str); //hello
}
可變參數(shù)列表
- 參數(shù)數(shù)量不確定陨帆,可以隨時變化曲秉,可變參數(shù)的本質(zhì)是一個數(shù)組,會將傳入的多個參數(shù)轉(zhuǎn)成一個數(shù)組疲牵,而參數(shù)名就是數(shù)組引用承二,所以可以使用索引訪問參數(shù)列表。
- 可變參數(shù)與數(shù)組類型不能重載纲爸,因為二者本質(zhì)上是一樣的亥鸠。
- 方法如果有多個參數(shù)時,可變參數(shù)必須放在最后缩焦。
- 可以將數(shù)組傳遞給可變參數(shù)列表读虏,但是數(shù)組作為參數(shù)時,是不能將多個值傳遞給數(shù)組的袁滥!
- 可變參數(shù)列表所在的方法是最后被訪問的盖桥,如果有其他匹配的方法,會優(yōu)先執(zhí)行题翻。
public class HelloMethod {
//可變參數(shù)
public int plus(int... a){
System.out.println("帶可變參數(shù)的方法被調(diào)用");
int sum = 0;
for(int n : a){
sum += n;
}
return sum;
}
//重載方法
public int plus(int a, int b){
System.out.println("不帶可變參數(shù)的方法被調(diào)用");
return a + b;
}
//多個參數(shù)揩徊,可變參數(shù)放在最后
public int search(int a, int... arr){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == a){
return i;
}
}
return -1;
}
public static void main(String[] args) {
HelloMethod hello = new HelloMethod();
//優(yōu)先匹配不帶可變參數(shù)方法
hello.plus(1, 2);
//傳遞數(shù)組
int[] a = {1,2,3,4,5,6};
hello.plus(a);
//可變參數(shù)方法調(diào)用
System.out.println("和為:" + hello.plus(1,2,3,4,5,6));
/*不帶可變參數(shù)的方法被調(diào)用
帶可變參數(shù)的方法被調(diào)用
帶可變參數(shù)的方法被調(diào)用
和為:21
*/
}
}