方法的重载——看实参类型 & 基础数据类型的精度升级转换

目录

例1:子类BBB,父类AAA

例2:子类BBB,父类AAA,但形参列表缺少BBB类型,类树体系中类型升级

例3:类树体系类型升级,但不会发生类型降级

例4:基础数据类型的精度升级

例5:char类型和int类型的比较

总结:3点


前一篇博客,举了四个例子,说明方法子类继承父类后,方法的重写需要看内存中创建对象的类是哪一个,JVM的动态绑定机制,以及子类中this的简写等。

这一篇博客,讲解方法的重载过程中容易混淆的点。

方法重载在一个类中定义多个同名的方法,但要求每个方法的形参列表中,参数的类型参数个数不同。

例1:子类BBB,父类AAA

public class Test3 {
    public static void main(String[] args) {
        AAA a = new BBB();
        test(a);
    }

    public static void test(AAA a){
        System.out.println("aaaa");
    }

    public static void test(BBB b){
        System.out.println("bbbb");
    }
}
class AAA{
}
class BBB extends AAA{
}

分析:两个test()方法的参数类型不一样,构成方法重载,所以在main方法中,由BBB类创建对象a,在内存中是BBB类;

但方法的重载,需要看实参的类型,a的类型是AAA,所以调用test(AAA a),

打印结果是aaaa

例2:子类BBB,父类AAA,但形参列表缺少BBB类型,类树体系中类型升级

public class Test3 {
    public static void main(String[] args) {
        BBB a = new BBB();
        test(a);
    }

    public static void test(AAA a){
        System.out.println("aaaa");
    }

}
class AAA{
}
class BBB extends AAA{
}

分析:实参a是BBB类型,但是只有一个test方法,形参列表的类型是AAA;

由于BBB类是AAA类的子类,在继承体系的类树中,a的类型会升级,没有对应的BBB类型的形参列表,a的类型会升级为AAA类,

所以打印结果是aaaa。

例3:类树体系类型升级,但不会发生类型降级

public class Test3 {
    public static void main(String[] args) {
        AAA a = new BBB();
        test(a);
    }

    public static void test(BBB a){
        System.out.println("bbbb");
    }

}
class AAA{
}
class BBB extends AAA{
}

分析:a是AAA类型,但是test方法的形参列表是BBB类型,由于类树中只能升级不能降级,AAA类型不能降级成子类BBB类型进行处理,

所以打印结果报错

例4:基础数据类型的精度升级

public class Test4 {
    public static void main(String[] args) {
        byte b = 10;
        test(b);
    }

    public static void test(short s){
        System.out.println("ssss");
    }

    public static void test(char c){
        System.out.println("cccc");
    }

    public static void test(int i){
        System.out.println("iiii");
    }
}

byte 8位 -> short 16位 -> int 32位

char 32位

b是byte类型,但是test重载方法的形参列表中,并没有byte类型的,所以与例3的子类在类树体系中向父类升级的原则一样,

基础数据类型会进行精度的逐级升级,byte会升级为16位,变为short

所以打印结果是ssss。

例5:char类型和int类型的比较

public class Test4 {
    public static void main(String[] args) {
        byte b = 10;
        test(b);
    }

    public static void test(char c){
        System.out.println("cccc");
    }

    public static void test(int i){
        System.out.println("iiii");
    }
}

分析:byte是8位,现在16位的short没有了,那么继续进行精度升级,变成32位,

char和int都是32位,那么结果会是调用哪一个呢?

由于char由字符变成数字的取值范围,只有0~65535

byte的取值范围是-128~127int的取值范围是 -20多亿~20多亿

因为char类型没有负数,所以byte会精度升级为int类型;

所以b变成int类型后,打印结果是iiii

 

总结:

(1)对于方法重载,关键看实参的类型,调用该类型的形参列表的对应重载方法;

(2)若实参类型没有对应形参列表,会进行继承类树的升级,变成父类形态,再去匹配对应的形参列表的重载方法;

(3)基础数据类型,在发送方法重载时,会进行精度逐级升级。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值