java 重载类型转换_java重载中的基本类型的自动类型转换

当传递到函数的参数的数据类型表示的范围小于函数形参的参数类型遵循如下原则 :char类型比较特殊, 直接转换为int:  char ->int ->long->float->double

其他的基本数据类型都遵循这个规则: byte->short->int->long->float->double

浮点型常量: 比如0.5等没有明确指出是何种类型的常量. 直接处理成double类型, 而不是float

如果希望是某一种明确的类型, 最后显示地给出, 比如0.5F,0.5f.0.5D,1L等等.

当传递导函数的参数类型表示的范围大于函数形参的参数类型, 那么就必须显示地进行窄化转换

package BaseType;

public class OverloadTest

{

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

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

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

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

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

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

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

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(float x){System.out.println("f2(float)") ;}

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

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

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

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

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

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

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

void f4(int x) {System.out.println("f4(int)") ;}

void f4(float x){System.out.println("f4(float)") ;}

void f4(double x){System.out.println("f4(double)") ;}

void f4(long x){System.out.println("f4(long)") ;}

void f5(float x){System.out.println("f5(float)") ;}

void f5(double x){System.out.println("f5(double)") ;}

void f5(long x){System.out.println("f5(long)") ;}

void f6(float x){System.out.println("f6(float)") ;}

void f6(double x){System.out.println("f6(double)") ;}

void f7(double x){ System.out.println("f6(double)") ; }

void f8(char x){System.out.println("f8(char)") ;}

void f8(byte x){System.out.println("f8(byte)") ;}

void f8(int x) {System.out.println("f8(int)") ;}

void f8(float x){System.out.println("f8(float)") ;}

void f8(double x){System.out.println("f8(double)") ;}

void f8(long x){System.out.println("f8(long)") ;}

void f9(float x){System.out.println("f9 float");}

void testConstVal()

{

System.out.println("5: ") ;

f1(5) ;f2(5) ;f3(5) ;f4(5) ;f5(5) ;f6(5) ;f7(5) ;

System.out.println() ;

}

void testChar()

{

char x = 'x' ;

System.out.println("char x: ") ;

f1(x) ;f2(x) ;f3(x) ;f4(x) ;f5(x) ;f6(x) ;f7(x) ;

System.out.println() ;

}

void testByte()

{

byte x = 0 ;

System.out.println("byte x: ") ;

f1(x) ;f2(x) ;f3(x) ;f4(x) ;f5(x) ;f6(x) ;f7(x) ;

System.out.println() ;

}

void testShort()

{

short x = 0 ;

System.out.println("short x: ") ;

f1(x) ;f2(x) ;f3(x) ;f4(x) ;f5(x) ;f6(x) ;f7(x) ;

System.out.println() ;

}

void testInt()

{

int x = 0 ;

System.out.println("int x: ") ;

f1(x) ;f2(x) ;f3(x) ;f4(x) ;f5(x) ;f6(x) ;f7(x) ;

System.out.println() ;

}

void testLong()

{

long x = 0 ;

System.out.println("long x: ") ;

f1(x) ;f2(x) ;f3(x) ;f4(x) ;f5(x) ;f6(x) ;f7(x) ;

System.out.println() ;

}

void testFloat()

{

float x = 0 ;

System.out.println("float x: ") ;

f1(x) ;f2(x) ;f3(x) ;f4(x) ;f5(x) ;f6(x) ;f7(x) ;

System.out.println() ;

}

void testDouble()

{

double x = 0 ;

System.out.println("double x: ") ;

f1(x) ;f2(x) ;f3(x) ;f4(x) ;f5(x) ;f6(x) ;f7(x) ;

System.out.println() ;

}

public static void main(String args[])

{

OverloadTest t = new OverloadTest() ;

t.testConstVal();

t.testByte();

t.testChar();

t.testShort();

t.testInt();

t.testLong();

t.testFloat();

t.testDouble();

double d = 0.9d ;

//  t.f9(d) ; 这么写是错误的

t.f9((float)d) ; //必须显示地进行窄化转换

}

}

3. 涉及自动装箱和拆箱的重载

自动装箱:java的自动装箱和拆箱仅限于基本数据类型和包装数据类型之间!

对于char类型:char ->int ->long->float->double->Character->Object->可变参数类型, 并且它不能提升为Integer等其他包装类型, 因为无论如何进行自动类型转换,char类型始终是char类型, 装箱之后也只能是Character, Character是无法转换为Integer等其他包装类型的;

与此类似, 其他的基本数据类型也是如此

自动拆箱:对于Character类型: Character->Object->char ->int ->long->float->double->可变参数类型(由于Character是Object类型的子类, 所以优先)

对于其他的包装类型: 都是首先寻找自动拆箱之后的数据类型, 然后是自动类型提升之后可以使用的基本数据类型

包装类型之间是无法互相转换的!

总之一句话, 对于基本数据类型, 如果能在基本数据类型之间转换, 就不使用包装类型;  包装类型能转换成自身拆箱之后的基本数据类型就转换成为基本数据类型, 如果不能就转成对应基本数据类型相邻最近的基本数据类型.(比较绕,本人能力有限í﹏ì)

临时补充: 对于包含可变参数列表, 遵循该参数列表的类型和待转换的类型而定, 允许基本数据类型和包装数据类型之间的转换和基本数据类型的自动提升

//代码来自《thingking in java》。

//《thinking in java》笔记, 如果有什么不对的地方, 欢迎指正^_^

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值