java中的重载方法

什么是重载方法:

在同一个类中,java允许定义多个同名的方法,只要这些方法的参数的类型、或者个数不同即可。
比如:

public void MethodA(ClassBase classbase) {

    }
    public void MethodA(ClassA classbase) {

    }
注:

返回值不能重载。返回值不同但是方法的参数列表相同则被视为是同一个方法。
比如:

public void MethodA(ClassBase classbase) {
    }
    public int MethodA(ClassBase classbase) {
    return 0;
    }

java方法的种类:

java中的方法分为类方法(static),对象方法(非static),类方法和对象方法都允许被重载。

如果重载方法的参数是类对象,就会出现一个比较棘手的问题。
首先我们定义以下的类。
ClassA 和ClassX 直接继承自ClassBase
ClassB继承自ClassA,ClassC继承自ClassB

class ClassBase{

    @Override
    public String toString() {
        return "this is base ";
    }

}
class ClassX extends ClassBase{

    @Override
    public String toString() {
        return "this is class X ";
    }

}
class ClassA extends ClassBase{

    @Override
    public String toString() {
        return "this is class A ";
    }

}

class ClassB extends ClassA{

    @Override
    public String toString() {
        return "this is class B ";
    }

}

class Classc extends ClassB{

    @Override
    public String toString() {
        return "this is class c ";
    }

}

重载方法要如何识别以下的代码。

public class OverLoadMethod {


    public void MethodA(Object o) {
        System.out.print("Now this is Object");
    }
    public void MethodA(ClassBase classbase) {
        System.out.print("Now this is ClassBase");
    }
    public void MethodA(ClassA classbase) {
        System.out.print("Now this is ClassA");
    }
    public void MethodA(ClassB classbase) {
        System.out.print("Now this is ClassB");
    }
    public static void main(String[] args) {

        OverLoadMethod overloadMethod=new OverLoadMethod();
        overloadMethod.MethodA(new ClassB());

    }

}

不出所料输出结果是:

Now this is ClassB

但是如果我们把代码

public void MethodA(ClassB classbase) {
        System.out.print("Now this is ClassB");
    }

注释掉
结果就变成了

Now this is ClassA

看来是在删除了参数为ClassB对象的方法后,编译器自动将方法识别为方法:

public void MethodA(ClassA classbase) {
        System.out.print("Now this is ClassA");
    }

也就是说,编译器会找到最接近方法传入参数的方法进行调用。

曾经我看到过一个面试题。
是重载了两个方法:
一个是

public void MethodA(Object o) {
        System.out.print("Now this is Object");
    }

还有一个是

public void MethodA(Sting o) {
        System.out.print("Now this is String");
    }

在调用了方法MethodA(null)之后的输出结果是什么。

答案是Now this is String
但是为什么
因为Sting是Object的子类于是调用最”下面”的方法。

还有一个问题,什么情况是编译器不能识别的?
比如以下的代码。

public class OverLoadMethod {


    public void MethodA(ClassBase classbase) {
        System.out.print("Now this is ClassBase");
    }
    public void MethodA(ClassA classbase) {
        System.out.print("Now this is ClassA");
    }
    public void MethodA(ClassX classbase) {
        System.out.print("Now this is ClassX");
    }
    public static void main(String[] args) {

        OverLoadMethod overloadMethod=new OverLoadMethod();
        overloadMethod.MethodA(null);

    }

}

前面说到,ClassA和ClassX都直接继承自ClassBase于是此时编译器不知道null更靠近谁,于是报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值