目录
例2:子类BBB,父类AAA,但形参列表缺少BBB类型,类树体系中类型升级
前一篇博客,举了四个例子,说明方法子类继承父类后,方法的重写需要看内存中创建对象的类是哪一个,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~127,int的取值范围是 -20多亿~20多亿;
因为char类型没有负数,所以byte会精度升级为int类型;
所以b变成int类型后,打印结果是iiii
总结:
(1)对于方法重载,关键看实参的类型,调用该类型的形参列表的对应重载方法;
(2)若实参类型没有对应形参列表,会进行继承类树的升级,变成父类形态,再去匹配对应的形参列表的重载方法;
(3)基础数据类型,在发送方法重载时,会进行精度逐级升级。