一、Java中的8种基本数据类型
(一)整型变量int
- 基本语法:int 变量名 = 初始值;(局部变量一定要初始化)
eg:int a = 10; - 字节:4个字节(即:占二进制32位,其中第一位是符号位)
- 包装类:Integer
- 取值范围:-2^31 ~ 2^31(-2147483648 ~ 2147483647)
int a = 10;//局部变量一定要初始化
System.out.println(Integer.MAX_VALUE);//打印最大值
System.out.println(Integer.MIN_VALUE);//打印最小值
int max = Integer.MAX_VALUE+1;//打印出最小值
System.out.println(max);
int min = Integer.MIN_VALUE-1;//打印出最大值
System.out.println(min);
(二)长整型变量long
- 基本语法:long 变量名 = 初始值;
eg:long a = 10L; - 字节:8个字节(占二进制位64位,其中第一位是符号位)
- 包装类:Long
- 取值范围:-2^63 ~ 2^63-1
System.out.println("最大值:" + Long.MAX_VALUE);//打印long最大值
System.out.println("最小值:" + Long.MIN_VALUE);//打印long最小值
注意事项:1.上述打印汉字,其中”+”是拼接的意思
2.任何类型数据和字符串拼接结果都是字符串
3.两个整型中间的加号表示相加
4.符号位不是数值位
5.符号位的0代表正数,1代表负数
6.剩下的31/63位代表2^31或2^63种状态(包含0)
int b = 10;
int a = 20;
System.out.println(b + a);//加号表示相加
System.out.println("hhh" + a + b);//两个加号都表示拼接
System.out.println("hhh" + (a + b));//带括号表示相加结果再拼接
(三)双精度浮点型变量double
- 基本语法:double 变量名 = 初始值;
eg:double b = 13.2;(默认该处的小数为双精度类型小数) - 字节:8个字节(如何存储需要研究浮点数在内存中的存储)
- 包装类:Double
- 取值范围:4.9E-324 ~ 1.797693134863157E308(了解)
int a = 10;
double b = 20.0;//必须有一个double类型除法才有结果
System.out.println(a/b);
double num = 1.1;
System.out.println(num*num);//执行结果:1.2100000000000002
注意事项:1.两个整型进行运算无法得到double类型
2.任何小数都有精度,能精确表示小数点后几位
3.小数没有精确值,只有一个范围
4.小数和整数在内存中存储方式不一样
5.若要弄清楚1.1*1.1结果末尾为什么有2,需要了解浮点数在内存中的存储(建议不用管)
6.写项目时,一般小数选择使用double,而不是float
7.小数没有精确值,只有一个范围
(四)单精度浮点型变量float
- 基本语法:float 变量名 = 初始值;
eg:float f = 12.3f(F);(大小写都可以) - 字节:4个字节
- 包装类:Float
- 取值范围:不必了解
float d = 12.3;//编译错误,Java不允许double类型的值直接赋给float
float f = 12.3f;//执行结果:12.3
System.out.println(f);
(五)字符类型变量char
- 基本语法:char 变量名 = 初始值;
eg:char ch = ‘a’ ;(java中用单引号+单个字母表示字符字面值) - 字节:2个字节
- 包装类:Character
- 取值范围:0 ~ 2^16-1(0 ~ 65535)(没有负数)
char ch = 'a';
System.out.println(ch);
char ch2 = '滴';//一个汉字也占两个字节,执行结果:滴
System.out.println(ch2);
char ch3 = 97;//a的编码值为97,所以执行结果:a
System.out.println(ch3);
注意事项:1.计算机中字符本质上是一个整数,c语言中ASCII表示字符,Java中Unicode表示字符,因此一个字符占两个字节,表示的字符种类更多,包括中文
2.char类型只是字符类型,不与数值类型混为一谈
3.'a'和"a"意义不同,前者是字符常量,后者是包含字符a的字符串
4.想要具体了解char类型,可以去了解Unicode编码机制
(六)字节byte
- 基本语法:byte 变量名 = 初始值;
eg:byte b = 12; - 字节:1个字节(占二进制8位)
- 包装类:Byte
- 取值范围:-2^7 ~ 2^7-1(-128 ~ 127)
System.out.println(Byte.MAX_VALUE);//打印最大值
System.out.println(Byte.MIN_VALUE);//打印最小值
System.out.println(Byte.MAX_VALUE+1);//默认以整型进行打印,结果在整型范围内,所以执行结果:128
byte b = Byte.MAX_VALUE+1;//结果出错,不兼容的类型,int转换到byte可能有损失
System.out.println(b);
注意事项:1.每一种数据类型,在给其赋值时一定不能超过其范围
2.最后一个代码之所以不行,是因为左边是byte型,右边是int型,byte型变量不能赋值给int型(涉及问题:整型提升)
(七) 短整型变量short
- 基本语法:short 变量名 = 初始值;
eg:short sh = 12; - 字节:2个字节(占二进制16位)
- 包装类:Short
- 取值范围:-2^15 ~ 2^15-1(-32768 ~ 32767)表示范围小一般不推荐使用
System.out.println(Short.MAX_VALUE);//打印最大值
System.out.println(Short.MIN_VALUE);//打印最小值
(八) 布尔类型boolean
- 基本语法:boolean 变量名 = 初始值;
- 字节:没有明确大小
- 包装类:Boolean
- 取值范围:只有true和false两个取值
- boolean类型和int类型不能相互转换,不存在1表示true,0表示false的用法
二、Java中的引用数据类型
(引用数据类型包括很多:类,String,数组,抽象类,接口,枚举......)
(一)字符串数据类型String
- 基本语法:String 变量名 = “初始值”;
eg:String str = “Hello”;
2.字符串 “ + ”表示拼接
3.任何数据类型和字符串拼接结果都是字符串
String str = "Hello";//执行结果:Hello
System.out.println(str);
//输出一个带双引号的Hello,需要用到转义字符
String str = "\"Hello\"";//执行结果:"Hello"
System.out.println(str);
转义字符:1. \n 换行
2. \t 水平制表符
3. \' 单引号
4. \" 双引号
5. \\ 反斜杠
三、变量的相关细节
(一)变量的作用域:
- 该变量能生效的范围,一般为变量定义所在的代码块{}
- 本地代码块:定义在方法内的一个代码块
(二)变量的命名规则:
- 只能包括数字(不能开头)、字母(注意大小写)、下划线、$(该符号不允许使用)
- 变量名具有描述性,见者知意,不宜使用拼音,词性推荐使用名词
- 命名推荐“小驼峰法” eg:maxNum
四、常量
(一)字面值常量:eg:10 “abc” 1.0 ‘a’
(二)final关键字修饰的常量
final int MAXNUM = 10;//执行结果:10
System.out.println(MAXNUM);
final int MAXNUM = 10;
MAXNUM = 999;//执行结果:无法为最终变量maxNum分配值
System.out.println(MAXNUM);
final int MAXNUM;
MAXNUM = 999;//执行结果:999
System.out.println(MAXNUM);
注意事项:1.常量只能被初始化一次,且使用时一定要记得初始化
2.变量名最好大写
3.常量在程序运行过程中不能发生修改
五、理解类型转换
(一)隐式类型转换:把一个小类型数据给一个大类型
int a = 10;
long b = a;//执行结果:10
System.out.println(b);
//此处发生了隐式类型转换
(二)显式类型转换:把一个大类型给小类型,需要进行强制类型转换
long a = 10L;
int b = a;//执行结果:不兼容,从long转换到int可能会有损失
System.out.println(b);
long a = 10L;
int b = (int)a;要把一个long类型数据赋值给int类型,需要进行强制类型转换
System.out.println(b);//执行结果:10
byte d = 100; //执行结果:100
System.out.println(d);
byte d = 256;//数据超过byte取值范围,执行结果:不兼容,从int转换到byte可能会有损失
System.out.println(d);
注意事项:1.int和boolean不能相互赋值,他们是两种不相关的类型
2.int字面值常量给byte赋值,数据必须在byte范围内
3.大类型数据赋值给小类型数据一定要进行强制转换
(三)int 和String之间的相互转换
- int转成String
int num = 10;
String str1 = num + "";//方法一:利用字符串和任何类型拼接都是字符串进行强制转换
System.out.println(str1);
int num = 10;
String str2 = String.valueOf(num);//方法二:调用valueOf方法进行转换
System.out.println(str2);
- String转成int
String str = "100";
int num = Integer.parseInt(str);
System.out.println(num);
String str = "100a";
int num = Integer.parseInt(str);//执行结果:出现异常
System.out.println(num);
六、理解数值提升
- 对于小于4个字节的数据进行算数运算时,都会先提升为整型,再进行运算
(提升原因:计算机的CPU通常按照4个字节为单位从内存中读取数据,为了硬件上实现方便,因此对于小于4个字节的类型都会先提升为整型,再参与计算)
byte b = 10;
byte c = 20;
byte d = b + c;//执行结果:不兼容,从int转换到byte会有损失
System.out.println(d);
byte b = 10;
byte c = 20;
byte d = (byte)b + c;//方法一:把右边强制转换成byte,执行结果:30
System.out.println(d);
byte b = 10;
byte c = 20;
int d = b + c;//方法二:把左边变成int,执行结果:30
System.out.println(d);
因此相关问题如下:
byte d = 127+1; //执行结果:出错,是因为右边发生了整型提升,将int赋值给byte不被允许
int i = 2147483647+1;//执行结果:-2147483648,左右都是整型,因此可以打印
- 不同类型的混合运算,范围小的会提升为范围大的(int和long混合运算,int会提升为long)