java学习笔记之变量与数据类型
标识符
变量和类的名字 int a = 3;a 就是标识符
可是字母,下划线开头的由字母,下划线,数字和$组成的字符集,不能是java中的关键字,如public class等
数据类型
基本类型
- 整数
byte 一个字节(8位二进制表示) 表示的范围是-128 ~127 //中间还有0
short 两个字节(16位表示) 表示的范围是-256 ~255
int 四个字节 表示范围 -2E31 ~2E31-1 //java可用科学计数法表示,System.out.println(412e-2);结果4.12
long 八个字节 当要表示一个大于该范围的数,;在java中整数常量默认是int类型
这个数超过了int所能表示的范围,所以需要转换类型,这里不建议加小写的l,容易混淆;
在java中可以调用BigInteger类来表示超过long表示范围的数字;
java默认的数字常量都是十进制,那么要表示八进制,如下:
int a = 010;//数字前面加0,至于用哪个类型来定义,依旧取决于数字的大小,输出是8
要表示十六进制,如下:
int a = 0x10;//数字前面加0x,输出是16
要表示二进制,如下:
int a = 0b 000011000;//数字前面加0b
但是输出用不同进制表示的数都是十进制
- 浮点类型
float: 4个字节 表示范围-3.403e38 ~ 3.403e38
可以看到虽然float和int都是用4个字节来表示,但是float的表示范围远远大于int,这是因为浮点数存在舍入误差;
在java中默认的小数是double类型,如float f = 4.14 //提示错误,类似long那块提到的
float f = 4.14f //正确,相当于做了类型转换
double:8个字节 这两种小数类型都存在误差,要想精确的表示,java中可以调用BigDecimal;
- 布尔型
boolean 取值 true或者false,最多用在判断、循环条件里。它在java中仅用一位来表示;
- 字符型(在c中字符型和字符串都属于基本数据类型,但是在java中字符串String是一个独立的类)
java中采用了Unicode字符集,是通用的,基本包含了所能用到的所有字符,一个字符两个字节,所以char类型的是两个字节,能表示65536个字符;
char类型的可以当做整数直接进行运算:char c = ‘A’;
int a = c+2; //给字符类型的变量做加法,结果是一个整数类型int,输出整数
char = (char)(c+2); //通过强制转型,也可以把结果转化成字符类型
引用类型
包括类和接口,后面会讲到;
类型转换
自动转换
容量小(容量指的是表示的范围不是表示位数)的可以自动转化成容量大的,因为就不会存在放不下的问题,这个好理解;
long(8位表示) 可以自动转换成float(4位表示)// float表示的范围更大,但是可能会丢失精度
short a = 100;
int b = a;//正确
强制转换
那么容量大的向小的转换就必须强制转换,方法如上面提到的int转换成char是一样的;
但是如果一个变量已经超出了你要强制转换的类型的表示范围,也能运行,但是java会输出一个毫无意义的值:
类型提升
在做二元运算的时候(+-#/%),会有类型提升的问题:
int a = 3;
long b = 4;
int c =a+b; //提示错误,做了运算之后的结果提升为long类型的,除非强制转型
long c = a+b; //正确
但是如果是这样:可以看到两个int类型的变量做运算,结果应该是int类型的,但是又超出了int的表示范围,输出一个无意义的值
那么把结果直接定义成long呢?我们看到还是不行。这就需要我们做强制类型的转换,那么怎么转呢?
下图这样还是不行,因为你在强值转换时结果已经是一个无意义的数字,所以我们应该对一个因子做准换,通过计算时类型提升来得到结果
下图所示,相当于在计算前对a做了强制转换,一般我们把计算中的第一个因子做转换,因为担心连乘情况下到后面的位置已经超出范围