Java数据类型
Java语言是门强类型的语言,所有的变量必须先声明,后使用,从而保证程序更加健壮,可以在编译过程中发现源代码的错误。
强类型语言,意思是每个变量都有一个在编译时就确定的类型。
类型限制了一个变量能有的值,限制了在这些值上可以进行的操作,并确定这些操作的含义。
强类型语言可以在编译时进行更严格的语法检查,从而减少编程错误。
Java语言支持的类型分为两类:基本类型和引用类型。
所有数值类型之间可以进行类型转换,包括自动类型转换和强制类型转换。
1. 八大基本数据类型
基本类型包括数值类型和布尔类型,其中数值类型可包括整数类型和浮点类型。
整数类型包括byte、short、int、long、char;
浮点类型包括float和double。
注意:字符串不是基本数据类型,字符串类型是一个类,也就是一个引用数据类型。
byte
一个byte型整数在内存里占8位,表示范围是-128~127。
short
一个short型整数在内存里占16位,表示范围是-32768~32767。
int
一个int型整数在内存里占32位,表示范围是-2147483648~2147483647。
long
一个long型整数在内存里占64位,表示范围是-9223372036854775808~9223372036854775807。
一个Java整数常量默认就是int类型。
如果直接将一个较小的整数常量赋值给一个byte或short变量,系统会自动把这个整数常量当成byte或者short类型来处理。
如果用一个巨大的整数常量时,Java不会自动把这个整数常量当成long类型来处理。如果希望把一个整数常量当成long类型来处理,应该在这个整数常量后增加L作为后缀。
如果把一个较小的整数常量直接复制给一个long类型的变量,并不是因为Java会把这个较小的整数常量当成long类型来处理,而是发生了类型转换。
public class Test {
public static void main(String[] args) {
byte num1 = 12;
short num2 = 13;
// long num3 = 3333333333333333333; 错误,这个数超过了int的表示范围。
long num3 = 3333333333333333333L;
long num4 = 22;
}
}
Java中整型常量有四种表示方式:10进制、2进制、8进制和16进制,其中2进制的整数常量以0b开头,8进制的整数常量以0开头,16进制的整数常量以0x开头。
public class Test {
public static void main(String[] args) {
int a = 0b10;
int b = 010;
int c = 10;
int d = 0x10;
System.out.println(a); // 2
System.out.println(b); // 8
System.out.println(c); // 10
System.out.println(d); // 16
}
}
char
一个char型整数在内存里占16位,表示范围是0~65535。
字符型通常用于表示单个字符,字符常量必须使用单引号括起来。
Java语言使用16位的Unicode编码集作为编码的方式,因此Java程序支持各种语言的字符。
字符型常量有三种表示形式:
- 直接通过单个字符来制定字符常量,如’a’。
- 通过转义字符标识特殊字符常量,如’/t’。
- 直接使用Unicode表示字符常量,如’/u0023’。
16进制编码方式表示的范围是’/u0000’~’/uFFFF’,一共可以表示65535个字符,前256个字符和ASCII码中的字符完全重合。
字符类型的值可以直接作为整数型的值来使用,但它是一个16位无符号的整数。
如果把一个在0~65535范围内的int整数赋值给字符类型的变量,系统会自动把这个int整数当成char类型来处理。
Java没有提供表示字符串的基本数据类型,而是通过String类来表示字符串,字符串由于由多个字符组成,字符串常量使用双引号括起来。
public class Test {
public static void main(String[] args) {
char aChar = 'a';
char enterChar = '/n';
char ch = '/u9999';
char zhong = '中';
int zhongValue = zhong;
char cc = 97;
System.out.println(aChar);
System.out.println(enterChar);
System.out.println(ch);
System.out.println(zhong);
System.out.println(zhongValue);
System.out.println(cc);
}
}
float
一个float型数值在内存里占32位。
对于float型数值,第一个位是符号位,接下来8位表示指数,接下来的23位表示尾数。
double
一个double型数值在内存里占64位。
对于double型数值,第一个位是符号位,接下来11位表示指数,接下来的52位表示尾数。
Java语言的浮点型默认是double型,如果希望Java把一个浮点型值当成float处理,应该在这个浮点型值后紧跟F。
Java提供了三个特殊的浮点数值:正无穷大,负无穷大和非数,用于表示溢出和出错。正无穷大通过double或float的POSITIVE_INFINITY表示,负无穷大通过double或float的NEGATIVE_INFINITY表示,非数通过double或float的NaN表示。
所有正无穷大数值都是相等的,所有负无穷大数值都是相等的,而NaN不与任何数值相等,甚至和NaN都不相等。
public class Test {
public static void main(String[] args) {
float af = 3.14159F;
System.out.println(af); // 3.14159
double a = 0.0;
double c = Double.NEGATIVE_INFINITY;
float d = Float.NEGATIVE_INFINITY;
System.out.println(c == d); // true
System.out.println(a / a); // NaN
System.out.println(a/a == Float.NaN); // false
System.out.println(6.0/0 == 5555.0/0); // true
System.out.println(-8/a); // -Infinity
System.out.println(-8/a); // Infinity
System.out.println(0/0); // 除数为0的异常
}
}
布尔型
布尔型对应只有一个boolean类型,用于表示逻辑上的”真”或”假”。在Java语言中,boolean类型的数值只能是true或false,不能用0或者非0来表示。其他基本数据类型的值也不能转换成boolean类型。
2. 自动类型转换
如果系统支持把某个基本类型的值直接赋值给另一种基本类型的变量,则这种方式被称为自动类型转换。
当把一个表数范围小的数值或变量直接赋值给另一个表数范围大的变量时,系统可以进行自动类型转换。
public class Test {
public static void main(String[] args) {
int a = 6;
float f = a;
System.out.println(a);
System.out.println(f);
byte b = 9;
// char c = b; 从上图可以,不可以将byte类型直接转换成char类型。
double d = b;
System.out.println(d);
}
}
箭头左边的数值型可以自动类型转换为箭头右边的数值型。
当把任何基本数据类型的值和字符串值进行连接运算时,基本类型的值将自动类型转换为字符串类型。
如果希望把基本类型的值转换为对应的字符串,可以把基本类型的值和一个空字符串进行连接。
public class Test {
public static void main(String[] args) {
// String str1 = 5; 整数不能直接赋值给字符串。
String str2 = 3.5f + "";
System.out.println(3 + 4 + "hello"); // 7hello
System.out.println("hello" + 3 + 4); // hello34
System.out.println("hello" + (3 + 4)); // hello7
}
}
3. 强制类型转换
如果希望将上图中右边的类型转换为左边的类型,则必须使用强制类型转换,强制类型转换的运算符是圆括号。
当试图把表数范围大的类型转换成表数范围小的类型时,容易引起信息丢失。
public class Test {
public static void main(String[] args) {
int iValue = 233;
byte bValue = (byte) iValue;
System.out.println(bValue); // -23
double dValue = 3.98;
int tol = (int) dValue;
System.out.println(tol); // 3
}
}
通常情况下,字符串不能直接转换为基本类型,但通过基本类型的包装类则可以实现把字符串转换成基本类型。
Java为8种基本类型都提供了对应的包装类。8个包装类都提供了一个parseXXX(String str)的静态方法用于将字符串转换成基本类型。
public class Test {
public static void main(String[] args) {
String a = "45";
System.out.println(Integer.parseInt(a)); // 45
}
}
4. 表达式类型的自动提升
当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。规则如下:
- 所有byte型、short型和char型将被提升到int型。
- 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数相同的类型。
表达式的类型将严格保持和表达式中最高等级操作数相同的类型。
带有字符串的表达式,把”+”放在字符串和基本类型之间时,这个加号是一个字符串连接运算符,而不是进行加法运算。
public class Test {
public static void main(String[] args) {
System.out.println("hello" + 'a' + 7); // helloa7
System.out.println('a' + 7 + "hello"); // 104hello
}
}
5. 引用类型
引用类型包括类、接口和数组类型,还有一种特殊的null类型。
引用数据类型就是对一个对象的引用,对象包括实例和数组两种。
实际上,引用类型变量就是一个指针,只是Java语言里不再使用指针这个说法。
空类型就是null值的类型,这种类型没有名称。所以不可能声明一个null类型的变量或者转换到null类型。
空引用是null类型变量唯一的值。空引用可以转换为任何引用类型。
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/tech/java/278296.html