和其他语言类似,变量就是一块内存空间,创建(声明)变量其实就是在内存中申请一块内存空间用来存放数据。
计算机内存管理系统根据变量的类型来为变量分配存储空间,分配的空间只能用来存储该类型的数据。
因此,可以通过定义不同的类型变量,可以在内存中存储整数、小数和字符。
和JavaScript
类似,java 有两大数据类型:
java 有 8 中基本类型。包括六种数字类型(四个整型,两个浮点型),字符类型和布尔类型。
byte
byte a = 100; byte b = -50;
short
short s = 1000,short r = -20000。
int:
int 数据类型是 32 位、有符号的以二进制补码表示的整数;
long:
float:
double:
double d1 = 7D ; double d2 = 7.; double d3 = 8.0; double d4 = 8.D; double d5 = 12.9867;
7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。
boolean:
boolean one = true。
char:
char letter = 'A';。
对于数字类型的基本类型的取值范围,无需强制记忆,java 已经将它们的值以常量的形式定义为对应的包装类的静态属性了,直接访问对应的属性即可:
public class DataType { public static void main(String[] args) { // byte System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE); // 8 System.out.println("包装类:java.lang.Byte"); System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE); // -128 System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE); // 127 System.out.println(); // short System.out.println("基本类型:short 二进制位数:" + Short.SIZE); // 16 System.out.println("包装类:java.lang.Short"); System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE); // -32768 System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE); // 32767 System.out.println(); // int System.out.println("基本类型:int 二进制位数:" + Integer.SIZE); // 32 System.out.println("包装类:java.lang.Integer"); System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE); // -2147483648 System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE); // 2147483647 System.out.println(); // long System.out.println("基本类型:long 二进制位数:" + Long.SIZE); // 64 System.out.println("包装类:java.lang.Long"); System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE); // -9223372036854775808 System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE); // -9223372036854775807 System.out.println(); // float System.out.println("基本类型:float 二进制位数:" + Float.SIZE); // 32 System.out.println("包装类:java.lang.Float"); System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE); // 1.4E-45 System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE); // 3.4028235E38 System.out.println(); // double System.out.println("基本类型:double 二进制位数:" + Double.SIZE); // 64 System.out.println("包装类:java.lang.Double"); System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE); // 4.9E-324 System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE); // 1.7976931348623157E308 System.out.println(); // char System.out.println("基本类型:char 二进制位数:" + Character.SIZE); // 16 System.out.println("包装类:java.lang.Character"); // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台 System.out.println("最小值:Character.MIN_VALUE=" + (int) Character.MIN_VALUE); // 0 // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台 System.out.println("最大值:Character.MAX_VALUE=" + (int) Character.MAX_VALUE); // 65535 } }
每个内置类型都有对应的默认值,如下表所示:
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | ‘u0000’ |
String (或者其他对象) | null |
boolean | false |
null
。常量在运行时是不能被修改的。
在 java 中使用final
关键字来修饰常量,声明的方法和变量类似:
public class RefType { public static void main(String[] args) { final int constantNumber = 10; // constantNumber = 100; // 报错 System.out.println(constantNumber); } }
编程规范中,常量一般大写:
final int CONSTANT_NUMBER = 10;
整型、常量、字符型数据可以混合运算。运算中,不同类型的数据会先转换为同一类型的然后再进行运算。
转换优先级如下
低 ------------------> 高 byte,short,char—> int —> long—> float —> double
数据类型转换必须满足如下规则:
boolean
类型进行类型转换。public class RefType { public static void main(String[] args) { int i = 128; byte b = (byte) i; System.out.println(b); // -128 } }
在这个例子中,因为 byte 类型是 8 位的,最大值为 127,所以当 32 位的 int 类型 127 转换为 byte 类型的时候,128 大于 byte 类型最大值 127 导致值的溢出。 5. 浮点数到整数的转换是通过舍弃小数得到的,而不是四舍五入得到的:
举例:
public class RefType { public static void main(String[] args) { double f = 0.723; int b = (int) f; System.out.println(b); // 0 f = 5.658; b = (int) f; System.out.println(b); // 5 f = 6.018; b = (int) f; System.out.println(b); // 6 } }
类型的自动转换必须满足转换前的数据类型的位数要低于转换后的数据类型的位数,也就是说 16 为的数据类型 short 可以自动转 32 为数据类型 int,反之 int 转为 short 是不可以的。
public class RefType { public static void main(String[] args) { char letter = 's'; int i = letter; System.out.println(i); // 115 short s = 10; i = s; System.out.println(i); // 10 int j = 11; letter = j; // 报错:Type mismatch: cannot convert from int to char System.out.println(letter); // 10 } }
要求:转换的数据类型必须是兼容的。
举例:
public class RefType { public static void main(String[] args) { int i = 123; // byte b = i; // 报错:Type mismatch: cannot convert from int to byte long l = i; // 因为long类型是64位的,int类型的32位的,因此int类型是可以自动转换为long类型 System.out.println(l); // 123 byte b = (byte) i; // 强制转换为byte类型 System.out.println(b); // 123 } }