Java的方法詳解
5.1 方法的定義和調(diào)用
5.1.1 方法的基本概念和作用
方法類似于C語(yǔ)言中的函數(shù),是包含特定功能的代碼塊,必須定義在類中、main 方法外部,本質(zhì)上是一個(gè)造輪子的過(guò)程—— 將重復(fù)使用的邏輯包裝成方法,需要時(shí)直接調(diào)用,無(wú)需重復(fù)編寫(xiě)。
5.1.2 方法的語(yǔ)法結(jié)構(gòu)
// 完整格式:修飾符 → 返回值類型 → 方法名 → 參數(shù)列表 → 方法體
修飾符 返回值類型 方法名(參數(shù)列表){
// 方法體:實(shí)現(xiàn)功能的代碼
return 返回值;// 如果返回值類型為 void,可以省略return或只寫(xiě)return
}方法的關(guān)鍵構(gòu)成:
- 修飾符:用于控制方法的訪問(wèn)權(quán)限和特性,比如我們常見(jiàn)的
public static - 返回值類型:方法執(zhí)行完畢后返回的數(shù)據(jù)類型,無(wú)返回值時(shí)使用 void
- 方法名:采用小駝峰命名法,要能只管表達(dá)其功能
- 參數(shù)列表:傳遞給方法的參數(shù),可以看作是方法的輸入,多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)
- 方法體:實(shí)現(xiàn)方法功能的代碼塊
- 方法簽名:由方法名和參數(shù)列表共同組成的唯一標(biāo)識(shí),與返回值,修飾符無(wú)關(guān)
5.1.3 方法的調(diào)用
方法定義后是不會(huì)執(zhí)行的,需要通過(guò)調(diào)用觸發(fā),不同類型的方法調(diào)用方式不同。當(dāng)方法被調(diào)用后執(zhí)行過(guò)程如下:
調(diào)用方法--->傳遞參數(shù)--->找到方法地址--->執(zhí)行被調(diào)方法的方法體--->被調(diào)方法結(jié)束返回--->回到主調(diào)方法繼續(xù)往下執(zhí)行
- 調(diào)用靜態(tài)方法(static修飾的方法)
靜態(tài)方法屬于類,不屬于對(duì)象,調(diào)用時(shí)不需要?jiǎng)?chuàng)建對(duì)象,直接通過(guò) 類名.方法名調(diào)用
public class Dog {
// 定義靜態(tài)方法
public static void eating(String food) {
System.out.println("小狗正在吃" + food);
}
}
class Test {
public static void main(String[] args) {
// 調(diào)用靜態(tài)方法:類名.方法名(實(shí)參)
Dog.eating("狗糧");
}
}就如上面代碼,在Dog類中定義了一個(gè)靜態(tài)方法eating,包含了一個(gè)形參用于接收傳來(lái)的實(shí)參數(shù)據(jù),沒(méi)有返回值。在Test類的main方法中調(diào)用靜態(tài)方法eating,可以直接通過(guò)類名.方法名的方式調(diào)用,不需要?jiǎng)?chuàng)建對(duì)象
- 調(diào)用實(shí)例方法(無(wú)static修飾)
實(shí)例方法屬于對(duì)象,必須先創(chuàng)建對(duì)象,再通過(guò)對(duì)象名.方法名調(diào)用
public class Sum {
// 定義實(shí)例方法(無(wú) static)
public int add(int a, int b) {
return a + b;
}
}
class Test {
public static void main(String[] args) {
// 步驟1:創(chuàng)建對(duì)象
Sum sum = new Sum();
// 步驟2:調(diào)用實(shí)例方法:對(duì)象.方法名(實(shí)參)
int result = sum.add(3, 5);
System.out.println("兩數(shù)之和:" + result); // 8
}
}就如上面代碼,在Sum類中定義了一個(gè)實(shí)例方法add,然后在Test類中的main方法中調(diào)用add方法,需要先創(chuàng)建Sum的實(shí)例化對(duì)象,然后通過(guò)對(duì)象名.方法名調(diào)用
- 方法內(nèi)部調(diào)用當(dāng)前類的其他方法
本類中的方法可直接調(diào)用,不需要類名和對(duì)象
public class Sum {
public static int add(int a, int b) {
return a + b;
}
// 調(diào)用本類的 add 方法
public static int calculateTotal(int x, int y, int z) {
return add(x, y) + z; // 直接調(diào)用本類靜態(tài)方法
}
public static void main(String[] args) {
System.out.println(calculateTotal(1, 2, 3)); // 6
}
}就如上面代碼所示,在Sum類中定義了add方法和calculateTotal方法,并且calculateTotal方法中調(diào)用了add方法,由于這兩個(gè)方法定義在同一個(gè)類中,所以可以通過(guò)方法名直接調(diào)用
5.1.4 方法的文檔注釋
一個(gè)規(guī)范的方法需添加文檔注釋,便于他人理解和工具生成文檔。在定義好方法后在方法的上面一行使用文檔注釋,一般通過(guò)輸入/**敲回車,就會(huì)生成參數(shù)模板,然后填寫(xiě)對(duì)應(yīng)的說(shuō)明即可。在添加文檔注釋后鼠標(biāo)懸停在方法名上時(shí)會(huì)顯示注釋內(nèi)容,大大提高代碼的可讀性

5.2 方法的參數(shù)傳遞
在 Java 中,參數(shù)傳遞只有值傳遞這一種方式,無(wú)論傳遞基本類型還是引用類型,傳遞的都是 “值的副本”,核心區(qū)別在于副本的含義不同。
5.2.1 基本數(shù)據(jù)類型的參數(shù)傳遞
基本數(shù)據(jù)類型的參數(shù)傳遞,傳遞的是變量值的副本,形參的修改不會(huì)影響實(shí)參。形參是指方法定義的參數(shù),實(shí)參是指調(diào)用時(shí)傳入的參數(shù),就如下面案例中:Test類中定義了一個(gè)changeValue方法,無(wú)論傳入的參數(shù)是什么最終都會(huì)改為10,在main方法中調(diào)用了changeValue方法并將實(shí)參a的值賦值給了形參num,最終輸出a的值還是5。
public class Test {
public static void changeValue(int num) {
num = 10; // 修改的是副本的值,與實(shí)參無(wú)關(guān)
}
public static void main(String[] args) {
int a = 5;
changeValue(a); // 傳入 a 的副本(5)
System.out.println("實(shí)參 a 的值:" + a); // 5(未改變)
}
}5.2.2 引用類型的參數(shù)傳遞
引用類型的參數(shù)傳遞,傳遞的是對(duì)象引用(地址)的副本,副本與原引用指向同一個(gè)對(duì)象,因此修改對(duì)象內(nèi)容會(huì)影響原對(duì)象,但修改副本的地址不會(huì)影響原引用:
public class Test {
// 定義引用類型(數(shù)組)
public static void changeArray(int[] arr) {
System.out.println("arr地址: "+arr); // 實(shí)參的地址副本,與實(shí)參相同
arr[0] = 10; // 修改對(duì)象內(nèi)容,會(huì)影響原數(shù)組
arr = new int[]{4,5,6}; // 修改副本地址:與原數(shù)組無(wú)關(guān)
System.out.println("修改后arr地址: "+arr); // 副本地址已改變
}
public static void main(String[] args) {
int[] array = {1,2,3};
System.out.println("array地址:"+array); // 數(shù)組的地址
changeArray(array); // 傳入數(shù)組引用的副本
System.out.println("原數(shù)組第一個(gè)元素:" + array[0]); // 10(內(nèi)容被修改)
System.out.println("最終array的地址:"+array); // 輸出數(shù)組的地址
}
}
直接打印 array 輸出的值是 [I@682a0b20[ 代表這是一個(gè)數(shù)組,I代表 int ,@ 為分隔符,6d03e736 為哈希值,可以理解為地址。
5.2.3 可變參數(shù)
當(dāng)一個(gè)方法的參數(shù)個(gè)數(shù)不確定時(shí),可以使用可變參數(shù)簡(jiǎn)化代碼,語(yǔ)法格式為形參類型... 形參名,本質(zhì)上就是一個(gè)數(shù)組,必須寫(xiě)在參數(shù)參數(shù)列表的最后面,因此一個(gè)方法只能有一個(gè)可變參數(shù)
public class VarargsExample {
// 可變參數(shù)語(yǔ)法:類型... 變量名(必須在參數(shù)列表最后)
public static int sum(int... nums) {
int total = 0;
for (int num : nums) { // 可變參數(shù)可遍歷(本質(zhì)是數(shù)組)
total += num;
}
return total;
}
public static void main(String[] args) {
System.out.println(sum(1,2)); // 3(傳入2個(gè)參數(shù))
System.out.println(sum(1,2,3,4)); // 10(傳入4個(gè)參數(shù))
System.out.println(sum()); // 0(傳入0個(gè)參數(shù))
System.out.println(sum(new int[]{5,6,7})); // 18(直接傳入數(shù)組)
}
}5.3 方法的分類
方法可以從多個(gè)角度進(jìn)行分類:是否有返回值、是否帶參數(shù)、所屬類別(方法與類,對(duì)象的關(guān)系)、訪問(wèn)權(quán)限、功能用途。便于理解不同場(chǎng)景的用法
5.3.1 按是否有返回值分類
- 帶返回值的方法
在定義方法的時(shí)候指定方法的返回值類型,方法執(zhí)行完畢后用return語(yǔ)句返回對(duì)應(yīng)類型的數(shù)據(jù)
// 返回兩個(gè)數(shù)的最大值
public static int getMax(int a, int b) {
return a > b ? a : b;
}- 無(wú)返回值的方法
使用 void 關(guān)鍵字表明方法不返回任何數(shù)據(jù)。在方法體中可以省略return 語(yǔ)句,或僅寫(xiě)return,用于方法的提前結(jié)束
// 打印歡迎信息(無(wú)返回值)
public static void printWelcome() {
System.out.println("歡迎學(xué)習(xí) Java 方法!");
// return; // 可選,無(wú)實(shí)際意義
}
// 提前結(jié)束方法示例
public static void printNum(int num) {
if (num < 0) {
System.out.println("數(shù)字不能為負(fù)數(shù)!");
return; // 提前結(jié)束方法,后續(xù)代碼不執(zhí)行
}
System.out.println("數(shù)字:" + num);
}5.3.2 按是否帶參數(shù)分類
- 帶參數(shù)方法
方法定義時(shí)包含參數(shù)列表,調(diào)用時(shí)需傳入對(duì)應(yīng)類型和數(shù)量的實(shí)際參數(shù),是參與形參必須一一對(duì)應(yīng)
// 帶參數(shù):根據(jù)姓名打招呼
public static void greet(String name) {
System.out.println("Hello, " + name + "!");
}- 無(wú)參數(shù)方法
方法定義時(shí)沒(méi)有參數(shù),調(diào)用時(shí)無(wú)需傳入任何數(shù)據(jù)
// 無(wú)參數(shù):打印當(dāng)前時(shí)間
public static void printCurrentTime() {
System.out.println("當(dāng)前時(shí)間:" + System.currentTimeMillis());
}5.3.3 按所屬類別分類
- 實(shí)例方法
沒(méi)有使用static修飾的方法即為實(shí)例方法,調(diào)用其他類中的實(shí)例方法,或是靜態(tài)方法中調(diào)用實(shí)例方法需要先創(chuàng)建對(duì)象,然后通過(guò)對(duì)象名來(lái)調(diào)用實(shí)例方法,如果是在同一個(gè)類中,實(shí)例方法調(diào)用實(shí)例方法可以通過(guò)方法名直接調(diào)用。每個(gè)對(duì)象都擁有自己的一份實(shí)例方法。實(shí)例方法可以訪問(wèn)實(shí)例成員變量和其他實(shí)例方法,也可以訪問(wèn)靜態(tài)成員變量和靜態(tài)方法。因?yàn)閷?shí)例方法是在對(duì)象創(chuàng)建后才能調(diào)用,此時(shí)對(duì)象的實(shí)例成員已經(jīng)存在。
public class InstanceMethodExample {
public static int staticVar = 10;
public int instanceVar = 20;
// 實(shí)例方法
public void instanceMethod() {
System.out.println("靜態(tài)變量:" + staticVar); // 合法:訪問(wèn)靜態(tài)變量
System.out.println("實(shí)例變量:" + instanceVar); // 合法:訪問(wèn)實(shí)例變量
staticMethod(); // 合法:訪問(wèn)靜態(tài)方法
}
public static void staticMethod() {}
public static void main(String[] args) {
// 步驟1:創(chuàng)建對(duì)象
InstanceMethodExample obj = new InstanceMethodExample();
// 步驟2:調(diào)用實(shí)例方法
obj.instanceMethod();
}
}- 靜態(tài)方法
靜態(tài)方法是指由static修飾的方法,其歸屬于類而非實(shí)例,在訪問(wèn)權(quán)限允許的條件下可直接用類名.方法名調(diào)用,無(wú)需創(chuàng)建對(duì)象。靜態(tài)方法中只能訪問(wèn)靜態(tài)成員變量和其他靜態(tài)方法,不能直接訪問(wèn)實(shí)例成員變量和實(shí)例方法,因?yàn)閷?shí)例成員依賴于對(duì)象的創(chuàng)建,而靜態(tài)方法調(diào)用時(shí)可能還沒(méi)有對(duì)象存在。在類加載時(shí)就被加載到內(nèi)存中,并且在整個(gè)程序運(yùn)行期間一直存在。

public class StaticMethodExample {
// 靜態(tài)變量
public static int staticVar = 10;
// 實(shí)例變量
public int instanceVar = 20;
// 實(shí)例方法
public void instanceMethod() {}
// 靜態(tài)方法
public static void staticMethod() {
System.out.println("靜態(tài)變量:" + staticVar); // 合法:訪問(wèn)靜態(tài)變量
// System.out.println(instanceVar); // 編譯錯(cuò)誤:不能直接訪問(wèn)實(shí)例變量
// instanceMethod(); // 編譯錯(cuò)誤:不能直接訪問(wèn)實(shí)例方法
}
public static void main(String[] args) {
StaticMethodExample.staticMethod(); // 直接調(diào)用靜態(tài)方法
}
}- 構(gòu)造方法
構(gòu)造方法的方法名和類名一樣,并且沒(méi)有返回值類型,主要用途是在創(chuàng)建對(duì)象時(shí)對(duì)成員變量進(jìn)行初始化操作。當(dāng)創(chuàng)建對(duì)象時(shí),會(huì)根據(jù)參數(shù)列表自動(dòng)調(diào)用相應(yīng)的構(gòu)造方法。當(dāng)用戶沒(méi)有寫(xiě)構(gòu)造方法時(shí)編譯器會(huì)生成一個(gè)沒(méi)有帶參數(shù)的構(gòu)造方法,而寫(xiě)了構(gòu)造方法后不再生成。
public class Person {
private String name;
private int age;
// 1. 無(wú)參構(gòu)造方法(手動(dòng)添加,初始化默認(rèn)值)
public Person() {
this.name = "未知"; // this 指代當(dāng)前對(duì)象
this.age = 0;
}
// 2. 帶參構(gòu)造方法(初始化自定義值)
public Person(String name, int age) {
this.name = name; // 區(qū)分形參和實(shí)例變量(同名時(shí)用 this)
this.age = age;
}
// 3. 構(gòu)造方法重載(參數(shù)列表不同)
public Person(String name) {
this.name = name;
this.age = 18; // 默認(rèn)年齡18
}
// 打印個(gè)人信息
public void showInfo() {
System.out.println("姓名:" + name + ",年齡:" + age);
}
public static void main(String[] args) {
// 調(diào)用無(wú)參構(gòu)造
Person p1 = new Person();
p1.showInfo(); // 姓名:未知,年齡:0
// 調(diào)用帶參構(gòu)造
Person p2 = new Person("張三", 20);
p2.showInfo(); // 姓名:張三,年齡:20
// 調(diào)用單參構(gòu)造
Person p3 = new Person("李四");
p3.showInfo(); // 姓名:李四,年齡:18
}
}5.3.4 按訪問(wèn)權(quán)限分類
- 公共方法
使用 public 修飾,可以在任何類、任何包中被訪問(wèn),通常用于定義類的對(duì)外接口,允許其他類自由調(diào)用,以實(shí)現(xiàn)類與類之間的交互和協(xié)作。
// 定義一個(gè)公共類
public class PublicMethodExample {
// 定義一個(gè)公共的靜態(tài)方法
public static void publicStaticMethod() {
System.out.println("這是一個(gè)公共的靜態(tài)方法。");
}
// 定義一個(gè)公共的實(shí)例方法
public void publicInstanceMethod() {
System.out.println("這是一個(gè)公共的實(shí)例方法。");
}
}
// 在另一個(gè)類中調(diào)用公共方法
class AnotherClass {
public static void main(String[] args) {
// 調(diào)用公共的靜態(tài)方法
PublicMethodExample.publicStaticMethod();
// 創(chuàng)建對(duì)象
PublicMethodExample obj = new PublicMethodExample();
// 調(diào)用公共的實(shí)例方法
obj.publicInstanceMethod();
}
}上述代碼中,PublicMethodExample 類中的 publicStaticMethodpublicInstanceMethod 都是公共方法,在 AnotherClass 中可以直接調(diào)用它們。
- 私有方法
使用 private 關(guān)鍵字修飾的方法是私有方法,只能在定義該方法的類內(nèi)部被訪問(wèn),其他類(包括子類)無(wú)法訪問(wèn)。主要用于封裝類內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),將一些不希望外部直接調(diào)用的邏輯隱藏起來(lái),提高類的安全性和可維護(hù)性。
public class PrivateMethodExample {
// 定義一個(gè)私有方法
private void privateMethod() {
System.out.println("這是一個(gè)私有方法。");
}
// 定義一個(gè)公共方法,在公共方法中調(diào)用私有方法
public void callPrivateMethod() {
privateMethod();
}
}
class AntherClass{
public static void main(String[] args) {
PrivateMethodExample obj = new PrivateMethodExample();
// 通過(guò)公共方法間接調(diào)用私有方法
obj.callPrivateMethod();
// 以下代碼會(huì)報(bào)錯(cuò),因?yàn)橥獠繜o(wú)法直接調(diào)用私有方法
// obj.privateMethod();
}
}在這個(gè)例子中,privateMethod 是私有方法,只能在 PrivateMethodExample 類內(nèi)部被調(diào)用,在其他類的 main 方法中不能直接調(diào)用該方法,只能通過(guò)公共方法 callPrivateMethod 間接調(diào)用。
- 受保護(hù)的方法
使用 protected 關(guān)鍵字修飾的方法是受保護(hù)的方法,可以在同一個(gè)包內(nèi)的任何類中被訪問(wèn),也可以在不同包的子類中被訪問(wèn)。用于在一定范圍內(nèi)共享方法,既允許同一個(gè)包內(nèi)的類訪問(wèn),又允許不同包的子類對(duì)其進(jìn)行擴(kuò)展和重寫(xiě)。
// 定義一個(gè)父類,包含受保護(hù)的方法
package com.example.parent;
public class ParentClass {
// 定義一個(gè)受保護(hù)的方法
protected void protectedMethod() {
System.out.println("這是一個(gè)受保護(hù)的方法。");
}
}
// 同一個(gè)包內(nèi)的類調(diào)用受保護(hù)的方法
package com.example.parent;
class SamePackageClass {
public static void main(String[] args) {
ParentClass obj = new ParentClass();
// 同一個(gè)包內(nèi)可以直接調(diào)用受保護(hù)的方法
obj.protectedMethod();
}
}
// 不同包的子類調(diào)用受保護(hù)的方法
package com.example.child;
import com.example.parent.ParentClass;
class ChildClass extends ParentClass {
public void callProtectedMethod() {
// 子類中可以調(diào)用受保護(hù)的方法
protectedMethod();
}
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.callProtectedMethod();
}
}在上述代碼中,ParentClass 中的 protectedMethod 是受保護(hù)的方法,SamePackageClass 和 ChildClass 都可以訪問(wèn)該方法,前者是因?yàn)樵谕粋€(gè)包內(nèi),后者是因?yàn)樗?ParentClass 的子類。
- 默認(rèn)方法
不使用任何訪問(wèn)修飾符的方法具有默認(rèn)訪問(wèn)權(quán)限,也稱為包訪問(wèn)權(quán)限。只能在定義該方法的的類所在的包的不同類中訪問(wèn),不同包的類不能訪問(wèn)。用于在包內(nèi)部實(shí)現(xiàn)類之間的交互和協(xié)作,將相關(guān)的功能封裝在同一個(gè)包內(nèi)。
// 定義一個(gè)類,包含默認(rèn)訪問(wèn)權(quán)限的方法
package com.example.package1;
class DefaultMethodExample {
// 定義一個(gè)默認(rèn)訪問(wèn)權(quán)限的方法
void defaultMethod() {
System.out.println("這是一個(gè)默認(rèn)訪問(wèn)權(quán)限的方法。");
}
}
// 同一個(gè)包內(nèi)的類調(diào)用默認(rèn)訪問(wèn)權(quán)限的方法
package com.example.package1;
class SamePackageCaller {
public static void main(String[] args) {
DefaultMethodExample obj = new DefaultMethodExample();
// 同一個(gè)包內(nèi)可以調(diào)用默認(rèn)訪問(wèn)權(quán)限的方法
obj.defaultMethod();
}
}
// 不同包的類嘗試調(diào)用默認(rèn)訪問(wèn)權(quán)限的方法(會(huì)報(bào)錯(cuò))
package com.example.package2;
// 以下代碼無(wú)法通過(guò)編譯,因?yàn)椴煌鼰o(wú)法訪問(wèn)默認(rèn)訪問(wèn)權(quán)限的方法
// import com.example.package1.DefaultMethodExample;
// class DifferentPackageCaller {
// public static void main(String[] args) {
// DefaultMethodExample obj = new DefaultMethodExample();
// obj.defaultMethod();
// }
// }在這個(gè)例子中,DefaultMethodExample 類中的 defaultMethod 是默認(rèn)訪問(wèn)權(quán)限的方法,SamePackageCaller 類可以調(diào)用該方法,因?yàn)樗鼈冊(cè)谕粋€(gè)包內(nèi),而不同包的類無(wú)法調(diào)用該方法。
5.3.5 按功能用途分類
5.3.5.1 抽象方法
使用 abstract 關(guān)鍵字修飾的方法,抽象方法是定義在抽象類或接口當(dāng)中的方法,他只有方法的聲明,沒(méi)有方法體。如果一個(gè)類繼承了包含抽象方法的抽象類,那么這個(gè)子類必須實(shí)現(xiàn)抽象類中的所有抽象方法,否則子類也必須被聲明為抽象類。
// 定義抽象類
abstract class Animal {
// 抽象方法,描述動(dòng)物發(fā)出聲音的行為
public abstract void makeSound();
// 普通方法
public void sleep() {
System.out.println("動(dòng)物在睡覺(jué)");
}
}
// 子類 Dog 繼承自抽象類 Animal
class Dog extends Animal {
// 實(shí)現(xiàn)抽象方法
@Override
public void makeSound() {
System.out.println("狗汪汪叫");
}
}
// 子類 Cat 繼承自抽象類 Animal
class Cat extends Animal {
// 實(shí)現(xiàn)抽象方法
@Override
public void makeSound() {
System.out.println("貓喵喵叫");
}
}
public class AbstractMethodExample {
public static void main(String[] args) {
// 父類引用指向子類對(duì)象
Animal dog = new Dog();
Animal cat = new Cat();
// 調(diào)用抽象方法,根據(jù)實(shí)際對(duì)象類型執(zhí)行不同實(shí)現(xiàn)
dog.makeSound();
cat.makeSound();
// 調(diào)用普通方法
dog.sleep();
cat.sleep();
}
}抽象類 Animal:包含一個(gè)抽象方法 makeSound 和一個(gè)普通方法 sleep。由于 Animal 類包含抽象方法,所以它必須被聲明為抽象類。子類 Dog 和 Cat:繼承自 Animal 類,必須實(shí)現(xiàn) makeSound 抽象方法,分別給出狗和貓發(fā)出聲音的具體實(shí)現(xiàn)。main 方法:創(chuàng)建 Dog 和 Cat 對(duì)象,并使用 Animal 類型的引用指向它們。調(diào)用 makeSound 方法時(shí),會(huì)根據(jù)實(shí)際對(duì)象的類型執(zhí)行不同的實(shí)現(xiàn),體現(xiàn)了多態(tài)性。同時(shí),也可以調(diào)用普通方法 sleep。
5.3.5.2 重寫(xiě)方法
重寫(xiě)方法指的是在子類中定義一個(gè)與父類中方法具有相同方法名、參數(shù)列表和返回值類型的方法。通過(guò)重寫(xiě),子類可以修改或擴(kuò)展父類方法的行為。并且子類重寫(xiě)方法的訪問(wèn)權(quán)限不能比父類被重寫(xiě)方法的訪問(wèn)權(quán)限更嚴(yán)格,不能拋出比父類被重寫(xiě)方法更多或更寬泛的異常。靜態(tài)方法不能被重寫(xiě),只能構(gòu)成隱藏
// 父類 Animal
class Animal {
// 父類方法
public void makeSound() {
System.out.println("動(dòng)物發(fā)出聲音");
}
// 帶有返回值的父類方法
public Animal getSelf() {
return this;
}
}
// 子類 Dog 繼承自 Animal
class Dog extends Animal {
// 重寫(xiě)父類的 makeSound 方法
@Override
public void makeSound() {
System.out.println("狗汪汪叫");
}
// 重寫(xiě)帶有返回值的方法,使用協(xié)變返回類型
@Override
public Dog getSelf() {
return this;
}
}
// 測(cè)試類
public class MethodOverrideExample {
public static void main(String[] args) {
// 創(chuàng)建 Dog 對(duì)象
Dog dog = new Dog();
// 調(diào)用重寫(xiě)后的方法
dog.makeSound();
// 測(cè)試協(xié)變返回類型
Dog self = dog.getSelf();
System.out.println("返回的對(duì)象類型: " + self.getClass().getName());
}
}Animal 類:包含 makeSound 方法和 getSelf 方法。makeSound 方法用于輸出動(dòng)物發(fā)出的聲音,getSelf 方法返回 Animal 類型的對(duì)象。Dog 類:繼承自 Animal 類,重寫(xiě)了 makeSound 方法,輸出狗的叫聲。同時(shí),重寫(xiě)了 getSelf 方法,使用協(xié)變返回類型,返回 Dog 類型的對(duì)象。MethodOverrideExample 類:在 main 方法中創(chuàng)建 Dog 對(duì)象,調(diào)用重寫(xiě)后的 makeSound 方法,并測(cè)試 getSelf 方法的協(xié)變返回類型。
5.3.5.3 重載方法
同一個(gè)類中,方法名相同但是參數(shù)列表不同的方法,參數(shù)列表的不同體現(xiàn)在參數(shù)類型,數(shù)量,順序的不同,返回值類型和修飾符可以任意,僅靠返回值不同不能構(gòu)成重載,核心作用是用同一方法名處理不同參數(shù)的場(chǎng)景,本質(zhì)上就是使用方法簽名來(lái)區(qū)分不同方法,回顧方法簽名的概念:由方法名和參數(shù)列表共同組成的唯一標(biāo)識(shí),與返回值,修飾符無(wú)關(guān)
public class MethodOverloadingExample {
// 計(jì)算兩個(gè)整數(shù)的和
public int add(int a, int b) {
return a + b;
}
// 計(jì)算三個(gè)整數(shù)的和
public int add(int a, int b, int c) {
return a + b + c;
}
// 計(jì)算兩個(gè)雙精度浮點(diǎn)數(shù)的和
public double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
MethodOverloadingExample example = new MethodOverloadingExample();
// 調(diào)用兩個(gè)整數(shù)相加的方法
int result1 = example.add(1, 2);
System.out.println("兩個(gè)整數(shù)的和: " + result1);
// 調(diào)用三個(gè)整數(shù)相加的方法
int result2 = example.add(1, 2, 3);
System.out.println("三個(gè)整數(shù)的和: " + result2);
// 調(diào)用兩個(gè)雙精度浮點(diǎn)數(shù)相加的方法
double result3 = example.add(1.5, 2.5);
System.out.println("兩個(gè)雙精度浮點(diǎn)數(shù)的和: " + result3);
}
}add(int a, int b):用于計(jì)算兩個(gè)整數(shù)的和。
add(int a, int b, int c):用于計(jì)算三個(gè)整數(shù)的和,參數(shù)數(shù)量與第一個(gè) add 方法不同。
add(double a, double b):用于計(jì)算兩個(gè)雙精度浮點(diǎn)數(shù)的和,參數(shù)類型與前兩個(gè) add 方法不同
5.5 遞歸
5.5.1 概念
遞歸是指在方法的內(nèi)部調(diào)用自身的方法,遞歸包含兩部分:遞和歸。相當(dāng)于數(shù)學(xué)上的 "數(shù)學(xué)歸納法", 有一個(gè)結(jié)束條件, 然后有一個(gè)遞推公式。
遞:首先要遞出去,找到遞歸條件,也就是推導(dǎo)公式,將大問(wèn)題拆分為更小的同類問(wèn)題,如 f(n) = f(n-1) + f(n-2)
歸:最后要?dú)w回來(lái),也就是結(jié)束條件。
就以計(jì)算 n 的階層為例,n!= n * (n-1)*(n-2)...*1最終的結(jié)束條件就是n = 1
public static int faction(int n) {
// 結(jié)束條件 0!= 1,1!= 1
if (n == 0 || n == 1) {
return 1;
}
// 遞推公式:n! = n * (n-1)!
return n * (n - 1);
}5.5.2 經(jīng)典案例
- 斐波那契數(shù)列
斐波那契數(shù)列的規(guī)則是 f(1) = 1, f(2) = 1, f(n) = f(n-1) + f(n-2),由此我們可以得出結(jié)束條件 n ==1 || n==2時(shí) f(n) = 1,遞歸公式為f(n) = f(n-1) + f(n-2)
public static int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1; // 結(jié)束條件
}
return fibonacci(n - 1) + fibonacci(n - 2); // 遞推公式
}到此這篇關(guān)于Java的方法詳解的文章就介紹到這了,更多相關(guān)Java方法詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文告訴你為什么要重寫(xiě)hashCode()方法和equals()方法
本篇文章帶大家了解一下為什么重寫(xiě)hashCode()方法和equals()方法,文中有非常詳細(xì)的說(shuō)明以及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
Swagger-boostrap-ui如何配置用戶名密碼訪問(wèn)
這篇文章主要介紹了Swagger-boostrap-ui如何配置用戶名密碼訪問(wèn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
java abstract class interface之間的區(qū)別介紹
含有abstract修飾符的class即為抽象類,abstract 類不能創(chuàng)建的實(shí)例對(duì)象,abstract class類中定義抽象方法必須在具體(Concrete)子類中實(shí)現(xiàn),所以,不能有抽象構(gòu)造方法或抽象靜態(tài)方法2012-11-11
詳解SpringBoot 應(yīng)用如何提高服務(wù)吞吐量
這篇文章主要介紹了Spring Boot 應(yīng)用如何提高服務(wù)吞吐量,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
spring boot 4.* 自定義序列化器的實(shí)現(xiàn)
本文介紹了Spring Boot 4.*版本中Jackson自定義序列化器的適配方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-01-01
解決Nacos成功啟動(dòng)但是無(wú)法訪問(wèn) (Connection refused)
這篇文章主要介紹了解決Nacos成功啟動(dòng)但是無(wú)法訪問(wèn) (Connection refused)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Java Excel實(shí)現(xiàn)數(shù)據(jù)可視化預(yù)警
本文將結(jié)合 Java 編程語(yǔ)言 和 Spire.XLS 庫(kù),帶你逐步實(shí)現(xiàn)三類常見(jiàn)的高級(jí)條件格式應(yīng)用場(chǎng)景,幫助你打造更直觀,更智能的 Excel 報(bào)表,感興趣的可以了解下2025-06-06

