Java备忘录《数据类型》

651 阅读6分钟

基本数据类型

Java中基本的数据类型分为4大类,共8中数据类型

  • 整数类型:byte、short、int、long
  • 浮点类型:float、double
  • 字符类型:char
  • 布尔类型:boolean

整数,浮点,字符类型都属于数值类型,可以互相转换

1、整型类型

java中四种整型类型之间的区别仅仅只是宽度和范围上的不同。Java中的数据类型是跨平台的(与运行在那种平台无关),无论计算机是32位还是64位的,byte类型整数都是占一个字节(8位)。

Java中整型类型默认是int类型。 long类型需要在数值后边加上大写或者小写的英文字母L(推荐使用大写,防止小写与数字1混淆)

2、浮点类型

浮点类型主要用于存储小数数值,也可以用来存放数值较大的整数,分为浮点数(float)和双精度浮点数(double)两种,双精度浮点数所使用的内存空间比浮点数多,可表示的数值范围和精度也比浮点数大。

Java中浮点类型默认是double类型,例如0.0表示的是double常量,而不是float类型,要想表示float类型,需要在数值后边加上F或者f。double类型数据后边也可以加上D或者d来表示double浮点数

3、数字表示方式

如果为一个整数变量赋值,使用二进制数、八进制数和十六进制数表示,它们的表示方式分别如下:

二进制数:以 0b 或0B为前缀,注意0是阿拉伯数字,不要误认为是英文字母o。

八进制数:以0为前缀,注意0是阿拉伯数字。

十六进制数:以 0x 或0X为前缀,注意0是阿拉伯数字。

例如下面几条语句都是表示int整数28。

int decimalInt = 28;
int binaryInt1 = 0b11100;
int binaryInt2 = 0B11100;
int octalInt = 034;
int hexadecimalInt1 = 0x1C;
int hexadecimalInt2 = 0X1C;

4、字符类型 Java中char声明字符类型,表示单个字符,在使用时字符需要使用单引号括起来。

char c = 'A';

Java字符采用双字节Unicode编码,占两个字节(16位),因而可用十六进制(无符号的)编码形式表示,它们的表现形式是\un,其中n为16位十六进制数,所以'A'字符也可以用Unicode编码'\u0041'表示

    char c1 = 'A';          A
    char c2 = '\u0041';     A
    char c3 = '花';         花

字符类型也属于是数值类型,可以与int等数值类型进行数学计算或进行转换。这是因为字符类型在计算机中保存的是Unicode编码,双字节Unicode的存储范围在\u0000~\uFFFF,所以char类型取值范围0~216-1。

为了表示一些特殊字符,前面要加上反斜杠(\),这称为字符转义。

5、布尔类型

Java中声明布尔类型的关键字是boolean,只用两个值true/false。

在C语言中布尔类型是数值类型,它有两个取值:1和0。而在Java中的布尔类型取值不能用1和0替代,也不属于数值类型,不能与int等数值类型之间进行数学计算或类型转化。

6、数值类型相互转换

基本数据类型中数值类型之间可以互相转换,布尔类型不能与它们之间进行转换。但有些不兼容类型之间,如String(字符串)转换为int整数等,可以借助于一些类的方法实现。

自动转换类型:小范围数据类型可以自动转换为大范围数据类型

char类型比较特殊,char自动转换为int、long、float和double,但byte和short不能自动转换为char,而且char也不能自动转换为byte或short。

自动类型转换不仅发生在赋值过程中,在进行数学计算时也会发生自动类型转换,在运算中往往是先将数据类型转换为同一类型,然后再进行计算

强制类型转换:强制类型转换是在变量或常量之前加上“(目标类型)”实现,强制类型转换主要用于大宽度类型转换为小宽度类型情况。

//int型变量
int i = 10;
float c1 = i / 3;                  3.0
//把int变量i强制转换为float
float c2 = (float)i / 3;           3.333333

在进行强制转换时,需要注意计算过程中精度丢失问题,最好是现将需要计算的数值转换成目标精度再进行计算

long yourNumber = 6666666666L;      6666666666
int myNuber = (int)yourNumber;      -1923267926

经过强制类型转换后,原本的6666666666L变成了负数。当大宽度数值转换为小宽度数值时,大宽度数值的高位被截掉,这样就会导致数据精度丢失。除非大宽度数值的高位没有数据,就是这个数比较小的情况,例如将6666666666L换为6L就不会丢失精度。

7、引用数据类型

在Java中除了8种基本数据类型外,其他数据类型全部都是引用(reference)数据类型,引用数据类型用了表示复杂数据类型,包含:类、接口和数组声明的数据类型。

Java中的引用类型,相当于C等语言中指针(pointer)类型,引用事实上就是指针,是指向一个对象的内存地址。引用类型变量中保持的是指向对象的内存地址。很多资料上提到Java不支持指针,事实上是不支持指针计算,而指针类型还是保留了下来,只是在Java中称为引用类型。

int x = 7;                         ①
int y = x;                         ②

String str1 = "Hello";             ③
String str2 = str1;                ④
str2 = "World";                    ⑤

上段代码中,两个基本数据类型,两个引用数据类型,1、2代码将7赋值给x,将x赋值给y,此时两个变量值都为7,并互不影响。

当程序执行完第③行时,字符串“Hello”对象被创建,保持到内存地址0x12345678中,str1是引用类型变量,它保存的是内存地址0x12345678,这个地址指向“Hello”对象。

当程序执行完第④行时,str1变量内容(0x12345678)被赋值给str2是引用类型变量,这样一来str1和str2保存了相同的内存地址,都指向“Hello”对象。见图5-4所示,此时str1和str2本质上是引用一个对象,通过任何一个引用都可以修改对象本身。

当程序执行完第⑤行时,字符串“World”对象被创建,保持到内存地址0x23455678中,地址保存到str2变量中,此时,str1和str2不再指向相同内存地址