Java数据类型转换

来自CloudWiki
跳转至: 导航搜索

课前预习

  • byte,short,int,float,double这几个数字类型 在内存中各占几个字节 ?


  • 在Java程序中,不同的基本类型的值经常需要进行相互转换。Java语言所提供的7种数值类型之间可以相互转换,有三种类型转换方式:自动类型转换、强制类型转换、字符串转换为基本数据类型。

基本数据类型之间的转换

自动类型转换

什么叫自动类型转换?

  • 当把一个表示范围小的数值或变量直接赋值给另一个表示范围大的变量时,系统将进行自动数据类型转换。
  • 表示范围小的可以向表示范围大的进行自动类型转换,就如同有两瓶水,当把小瓶里的水倒入大瓶中时不会有任何问题。Java支持自动数据类型转换的类型如图2-4所示。
  • 例如:
int a = 6;      //声明一个int类型变量a
double d = a;  //将a赋值给d,会进行自动类型转换
System.out.println(d);  //此时输出6.0

表示范围小的可以向表示范围大的进行自动类型转换,就如同有两瓶水,当把小瓶里的 水倒入大瓶中时不会有任何问题。Java支持自动数据类型转换的顺序如图2-4所示

  • Java2-8.png
  • 图2-4 Java自动数据类型转换顺序
  • 图2-4中所示的箭头左边的数值类型可以自动类型转换为箭头右边的数值类型。例如:
int a = 6;      //声明一个int类型变量a
double d = a;  //将a赋值给d,会进行自动类型转换
System.out.println(d);  //此时输出6.0
byte b = 9;    //定义一个byte类型的整数变量b
char c = b;    //这句代码出错,byte类型不能自动类型转换为char类型
float f = b;    //将b赋值给f,byte类型变量会自动类型转换为float类型
System.out.println(f);   //此时输出9.0


强制类型转换

  • 如果希望把图2-4中箭头右边的类型转换为左边的类型,即如果需要把表示范围大的数据或变量赋值给表示范围小的变量,则必须进行强制类型转换。强制类型转换的语法格式为:
(数据类型)表达式;

Java2-60.png

  • 当进行强制类型转换时,类似于把一个大瓶子里的水倒入一个小瓶子,如果大瓶子里的水不多还好,但如果大瓶子里的水很多,将会引起溢出,从而造成数据丢失。这种转换也被称为“缩小转换”。例如:
double d = 7.5;
int i = (int)d;    //强制把一个double类型的值转换为int类型的值
System.out.println(i);  //将输出:7
int value = 233;
/*
* 强制把一个int类型的值转换为byte类型的值,
* 此时int类型的值为233,超出byte类型表示的范围,
* 引起溢出,造成数据丢失,
* 强制类型转换后b的值为-23
*/
byte b = (byte)value;
System.out.println(b);  //将输出:-23

注意:

  • 强制类型转换一般不推荐使用,因为有可能发生精度损失、数据溢出。
  • byte、short、char这三种类型都可以发生数学运算,例如,加法“+”。而byte、short、char这三种类型在运算的时候,都会被首先提升成为int类型,然后再计算。
  • boolean类型不能发生数据类型转换。

表达式类型的自动提升

  • 当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java定义了如下的自动提升规则:
    • 所有的byte类型、short类型和char类型将被提升到int类型。
    • 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。操作数的等级如图2-4所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。
  • Java2-8.png

练习题:

1. 商苑面馆 项目中有这么几个变量:int num = 5;double price = 10;float weight = 0.5f

1)新定义一个变量long total_num ;total_num = num;这属于自动类型转换 还是强制类型转换 ?

2)新定义一个变量float total_price ; 试试 total_price = price ?为什么不成功 ?应该怎么该 ?

3) 用println打印一句话:“本面馆 现有 面品”+num+“碗”,这体现了什么转换 ?

4)double total_sum = price* num中 price为double型,num为int型,他们计算的结果应该是什么型?

字符串与基本类型的转换

基本类型自动转换为字符串

  • 不仅如此,当把任何基本类型的值和字符串值进行连接运算时,基本类型的值将自动类型转换为字符串类型,虽然字符串类型不是基本数据类型,而是引用类型。因此,如果希望把基本类型的值转换为对应的字符串时,可以把基本类型的值和一个空字符串进行连接。例如:
/*
* 此时先执行20 + 18,进行算术运算加法操作,结果为:38
* 再执行 38 + "Hello!",进行字符串连接操作,结果为:38Hello!
* 因此输出为:38Hello!
*/
System.out.println(20 + 18 + "Hello!");
/*
* 此时先执行"Hello!" + 20,进行字符串连接操作,结果为:Hello!20
* 再执行 "Hello!20" + 18,进行字符串连接操作,结果为:Hello!2018
* 因此输出为:Hello!2018
*/
System.out.println("Hello!" + 20 + 18);

字符串转换为基本类型

  • 在通常情况下,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。例如:
String str = "45";
//使用Integer的方法将一个字符串转换成int类型
int iValue = Integer.parseInt(str);
String ds = "5.3739";
//使用Double的方法将一个字符串转换成double类型
Double d = Double.parseDouble(ds);
  • Java为8种基本类型都提供了对应的包装类:boolean对应Boolean、byte对应Byte、short对应Short、int对应Integer、long对象Long、float对应Float、double对应Double、char对应Character。除Character包装类外,其余7个包装类都提供了一个parseXxx(String str)静态方法用于将字符串转换成基本类型。
  • 字符串转换为基本类型的方法(汇总);
Byte.parseByte(str)	将括号中的字符串转换成byte类型
Short.parseShort(str)	将括号中的字符串转换成short类型
Integer.parseInt(str)	将括号中的字符串转换成int类型
Long.parseLong(str)	将括号中的字符串转换成long类型
Float.parseFloat(str)	将括号中的字符串转换成float类型
Double.parseDouble(str)	将括号中的字符串转换成double类型
Boolean.parseBoolean(str)	将括号中的字符串转换成boolean类型

例题:商院面馆现在开始调价了 !

  Scanner sc = new Scanner(System.in);
  System.out.println("请输入价格:");
  String s = sc.nextLine();
  double price = Double.parseDouble(s);
  System.out.println("新的价格为:"+price);


练习:

1)现在有一个字符串str="15",如何用一行代码把它转化为整数类型并赋给变量int num? 2)现在有一个字符串str="12.5",如何用一行代码把它转化为浮点类型并赋给变量float price?

知识点小结