乐趣区

从0开始学JAVA1-数据类型

Java 语言中对于数据类型分为 2 种

  • 基本数据类型(一些具体的数字单元,例如 1、1.1、)

    1. 数值型:
      • 整形:byte、short、int、long –> 默认值:0
      • 浮点型 float、double –> 默认值:0.0
    2. 布尔型:boolean –> 默认值:false
    3. 字符型:char –> 默认值 ’u0000′
  • 引用数据类型(牵扯到数据内存的使用)

    数组、类型、接口 –> 默认值:null

浮点型数据

对于 java 中的小数类型的常量,其对应的类型都是 double 类型,就类似整数类型的常量对应的是 int 类型。

字符型

在任何编程语言中,字符都可以和 int 相互转换,字符转化成 int 将得到对应的系统编码。
例子:

int num5 = 'A';
System.out.println(num5);//65

字符编码参考:

大写字母 ’A'(65)~’Z'(90)
小写字母 ’a'(97)~’z'(122)
数字范围 ‘0’(48)~’9′(57)

可以发现大小写字母之间的编码差 32,由此可以实现英文字母大小写的转换。
且 java 可以使用 char 进行中文保存,是因为 java 使用 unicode 这种 16 进制的编码。

数据类型选择规则

  • 如果要描述数字,首选 int、double
  • 如果要进行数据传输或者文字编码使用 byte 类型(二进制处理操作)
  • 处理中文最方便操作使用的是 char
  • 描述内存或者文件大小、或者描述表的主键使用 long

注意

数据溢出问题

数据类型可以进行转换的,范围小的数据类型可以自动转换为大的数据类型,但是数据大的要转为小的则需要进行强制转换,同时还需要注意因此带来的数据溢出问题。示例如下。

猜猜结果是什么?

int num = Integer.MAX_VALUE;
System.out.println(num + 1);

结果是 -2147483648,为什么呢?
因为 num 是 int 类型,int 类型得最大值是 2147483647,那么当 + 1 之后,由于 int+int 的值还是 int 类型,而结果显然大于了这个数字,因此造成了数据溢出,导致结果计算错误。
那么怎么解决呢?

int num1 = Integer.MAX_VALUE;
System.out.println(num + 1L);

看出来区别了吗?由于 java 的自动类型转换,num+1L 会转换为 long 类型,所以数据溢出的问题就解决了。

强制转换可能导致数据溢出

隐式转换也叫作自动类型转换, 由系统自动完成. 从存储范围小的类型到存储范围大的类型
byte ->short(char)->int->long->float->double

显示类型转换也叫作强制类型转换, 是从存储范围大的类型到存储范围小的类型.
显示类型转换需要进行声明,但是当心会出现精度丢失的问题如:

long longNum = Integer.MAX_VALUE + 1;
int num2 = (int)longNum;
System.out.println(num2);//-2147483648

结果显然是因为精度丢失导致的结果不对,此处需要注意。除非到不得已情况,不然不要轻易使用强制类型转换。

byte 类型需要注意的地方

那么再思考一下如下代码结果是什么呢?

// 此处 20 是 int 类型,但 java 对 byte 类型赋值有特殊处理
// 如果该值没有超过 byte 最大值,则会自动转换为 byte 类型进行赋值。// 如果超过 byte 最大值,才会要求强制转换
byte num4 = 20;
System.out.println(num4 * num4);

答案是:400
那为什么此处 400 超过 byte 最大值 127 而未发生数据溢出?
再看下如下代码

byte num4 = 20;
byte result = num4 * num4;
System.out.println(result);

结果是什么?
会编译错误!为什么?因为此时 num4 * num4 的结果超过了 byte 类型最大值,所以是 int 类型,那么此处就需要强制转换才能够防止编译错误。
当然实际中不会这么写,此处只是为了说明 byte 的变量赋值机制。

退出移动版