一、进制
1. 进制介绍
- 什么是进制?
- 指进位制,是人们规定的一种进位方式,表示某一位置上的数,运算时是逢X进一位。
- 十进制是逢十进一,二进制就是逢二进一
- 十进制: 1 + 1 = 2; 1 + 9 = 10
- 二进制: 1 + 1 = 10
- 计算机中的数据不同于人们生活中的数据,人们生活采用十进制数,而计算机中全部采用二进制数表示,它只包含0、1两个数,逢二进一,每一个0或者每一个1,叫做一个bit位(比特)
- 常见进制
- 二进制、八进制、十进制、十六进制
- 十进制 : 0 1 2 3 4 5 6 7 8 9
- 二进制 : 0 1
- 八进制 : 0 1 2 3 4 5 6 7
- 十六进制 : 0 1 2 3 4 5 6 7 8 9 a b c d e f
- 二进制、八进制、十进制、十六进制
2. 不同进制的书写格式
- 十进制:Java中,数值默认都是10进制,不需要加任何修饰。 123
- 二进制:数值前面以0b开头,b大小写都可以。 0b110
- 八进制:数值前面以0开头。 0123
- 十六进制:数值前面以0x开头,x大小写都可以。 0x123
3. 字节
-
字节是我们常见的计算机中最小存储单元。
-
计算机存储任何的数据,都是以字节的形式存储,右键点击文件属性,我们可以查看文件的字节大小。
-
重点关注: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
-
1024TB = 1PB
假设我买了一个1TB的硬盘, 实际只有930G,
因为, 正常的换算单位是1024, 工厂在制作的时候是以1000计算的.
- 重点记: 一个字节是由8个二进制位 ( 每一个位, 称之为是bit位 ) 组成的.
4. 进制转换
-
十进制到二进制的转换:
-
公式:除基取余
- 使用源数据,不断的除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着拼起来即可。
-
需求:将十进制数字,(11)和(7) 转换为 2进制
-
-
二进制转十进制的转换:
-
使用8421码进行转换
- 8421码又称BCD码,是BCD代码中最常用的一种
- BCD: (Binary-Coded Decimal) 二进制码十进制数
- 在这种编码方式中,每一位二进制值的 1 都是代表一个固定数值,把每一位的 1 代表的十进制数加起来得到的结果就是它所代表的十进制数。
-
需求:将二进制 (1101)转换为十进制
- 8 + 4 + 1 = 13.
-
5. 总结:
-
知道计算机底层的运算都是以二进制形式在运算
-
不同进制的书写格式
-
知道一个字节, 是由8个二进制位组成的.
二、变量
1. 变量介绍 - 为什么要有变量?
2. 如何定义变量
2.1 变量的定义格式
- 数据类型 变量名 = 数据值;
- 变量名 ----- 自己要为内存空间指定的名字
- 数据值 ----- 空间中要存储的数值
- 数据类型???
- 为空间中存储的数据,加入类型【限制】
生活中, 有很多不同大小的物品, 可以使用不同大小的盒子, 来存放;
Java中, 有很多不同大小的数据, 可以使用不同大小的数据类型来存放;
3. 数据类型
Java的数据类型分为两大类:
- 基本数据类型:包括
整数
、浮点数
、字符
、布尔
。 - 引用数据类型:包括
类
、数组
、接口
。 【等学到数组的时候才使用】
3.1 基本数据类型
四类八种基本数据类型:
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | 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
。e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方。
4. 变量的定义
-
变量的定义格式
- 数据类型 变量名 = 数据值;
-
整数、小数、字符、布尔类型变量的定义
//整数:
int a = 10;
//小数:
double b = 12.3;
//字符:
char c = 'a';
//布尔:
boolean d = true;
5. 变量的注意事项
- 变量名称:变量的名字不可以重复定义。
- 变量赋值:变量在使用之前,一定要赋值。
- 定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太大可能超出int范围。
- 定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是double, double的取值范围是大于float的,类型不兼容。
总结:
如果要使用整数, 就用int类型, 如果整数过大, 就用long(在数字后面加上L)
如果要使用小数, 就用double
三、标识符
- 标识符:是指在程序中,我们自己定义内容。比如类的名字、方法的名字和变量的名字等等,都是标识符。
- 简单记:就是自己起名字
- 命名规则:
硬性要求
- 标识符可以包含
英文字母26个(区分大小写)
、0-9数字
、$(美元符号)
和_(下划线)
。 - 标识符不能以数字开头。
- 标识符不能是关键字。
- 标识符可以包含
- 命名规范:
软性建议(江湖规矩)
- 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
- Demo
- DemoDataType
- 方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。
- 变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
- num
- value
- 最大值 : maxValue
- 最大值: zuiDaZhi
- 见名知意 : 看见名字, 知道意思
- 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
四、类型转换
1. 为什么要学习类型转换?
public class Test {
public static void main(String[] args) {
int a = 10;
double b = 12.3;
数据类型?? c = a + b;
}
}
- 不同的数据类型可以在一起进行运算,在运算的过程中,内部会有类型的转换。
数据类型中转换, 分为两种
隐式类型转换(自动类型转换)
强制类型转换(显式类型转换)
2. 类型转换 - 隐式转换
- 把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量
- 范例:double d = 10;
- 简单记:小的给大的,可以直接给。
- 理解:
- int 4个字节,double 8个字节
- 4升的油,倒入8升的桶,可以直接倒入
- 理解:
- float虽然占用4个字节, 但取值范围, 要比8个的字节的long更大.
- 小数底层的二进制, 整数的二进制存储方式不一样, 小数会更省空间.
2.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;
}
}
3. 类型转换 - 强制转换
- 强制转换 : 把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
- 格式:目标数据类型 变量名 **= (目标数据类型) **值或者变量 ;
- l范例:int k = (int)88.88;
3.1 强转的注意事项:
- 强制类型转换,有可能会发生精度损失
long num = 12L;
int num2 = (int)num;
System.out.println(num2); // 12 --> 没有精度损失
- 精度损失:简单理解,将容积为8升的容器中的水,倒入容积为4升的容器中,如果水超出了4升,就洒了。
3.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;
}
}
3.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取值范围内
4. ASCII 码表
public static void main(String[] args) {
int a = 1;
char b = 'a';
System.out.println(a + b);//输出结果是98
}
-
ASCII (American Standard Code for Information Interchange):美国信息交换标准代码
是计算机中字节到字符的一套对应关系。
4.1 为什么要有这样的码表?
计算机中数据的存储,都是以字节的形式在进行存储,我们不会直接操作繁琐的、不便于记忆的字节。
例如:我们想要使用字符a,但 a 字符真正存储的字节表示是数值97,如果直接面向字节,那现在要表示字符 j
难道还要现去查找吗?不现实,太麻烦
'a'--- 97
'A'--- 65
'0'--- 48
4.2 数值类型和字符类型的运算过程
public static void main(String[] args) {
int a = 1;
char b = 'a';
System.out.println(a + b);//输出结果是98
}
a + b 的运算中,a为int类型,b为char类型
当(byte short char int)在一起运算的时候,都会提升为int之后,再进行运算
char提升为int的过程,就是查找码表中,字符所对应的数值表示形式
字符‘a’查找到数值的97之后,在跟数值1进行运算,结果就是98
所以,最终输出在控制台的结果就是98
五、运算符
1. 运算符介绍
-
运算符:对常量或者变量进行操作的符号
- System.out.println(3 + 4);
- int a = 10;
- int b = 20;
- System.out.println(a - b);
-
表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
比较表达式: 运算结果是boolean类型的一段代码
-
举例说明:
- +:是运算符,并且是算术运算符。
- a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。
2. 运算符的分类
- 算数运算符
- 赋值运算符
- 自增自减运算符
- 关系运算符
- 逻辑运算符
- 三元运算符
3. 算数运算符
算数运算符包括: | 作用 |
---|---|
+ | 加法运算,字符串连接运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 取模运算,两个数字相除取余数 |
-
注意:/和%的区别:两个数据做除法,/取结果的商,%取结果的余数。
整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
Java中, 对于浮点数的表示是可能出现误差的!!!(我们不能解决)
以后学习了BigDecimal可以解决误差问题.
3.1 字符串的 + 操作
- 当“+”操作中出现字符串时,这个”+”是字符串连接符,而不是算术运算。
"老铁" + 666;
- 在”+”操作中,如果出现了字符串,就是连接运算符,否则就是算术运算。当连续进行“+”操作时,从左到右逐个执行。
12 + 9 + "岁妹子";
4. 赋值运算符
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值给a |
-= | 减后赋值 | a-=b,将a-b的值给a |
*= | 乘后赋值 | a*=b,将a×b的值给a |
/= | 除后赋值 | a/=b,将a÷b的商给a |
%= | 取余后赋值 | a%=b,将a÷b的余数给a |
- 赋值运算符,就是将符号右边的值,赋给左边的变量。
public static void main(String[] args){
int a = 10;
}
- += 、-= 、*=、/=、%= 的细节
/*
下面的程序有问题吗?
*/
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
分析:
疑惑点:s += 1; 这句话等效于 s = s + 1;
s 是short类型,1是整数常量,整数默认是int类型,这里属于short和int相加,在相加的时候会提升为int类型,那么运算的结果也是int类型。
int 结果给 short 类型赋值,属于大的给小的,那就应该需要强制类型转换啊。
解惑:s += 1; 真正等效的是 s = (short) (s + 1);
底层自带强转效果.
5. 自增自减运算符
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
– | 自减 | 变量的值减1 |
- ++和-- 既可以放在变量的后边,也可以放在变量的前边
5.1 单独使用
- 单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的。
5.2 参数操作的使用
- 如果放在变量的后边,先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减(–)。
int a = 10;
int b = a++;
// a = 11
// b = 10
- 如果放在变量的前边,先对该变量做自增(++)或者自减(–),然后再拿变量参与操作。
int a = 10;
int b = ++a;
// a = 11;
// b = 11;
5.3 练习 : 看程序写结果
int x = 10;
int y = x++;
int z = ++x;
System.out.println(x);
System.out.println(y);
System.out.println(z);