Java中 类型转换 基础知识与注意事项总结

<华清远见>类型的转换包括:1.基本数据类型的相互转换  2.String字符串与基本数据类型之间的转换  3.父子类之间的向上、向下转型。


前言

类型的转换可以大致分为

1.基本数据类型之间的自动转换、强制转换。

2.String字符串与基本数据类型之间的转换。

3.父子类之间的转换(向上、向下转型)。


一、基本数据类型

  基本数据类型(简单数据类型)成员:

(1)整数类型     byte(字节)、short(短整型)、int(默认类型)、long(长整型)

(2)浮点类型 float(单精度浮点型)、double(双精度浮点型)【默认类型】

(3)字符类型 char

(4)布尔类型 boolean

基本数据类型位数(bit):

boolean   byte  char  short  int  float  long  double

    1            8      16      16    32   32     64      64

1.自动类型转换

整数类型和浮点类型,位数较小的都可以自动转换为位数较大的类型。(浮点型不能自动转换为整型)

其中有几个较为特殊:

int--->char 虽然int位数大于char位数,也可以实现自动类型转换,根据ASCII字节码对应关系进行转换

int--->float、long--->double 转换双方位数相同,可以自动类型转换,但会有精度损失

long--->float long整型所占位数虽然大于float类型,但也可以自动类型转换,同样会发生精度损失

例如以下两种形式均会发生自动类型转换:

    int a=1;
    double b=a; //int类型自动转换为double类型

    double c=1;//默认为int类型,所以同上

注意:

1. 当byte、short、char类型进行运算操作时,会转化为int类型。

    byte b1=1;
    byte b2=1;
    byte a=b1+b2; //错误,运算时转换为int型,int型不能自动转换为byte型

  2.当参与运算的两个相关类型,不是同一类型时,结果为位数较大的类型。

    int a=1;
    double b=1.23;
    double c=a+b;  //不能用int类型承接

2.强制类型转换          

对于无法自动转换类型的情况,也就是我们所说的大转小,可以通过强制措施实现类型的转换:

                                         目标类型 变量名 = (目标类型)变量;

例如:

    float a=1.23f;
    int b=(int)a;

    int c=(int)1.23f;

注意:

1.强制转换类型时可能会发生精度损失或者溢出。

    int a=128;
    byte b=(byte)a;
    System.out.println(b); //byte范围为-128~127,所以发生溢出,输出值为-128

2.浮点数强制转换为整数时,是直接舍弃小数部分,而不是四舍五入

	double a=1.99;
	int b=(int)a;
	System.out.println(b); //输出结果为1

3.String字符串与基本数据类型(不包括布尔类型)之间的转换

    1.1 String--->整型、浮点型 :如int、double、float等等,利用类型对应封装类中的parseXX()方法。

    String s="123";
    int i=Integer.parseInt(s);

    1.2 String--->char : 利用String类对象调用CharAt()方法。

    String s="a";
    char c=s.charAt(0);

   

    2.基本数据类型--->String : 

       方法一:直接拼接空字符串

    char c='a';
    String s=c+"";

      方法二:利用String类方法String.valueOf()方法

    double d=6.26;
    String s=String.valueOf(d);

二、类之间的类型转换

   类之间的转换也就是将对象或引用赋给引用(造型)的过程。父类可以理解为范围较广的一类,子类可以理解为范围较小的一类,就与基本数据类型中位数较多的类型与位数较少的类型相似,但是,在转换过程中有着很大的不同。

1.向上转型

 向上转型就是将子类对象赋给父类引用 (也可以叫做父类引用指向子类对象)。

理解:

1.与基本数据类型相似,范围较小的子类对象可以直接赋给范围较大父类引用,但父类对象不能赋给子类引用。

2.与基本数据类型完全不同的是,父类对象即使通过强制转换赋给子类引用时,编译不会报错,但运行时会报出异常。

class Father{
}

class Son extends Father{
}

class SomeBody{
}


public class Test{
    public static void main(String []args){

        Son s1=new Son();
        Father f1=s1;               //1. 正确,可以将子类对象赋给父类引用

        Father f2=new Son();        //2. 同上

        Father f3=new Father();
        Son s3=f3;                  //3. 编译报错,父类对象不能赋给子类引用

        Father f4=new Father();
        Son s4=(Son)f4;             //4. 即使通过强制转换,编译正常,但运行时会报异常

        Son son =new Son();
        SomeBody sb=(SomeBody)son;  //5. 编译报错,无关类之间无法实现转换
  }
}


注意:

1.两个无关类,包括同一个父类的的两个子类之间,无法进行类型转换,会编译报错。

2.向下转型

向下转型就是将子类对象的父类引用赋给子类引用

理解:

1.是一个将引用赋给引用的过程,也就是向下转型的目标一定是经过了向上转型的。

2.父类引用指向子类A时,可以强制将父类引用转换为子类A。

3.父类引用指向子类A时,如想将父类引用强制转换为同一父类的其他子类B,编译不报错,但会报异常。

class Animal{
}

class Dog extends Animal{
}

class Cat extends Animal{
}


public class Test{
    public static void main(String []args){
       Animal a_d=new Dog();  //向上转型
       
       //向下转型
       Dog d=(Dog)a_d;  //正常运行
       
       Cat c=(Cat)a_d;  //编译通过,但运行时报异常

  }
}

总结

    本文仅仅是个人学习的一点点总结,熟悉类型转换机制可以对理解JAVA的基本逻辑机制有较大的帮助。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值