Java变量、标识符以及类型转换详解
本篇文章为本人学习笔记,如有错误,希望指正。
一、进制
进制详细概念以及转换:https://blog.csdn.net/diyu122222/article/details/80692904
这篇写的很好,不懂进制原理可以看看。
1. 不同进制的书写格式
- 十进制:Java中,数值默认都是10进制,不需要加任何修饰。
- 二进制:数值前面以0b开头,b大小写都可以。
- 八进制:数值前面以0开头。
- 十六进制:数值前面以0x开头,x大小写都可以。
2. 字节
-
字节是我们常见的计算机中最小存储单元。
-
计算机存储任何的数据,都是以字节的形式存储,右键点击文件属性,我们可以查看文件的字节大小。
-
重点关注:8个bit(二进制位) 0000-0000表示为1个字节,写成1 byte或者1 B。
-
8 bit = 1 B
-
1024 B =1 KB
-
1024 KB =1 MB
-
1024 MB =1 GB
-
1024 GB = 1 TB
-
- 重点记: 一个字节是由8个二进制位 ( 每一个位, 称之为是bit位 ) 组成的.
二、变量
1. 变量定义格式
- 数据类型 变量名 = 数据值;
- 变量名 ----- 自己要为内存空间指定的名字
- 数据值 ----- 空间中要存储的数值
- 数据类型 ----- 空间中存储的数据,加入类型【限制】
2. 数据类型
Java的数据类型分为两大类:
-
基本数据类型:包括
整数
、浮点数
、字符
、布尔
。 -
引用数据类型:包括
类
、数组
、接口
。
四类八种基本数据类型:
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128 至 127 |
短整型 | short | 2个字节 | -32768 至 32767 |
整型 | int(默认) | 4个字节 | -231 至 231-1 |
长整型 | long | 8个字节 | -263 至 263-1 19位数字 |
单精度浮点数 | float | 4个字节 | 1.4013E-45 至 3.4028E+38 |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324 至 1.7977E+308 |
字符型 | char | 2个字节 | 0 至 216-1 |
布尔类型 | boolean | 1个字节 | true,false |
Java中的默认类型:整数类型是
int
、浮点类型是double
。int : -231 至 231-1 大概 -21亿至21亿。
浮点型的取值范围比整型大得多。
关系:
double > float > long > int > short > byte
这个关系会在变量转换时生效。
3. 变量的定义
-
变量的定义格式
- 数据类型 变量名 = 数据值;
-
整数、小数、字符、布尔类型变量的定义
//整数: int a = 10; //小数: double b = 12.3; //字符: char c = 'a'; //布尔: boolean d = true;
4. 变量的注意事项
- 变量名称:变量的名字不可以重复定义。
- 变量赋值:变量在使用之前,一定要赋值。
- 定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太大可能超出int范围。
- 定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是double, double的取值范围是大于float的,类型不兼容。
梳理使用思路:
1. 如果要想定义整数类型变量, 首选int如果int装不下了, 就换成long类型, 但定义long类型变量的时候, 处于严谨考虑, 需要加入L的标识。
2. 如果要想定义小数类型的变量, 首选double
如果非要定义float类型变的时候, 需要加入F标识。
long l = 100L; //这两种类型定义比较特殊,如果变量值没有超过int范围,这里的L可加可不加
float f = 10.1F; //原理同上
三、变量标识符
-
命名规则:
硬性要求
- 标识符可以包含
英文字母26个(区分大小写)
、0-9数字
、$(美元符号)
和_(下划线)
。 - 标识符不能以数字开头。
- 标识符不能是关键字。
- 标识符可以包含
-
命名规范:
软性建议(江湖规矩)
- 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
- Demo
- DemoDataType
- 方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。
- 变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
- num
- value
- 最大值 : maxValue
- 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
命名尽量用英文单词的简写或者组合,这是为了增强代码的可读性。初学者可以在这里输入中文,参考其他Coder用的是什么标识符:
https://unbug.github.io/codelf/
四、类型转换
1. 隐式转换
-
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量
-
范例:double d = 10;
-
简单记:小的给大的,可以直接给。
-
理解:
-
int 4个字节,double 8个字节
-
4升的油,倒入8升的桶,可以直接倒入
-
-
-
float虽然占用4个字节, 但取值范围, 要比8个的字节的long更大.
- 小数底层的二进制, 整数的二进制存储方式不一样, 小数会更省空间.
1.1 隐式转换的细节
- 小的数据类型,和大的数据类型运算,小的会提升为大的之后,再进行运算
/*
a是int类型,4个字节
b是double类型,8个字节
a和b在运算的过程中,就会先将a提升为double类型
当类型统一后,再进行运算
两个double运算,结果还是double
所以,结果使用double接收
*/
public class Test {
public static void main(String[] args) {
int a = 10;
double b = 12.3;
double c = a + b;
}
}
- 特殊关注:byte short char int 四种数据在运算的时候,不管是否有更高的数据类型,都会提升为int,然后再进行运算
public class HelloWorld {
public static void main(String[] args) {
byte a = 10;
byte b = 20;
int c = a + b;
}
}
2. 类型转换 - 强制转换
- 强制转换 : 把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
- 格式:目标数据类型 变量名 **= (目标数据类型) **值或者变量 ;
- l范例:int k = (int)88.88;
2.1 强转的注意事项:
-
强制类型转换,有可能会发生精度损失
long num = 12L; int num2 = (int)num; System.out.println(num2); // 12 --> 没有精度损失
- 精度损失:简单理解,将容积为8升的容器中的水,倒入容积为4升的容器中,如果水超出了4升,就洒了。
2.2 练习1:
需求:请判断下列代码是否存在问题,如果有,请指出并修正。
public class Test {
public static void main(String[] args) {
byte a = 3; //①
byte b = 4; //②
byte c = a + b; //③
//byte d = 3 + 4; //④
}
}
-
原因分析:a 和 b 是两个byte类型,当 (byte short char int ) 在一起运算的时候,会先提升为int,然后再进行运算。
- 两个int相加后的结果,还是int类型,将int赋值给byte
- 需要强制类型转换。
-
问题解决:加入强转即可
public class Test {
public static void main(String[] args) {
byte a = 3;
byte b = 4;
byte c = (byte)(a + b);
byte d = 3 + 4;
}
}
2.3 练习2:
需求:请回答 byte d = 3 + 4; 会不会出现错误?
public class Test {
public static void main(String[] args) {
byte d = 3 + 4;
}
}
- 分析:因为3和4,是两个常量,Java中存在【常量优化机制】
- 常量优化机制:在编译时(javac),就会将3和4计算出一个7的结果,并且会自动判断该结果是否在byte取值范围内
- 在:编译通过
- 不在:编译失败
- 常量优化机制:在编译时(javac),就会将3和4计算出一个7的结果,并且会自动判断该结果是否在byte取值范围内
char型运算时代入ASCII码即可。
ASCII常见字符对应编码:
字符 | ASCII编码 |
---|---|
0 ~ 9 | 48 ~ 57 |
A ~ Z | 65 ~ 90 |
a ~ z | 97 ~ 122 |
只要记住0,A,a分别为48, 65, 97即可,笔试时可能会用上。