java方法重载

1.1区分方法重载

要是几个方法有相同的名字.java如何才能知道你指的是那一个呢? 其实规则很简单:每个重载的方法必须有一个独一无二的参数类型列表。
稍加思考,就会觉得这是合理的。毕竟,对于名字相同的方法,除了参数类型的差异以外,还有什么办法能把他们区别开呢?
甚至参数顺序的不同也足以区分两个方法,不过,一般情况下别这么做,因为这会使代码难以维护:
// An highlighted block

public class OverloadingOrder {

    static void f(String s, int i) {
        System.out.println("String: " + s + ", int:" + i);
    }

    static void f(int i, String s) {
        System.out.println("int: " + i + ", String:" + s);
    }

    public static void main(String[] args) {
        f("String first", 11);
        f(99, "Int first");
    }
}

1.2 涉及基本类型的重载

基本类型能从一个 “较小” 的类型自动提升至一个 “较大” 的类型,此过程一旦牵涉到重载,可能会造成一些混淆。以下例子说明了将基本类型传递给重载方法时发生的情况:

public class PrimitiveOverloading {
    void f1(char x){
        System.out.println("f1(char) ");
    }
    void f1(byte x){
        System.out.println("f1(byte) " );
    }
    void f1(short x){
        System.out.println("f1(short) ");
    }
    void f1(int x){
        System.out.println("f1(int) ");
    }
    void f1(long x){
        System.out.println("f1(long) ");
    }
    void f1(float x){
        System.out.println("f1(float) ");
    }
    void f1(double x){
        System.out.println("f1(double) ");
    }


    void f2(char x){
        System.out.println("f2(char) ");
    }
    void f2(byte x){
        System.out.println("f2(byte) " );
    }
    void f2(short x){
        System.out.println("f2(short) ");
    }
//    void f2(int x){
//        System.out.println("f2(int) ");
//    }
    void f2(long x){
        System.out.println("f2(long) ");
    }
    void f2(float x){
        System.out.println("f2(float) ");
    }
    void f2(double x){
        System.out.println("f2(double) ");
    }


    public static void main(String[] args) {
        PrimitiveOverloading p = new PrimitiveOverloading();
        p.f1((byte) 5);
        p.f2(5);
        p.f1('1');// 把f1(char x) 注释掉会调用f1(int)方法
    }

}

你会发现常数值5被当作int值处理,如果把f1(int x)方法注释掉,就会被提升至long,这是因为如果传入的参数类型小于方法中声明的参数类型,实际数据类型就会被提升。char类型略有不同,如果无法找到恰好接受char参数的方法,就会把char类型提升至int。

1.3 以返回值区分方法重载

在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值区分呢? 比如下面两个方法,虽然他们具有相同的名字和形式参数,但是却很容易区分他们:
void f(){}
int f(){return 1;}

只要编译器可以根据语境明确判断出语义, 比如在int x =f()中,那么的却可以据此区分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果(这常被成为,为了副作用而调用) 这时你可能调用方法而忽略其返回值。所以,如果像下面这样调用方法:

f();

这是Java如何才能判断该调用哪一个f()呢? 别人该如何理解这种代码呢?因此,根据方法的返回值来区分重载方法是行不通的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值