您的位置 首页 java

Java方法重载时,参数都是基本类型时,可能会造成的一些混淆

基本类型能从一个“较小”的类型自动提升至一个“较大”的类型,此过程一旦牵涉到重 载,可能会造成一些混淆。

最终结论:

  • 实际参数是常量数字5时,按int, long , float ,double顺序找函数
  • 实际参数是char型时,按char,int,long,float,double顺序找函数
  • 实际参数是byte型时,按byte, short ,int,long,float,double顺序找函数
  • 实际参数是short型时,按short,int,long,float,double顺序找函数
  • 实际参数是int型时int,按long,float,double顺序找函数
  • 实际参数是long 型时,按long,float,double顺序找函数
  • 实际参数是 float 型时,按float,double顺序找函数
  • 实际参数是 double 型时,只找参数是double的函数

下面是具体的代码例子。

实际参数是常量数字5时,int,long,float,double顺序找函数

结论:常数值5被当作int值处理,所以如果有某个 重载 方法接受int型参数,它就会被调用。至于其他情况,如果传入的数据类型(实际参数类型)小于方法中声明的 形式参数 类型,实际数据类型就会被提升。

下面我们跟一下代码:

char、byte、short、int、long、float、double的情况,5传到了int参数所在函数

 void f1(char x) {
     System .out.print("f1(char) ");
}

void f1(byte x) {
    System.out.print("f1(byte) ");
}

void f1(short x) {
    System.out.print("f1(short) ");
}

void f1(int x) {
    System.out.print("f1(int) ");
}

void f1(long x) {
    System.out.print("f1(long) ");
}

void f1(float x) {
    System.out.print("f1(float) ");
}

void f1(double x) {
    System.out.print("f1(double) ");
}
  

我们用idea的debug一步步跟一下,看看:

可以Step Into看看:

即:

byte、short、int、long、float、double的情况,5传到了int参数所在函数

现在看看少一个char的情况:

     void f2(byte x) {
        System.out.print("f2(byte) ");
    }

    void f2(short x) {
        System.out.print("f2(short) ");
    }

    void f2(int x) {
        System.out.print("f2(int) ");
    }

    void f2(long x) {
        System.out.print("f2(long) ");
    }

    void f2(float x) {
        System.out.print("f2(float) ");
    }

    void f2(double x) {
        System.out.print("f2(double) ");
    }
  

Step Into:

也还是int的方法:

short、int、long、float、double的情况,5传到了int参数所在函数

现在看看再少一个byte的情况:

     void f3(short x) {
        System.out.print("f3(short) ");
    }

    void f3(int x) {
        System.out.print("f3(int) ");
    }

    void f3(long x) {
        System.out.print("f3(long) ");
    }

    void f3(float x) {
        System.out.print("f3(float) ");
    }

    void f3(double x) {
        System.out.print("f3(double) ");
    }
  

Step Into:

int、long、float、double的情况,5传到了int参数所在函数

long、float、double的情况,5传到了long参数所在函数

float、double的情况,5传到了float参数所在函数

double的情况,5传到了double参数所在函数

即:

 5: f1(int) f2(int) f3(int) f4(int) f5(long) f6(float) f7(double) 
  

再重复下:你会发现常数值5被当作int值处理,所以如果有某个重载方法接受int型参数,它就会被调用。至于其他情况,如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。

实际参数是char型时,char,int,long,float,double顺序找函数

结论:char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升至int型。

char、byte、short、int、long、float、double的情况, ‘x’ 传到了 char 参数所在函数

byte、short、int、long、float、double的情况, ‘x’ 传到了int参数所在函数

short、int、long、float、double的情况, ‘x’ 传到了 int 参数所在函数

int、long、float、double的情况, ‘x’ 传到了 int 参数所在函数

long、float、double的情况, ‘x’ 传到了 long 参数所在函数

float、double的情况, ‘x’ 传到了 float 参数所在函数

double的情况, ‘x’ 传到了 double 参数所在函数

实际参数是byte型时,byte,short,int,long,float,double顺序找函数

顺序找函数

char、byte、short、int、long、float、double的情况, byte 传到了 byte 参数所在函数

byte、short、int、long、float、double的情况, byte 传到了 byte 参数所在函数

short、int、long、float、double的情况, byte 传到了 short 参数所在函数

int、long、float、double的情况, byte 传到了 int 参数所在函数

long、float、double的情况, byte 传到了 long 参数所在函数

float、double的情况, byte 传到了 float 参数所在函数

double的情况, byte 传到了 double 参数所在函数

实际参数是short型时,short,int,long,float,double顺序找函数

顺序找函数

char、byte、short、int、long、float、double的情况, short 传到了 short 参数所在函数

byte、short、int、long、float、double的情况, short 传到了 short 参数所在函数

short、int、long、float、double的情况, short 传到了 short 参数所在函数

int、long、float、double的情况, short 传到了int 参数所在函数

long、float、double的情况, short 传到了 long 参数所在函数

float、double的情况, short 传到了float 参数所在函数

double的情况, short 传到了double 参数所在函数

实际参数是int型时int,long,float,double顺序找函数

char、byte、short、int、long、float、double的情况, 传到了 int 参数所在函数

byte、short、int、long、float、double的情况, 传到了 int 参数所在函数

short、int、long、float、double的情况, 传到了 int 参数所在函数

int、long、float、double的情况, 传到了 int 参数所在函数

long、float、double的情况, 传到了 long 参数所在函数

float、double的情况, 传到了 float 参数所在函数

double的情况, 传到了 double 参数所在函数

实际参数是long 型时long,float,double顺序找函数

char、short、int、long、float、double的情况, 传到了 long 参数所在函数

short、int、long、float、double的情况, 传到了 long 参数所在函数

int、long、float、double的情况, 传到了 long 参数所在函数

long、float、double的情况, 传到了 long 参数所在函数

float、double的情况, 传到了 float 参数所在函数

double的情况, 传到了 double 参数所在函数

实际参数是 float 型时float,double顺序找函数

char、short、int、long、float、double的情况, 传到了 float 参数所在函数

short、int、long、float、double的情况, 传到了 float 参数所在函数

int、long、float、double的情况, 传到了 float 参数所在函数

long、float、double的情况, 传到了 float 参数所在函数

float、double的情况, 传到了 float 参数所在函数

double的情况, 传到了 double 参数所在函数

实际参数是 double 型时,double顺序找函数

char、short、int、long、float、double的情况, 传到了 double 参数所在函数

short、int、long、float、double的情况, 传到了 double 参数所在函数

int、long、float、double的情况, 传到了 float 参数所在函数

long、float、double的情况, 传到了 double 参数所在函数

float、double的情况, 传到了 double 参数所在函数

double的情况, 传到了 double 参数所在函数

 代码部分来自 Java 编程思想  

文章来源:智云一二三科技

文章标题:Java方法重载时,参数都是基本类型时,可能会造成的一些混淆

文章地址:https://www.zhihuclub.com/189474.shtml

关于作者: 智云科技

热门文章

网站地图