动手动脑(一)数据类型学习
1,基本数据类型
由于计算机本身是二进制的,而浮点数实际上只是近似值,所以二进制数转为十进制浮点数时,精度容易丢失,解决办法:用BigDecimal转化类型。
2,基本数据类型之间转换规则,
1),自动数据类型转换:容量小的数据类型可以自动转换为容量大的数据类型,转换数据直接赋值即可
实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
特例:整数常量为int类型,只要整数长度不超过对应类型的表示范围即可以自动转为byte,short,char类型。
2),强制数据类型转换:用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
(type)变量
注意:
浮点数强转为int类型,直接丢失小数部分
数据长度超过强转后的类型表数范围,会转换为完全不同的值
int num=300;
byte num2=(byte)num;
System.out.println(num2);
运行结果:
44
不能在布尔类型和任何数值类型之间做强制类型转换
3),大数操作溢出问题:
int money = 1000000000; //10亿
int years = 20;
int total = money*years;
//返回的total是负数,超过了int的范围
System.out.println("错误转换total="+total);
long total1 = money*years;
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long 但是已经发生了数据丢失
System.out.println("错误转换total1="+total1);
//返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。
long total2 = money*((long)years);
System.out.println("正确转换total2="+total2);
long total3=1L*money*years;
System.out.println("正确转换total3="+total3);
运行结果:
错误转换total=-1474836480
错误转换total1=-1474836480
正确转换total2=20000000000
正确转换total3=20000000000
3,常见数据类型转换具体操作:
1)字符串转化为整型;
int i = Integer.parseInt(String str); //静态parseXXX方法
int i = Integer.valueOf(String str).intValue(); //先转换成相应的封装器实例,再调用对应的方法转换成其它类型
Integer.parseInt和 Integer.valueOf 不同,前者生成的是整型,而后者是一个对象,所以要通过intValue()来获得对象的值;
字符串转成 Double, Float, Long 的方法大同小异.
2) 整型转化为字符串:
String str = String.valueOf(int i);
String str = Integer.toString(int i);
String str = “” + i ;
Double, Float, Long 转字符串的方法大同小异.
3) double型转换为int型:
double d1=100.00;
Double D1=new Double(d1);
int i1=D1.intValue();
4,枚举类型:enum Size{SMALL,MEDIUM,LARGE}
枚举类型可以将整形数值转换为对象,可以扩大switch语句的使用范围,枚举类型是引用类型,不属于原始数据类型,可以用“==”和equals()方法直接比对枚举变量的值。
isPrimitive():指定的Class对象表示一个基本类型则返回true
枚举类型的valueOf():调用者为枚举类;
形参只要一个String类型的值即可,并且该String值为枚举值对应的名称;
返回值是一个枚举值
作用是返回【名称为String name的】【枚举类T中的】枚举值
package com.liqin.jiecheng.java;public class Enum_test {
public static void main(String[] args) {
Size s=Size.SMALL;
Size t=Size.LARGE;
//可以用“==”和equals()方法直接比对枚举变量的值。
System.out.println(s.equals(t)); //false
//isPrimitive():指定的Class对象表示一个基本类型则返回true
System.out.println(s.getClass().isPrimitive()); //false
/*valueOf():调用者为枚举类;
形参只要一个String类型的值即可,并且该String值为枚举值对应的名称;
返回值是一个枚举值
作用是返回【名称为String name的】【枚举类T中的】枚举值
*/
Size u=Size.valueOf("SMALL");
System.out.println(s==u); //true
//输出枚举类中的内容
for(Size value:Size.values()){
System.out.println(value);
}
}
//SMALL, MEDUIM, LARGE为常量
enum Size{SMALL,MEDIUM,LARGE};
}
运行结果:
false
false
true
SMALL
MEDIUM
LARGE
5,当局部变量与全局变量重名时,局部变量会屏蔽全局变量。