在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Java/ Java方法重載
Java for循環(huán)
Java接口
Java是什么?
Java命名約定
java中方法重載和方法重寫的區(qū)別
Java運(yùn)算符
Java抽象類
Java快速入門
Java實(shí)例初始化程序塊
Java靜態(tài)綁定和動(dòng)態(tài)綁定
Java do-while循環(huán)
Java對(duì)象克隆
Java Object類
Java聚合
Java繼承
Java this關(guān)鍵字
Java虛擬機(jī)內(nèi)部體系結(jié)構(gòu)
Java構(gòu)造器(構(gòu)造方法)
Eclipse安裝和配置
Java多態(tài)
Java方法重載
Java while循環(huán)
Java教程
Java按值調(diào)用和引用調(diào)用
Java strictfp關(guān)鍵字
Java封裝
Java語言特點(diǎn)
Java數(shù)組
Java instanceof運(yùn)算符
Java包裝類
Java命令行參數(shù)
Java包
Java面向?qū)ο螅∣OP)概念
簡(jiǎn)單Java程序
Java基礎(chǔ)實(shí)例程序
Java對(duì)象和類
Java continue語句
Java抽象類和接口的區(qū)別
C++ VS Java比較
Java if/else語句
Java switch語句
Java歷史
Java變量和數(shù)據(jù)類型
安裝Java環(huán)境(Linux)
Java JDK安裝和配置
Hello Java程序的內(nèi)部細(xì)節(jié)
Java break語句
Java方法重寫
Java Unicode編碼系統(tǒng)
怎么樣開始學(xué)習(xí)Java編程?
對(duì)象和類之間的區(qū)別
Java訪問修飾符
Java super關(guān)鍵字
Java注釋
JDK,JRE和JVM之間的區(qū)別
Java final關(guān)鍵字
Java static關(guān)鍵字

Java方法重載

如果一個(gè)類中有多個(gè)具有相同名稱但參數(shù)不同的方法,則稱為方法重載。如果只需要執(zhí)行一個(gè)操作,具有相同的方法名稱將增加程序的可讀性。

假設(shè)必須執(zhí)行給定數(shù)值的添加操作(求和),但是參數(shù)的數(shù)量不固定,如果為兩個(gè)參數(shù)編寫add1(int,int)方法,為三個(gè)參數(shù)編寫add2(int,int,int)方法,可能對(duì)其他程序員來說很難理解這樣的方法的行為,因?yàn)樗拿Q不同。

因此,執(zhí)行方法重載能比較容易理解程序含義。

方法重載的優(yōu)點(diǎn)

  • 方法重載提高了程序的可讀性。

重載方法不同的方式

在java中重載方法有兩種方式,它們分別是:

  • 通過改變參數(shù)的數(shù)量
  • 通過更改數(shù)據(jù)類型

注意:在java中,只通過更改方法的返回類型來實(shí)現(xiàn)方法重載是不可以的。

1. 方法重載: 修改參數(shù)的數(shù)量

在這個(gè)例子中,我們將創(chuàng)建了兩個(gè)方法,第一個(gè)add()方法執(zhí)行兩個(gè)數(shù)值的相加操作,第二個(gè)add()方法執(zhí)行三個(gè)數(shù)值的相加操作。

在這個(gè)例子中,我們創(chuàng)建靜態(tài)方法,所以不需要?jiǎng)?chuàng)建實(shí)例來調(diào)用方法。

class Adder {
    static int add(int a, int b) {
        return a + b;
    }

    static int add(int a, int b, int c) {
        return a + b + c;
    }
}

class TestOverloading1 {
    public static void main(String[] args) {
        System.out.println(Adder.add(11, 11));
        System.out.println(Adder.add(11, 11, 11));
    }
}

上面代碼執(zhí)行后,輸出結(jié)果如下 -

22
33

2. 方法重載:更改參數(shù)的數(shù)據(jù)類型

在這個(gè)例子中,創(chuàng)建了兩種數(shù)據(jù)類型不同的方法。 第一個(gè)add方法接收兩個(gè)整數(shù)參數(shù),第二個(gè)add方法接收兩個(gè)雙精度型參數(shù)。

class Adder {
    static int add(int a, int b) {
        return a + b;
    }

    static double add(double a, double b) {
        return a + b;
    }
}

class TestOverloading2 {
    public static void main(String[] args) {
        System.out.println(Adder.add(11, 11));
        System.out.println(Adder.add(12.3, 12.6));
    }
}

上面代碼執(zhí)行后,輸出結(jié)果如下 -

22
24.9

問題:為什么方法重載不能通過更改方法的返回類型?

在java中,只通過改變方法的返回類型來實(shí)現(xiàn)方法重載是不可能的,因?yàn)檫@樣具有模糊性。 讓我們來看看模糊性是怎么樣發(fā)生的:

class Adder {
    static int add(int a, int b) {
        return a + b;
    }

    static double add(int a, int b) {
        return a + b;
    }
}

class TestOverloading3 {
    public static void main(String[] args) {
        System.out.println(Adder.add(11, 11));// ambiguity
    }
}

上面代碼執(zhí)行后,輸出結(jié)果如下 -

Compile Time Error: method add(int,int) is already defined in class Adder

System.out.println(Adder.add(11,11));//這里,java如何確定應(yīng)該調(diào)用哪個(gè)sum()方法?

注意:編譯時(shí)錯(cuò)誤優(yōu)于運(yùn)行時(shí)錯(cuò)誤。 所以,如果你聲明相同的方法具有相同的參數(shù),java編譯器渲染編譯器時(shí)間錯(cuò)誤。

可以重載java main()方法嗎?

這是完全可以的。 可以通過方法重載在類中有任意數(shù)量的main方法。 但是JVM調(diào)用main()方法,它只接收字符串?dāng)?shù)組作為參數(shù)。 讓我們來看一個(gè)簡(jiǎn)單的例子:

class TestOverloading4{  
    public static void main(String[] args){System.out.println("main with String[]");}  
    public static void main(String args){System.out.println("main with String");}  
    public static void main(){System.out.println("main without args");}  
}

上面代碼執(zhí)行后,輸出結(jié)果如下 -

main with String[]

方法重載和類型提升

如果沒有找到匹配的數(shù)據(jù)類型,那么會(huì)隱式地將一個(gè)類型提升到另一個(gè)類型。 讓我們通過下面的圖示來理解這個(gè)概念:

如上圖所示,byte可以被提升為short,int,long,floatdouble。 short數(shù)據(jù)類型可以提升為int,longfloatdouble。 char數(shù)據(jù)類型可以提升為intlong,floatdouble等等。

使用類型提升方法重載的示例

class OverloadingCalculation1 {
    void sum(int a, long b) {
        System.out.println(a + b);
    }

    void sum(int a, int b, int c) {
        System.out.println(a + b + c);
    }

    public static void main(String args[]) {
        OverloadingCalculation1 obj = new OverloadingCalculation1();
        obj.sum(20, 20);// now second int literal will be promoted to long
        obj.sum(20, 20, 20);

    }
}

上面代碼執(zhí)行后,輸出結(jié)果如下 -

40
60

如果找到匹配使用類型提升方法重載示例
如果方法中存在匹配類型參數(shù),則不會(huì)執(zhí)行類型提升方法重載。

class OverloadingCalculation2 {
    void sum(int a, int b) {
        System.out.println("int arg method invoked");
    }

    void sum(long a, long b) {
        System.out.println("long arg method invoked");
    }

    public static void main(String args[]) {
        OverloadingCalculation2 obj = new OverloadingCalculation2();
        obj.sum(20, 20);// now int arg sum() method gets invoked
    }
}

上面代碼執(zhí)行后,輸出結(jié)果如下 -

Output:int arg method invoked

在模糊的情況下使用類型提升來實(shí)現(xiàn)方法重載的示例

如果在方法中沒有匹配的類型參數(shù),并且每個(gè)方法都會(huì)提升相同數(shù)量的參數(shù),那么會(huì)出現(xiàn)歧義。如下示例代碼,將會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤。

class OverloadingCalculation3 {
    void sum(int a, long b) {
        System.out.println("a method invoked");
    }

    void sum(long a, int b) {
        System.out.println("b method invoked");
    }

    public static void main(String args[]) {
        OverloadingCalculation3 obj = new OverloadingCalculation3();
        obj.sum(20, 20);// now ambiguity
    }
}

注意: 只有一種類型不被隱式地去提升,例如double不能被隱含地提升到任何類型。