常量的6个类别(与下文变量相区分,为不变的量):
- 字符串常量,“Hello”、“abc”、“123”
- 整数常量,“100”、“-250”、“0”
- 浮点数常量,“-3.14”、“0.0”、“2.5”
- 字符常量,‘A’、‘9’、‘中’(单引号中必须有且只有一个字符)
- 布尔常量,true、false
- 空常量,null(即没有任何数据,不能直接打印输出)
基本数据类型
基本数据类型包括(8种,int 、double 分别是整数类型和浮点类型中的默认数据类型):
数据类型(内存占用 / 字节) | 取值范围 |
字节型 byte(1) | -128 到 127 |
短整型 short(2) | -32768 到 32767 |
整型 int(4) | -231 到 231-1 |
长整型 long(8) | -263 到 263-1 |
单精度浮点数 float(4) | 1.4013E-45 到 3.4028E+38 |
双精度浮点数 double(8) | 49E-324 到 1.7911E+308 |
字符型 char(2) | 0 到 65535 |
布尔类型 boolean(1) | true、false |
前四种统称为为整数类型,float和double统称浮点数类型。
数据类型还有一类叫:引用数据类型。在之后学,包括字符串、数组、类、接口、Lambda…
注意事项:
- 浮点型可能只是个近似值,非精确值
- 取值范围与内存不一定相关,float(4字节)取值范围比long(8字节)更广泛
- 只写100是int,100L是long,只写3.14是double,3.14F是float。(大小写皆可,推荐大)
- 字符串是引用类型,不是基本类型,字符串的加法“+”表示连接操作
例1:
str1=java;
System.out.println(str1+20+30);
结果为java2030,因为先执行了第一个“+”号
System.out.println(str1+(20+30));
结果为java50,改变了优先级,小括号是个神奇的东西。
使用方法
数据类型 变量名=数据值;(当然也可以先创建再赋值)
int num1=6;
float num2=3.14F;(非默认类型赋值带上后缀,如L、F)
char num3=‘中’;
boolean var=true;
注意事项:
- 变量赋值后赋值才可打印输出
- 在作用域内使用变量(从该变量定义直到所属大括号之间)
- 多个变量赋值可写为:int a=10,b=20,c=30;
类型转换
- 自动类型转换(隐式)要求:数值范围从小到大,例如以下操作会发生自动转换:
long num1=100; (从int变为long)
double num2=2.5F;(从float变成double)
float num3=30L;(从long变成float,结果为30.0) - 强制类型转换(显式,不推荐,方法是直接在右侧数值前加(),里面填要转的类型,如下面例子中的int):
int num4=(int)100L;(没有问题)
int num5=(int)6000000000L;(结果为1705032704,数据溢出)
int num6=(int)3.5;(结果为3,小数直接舍弃,精度损失)
注意事项:
1.byte/short/char可数学运算,首先都会被转成int类型,再计算:
例1:
char num3=‘A’;System.out.println(num3)的结果为A
char num3=‘A’;System.out.println(num3+1)的结果为66
例2:
byte num4=40;
byte num5=50;
byte result=num4+num5;
会发生精度损失,因为num4+num5是都被转为int后再计算的,应用int类型接收结果result
2.byte/short/char变量赋值时,如果右侧要赋的数值没有超过byte/short/char的范围,javac编译器会自动地、隐式地为代码补上(byte)/(short)/(char):
例1:
char num1=65;
System.out.println(num1);
结果为A,相当于65前有个隐形的(char),从int隐式地变为了char
3.编译器带有常量优化功能,如代码中有short result=1+2,则编译器直接把3赋给result,而不是在之后执行过程中耗费相应的计算资源