标识符
概念:用来给变量、方法、类、包等命名的字符,简单说就是程序员自己起的名字
命名规则:
- 标识符可以由字母、数字、下划线(_)和美元符号($)组成,不能含有其他符号。字母可以是任何国家的文字
- 不能以数字开头
- 不能是Java关键字
- 区分大小写
变量
什么是变量?
①变量是内存当中的一块空间。是计算机中存储数据最基本的单元。
②变量三要素:
- 数据类型(决定空间大小)【int, double, String】
- 变量名(只要是合法的标识符即可)
- 变量值(变量中具体存储的数据)
③变量的声明、赋值、访问
- int i; // 声明一个整数型的变量,起名i
- i = 100; // 给变量i赋值100
- System.out.println(i); // 访问i变量:读操作
- i = 200; // 访问i变量:改操作【给变量i重新赋值200】
变量的作用域:大括号内,除了大括号就不认识了
进制转换
十进制如何转换为二进制?
除2取余,一直到商0为止,最后将所有的余数逆序输出。
二进制的字面量以0b开头
八进制字面量以0开头
十六进制字面量以0x开头
System.out.println(0b1001011); // 75
原码反码补码
byte与bit
①byte(字节)是计算机存储和处理数据的基本单位,通常由8个比特(bit)组成。每个比特(bit)是计算机中最小的存储单位,只能存储0或1两个状态。因此,一个字节(byte)可以存储8个比特(bit)的数据。
②两者之间的关系是,1 byte = 8 bit,即8个比特(bit)组成一个字节(byte)。
③在计算机中,数据通常以字节(byte)为单位进行存储和传输,而比特(bit)则是用来表示数据的最小单位。
④1KB = 1024byte
⑤1MB = 1024KB
⑥1GB = 1024MB
⑦1TB = 1024GB
计算机在底层都是采用二进制补码形式表示的。
负数的原码反码补码
①负数的原码运算规则:将绝对值转换为二进制后,最高位改为1。
②-5的原码:10000101
③-5的反码:11111010(原则是:以原码作为参考,符号位不变,其他位取反。)
④-5的补码:11111011(原则是:以反码作为参考,符号位不变,加1)
⑤请问-20的原码反码补码是多少?
请问-128的原码反码补码是多少?10000000;11111111;10000000
补码的补码是源码
一个字节范围-128~127
虽然计算机底层是采用补码的形式存储的,但最终显示给人类的时候是以原码的形式显示的。
计算机底层为什么采用补码
①可以简化电路设计:采用补码形式可以将加减法运算转化为相同的操作,从而简化电路设计。
②解决了0的正负问题:在原码中,0有两个表示,+0和-0,这样会导致计算结果不唯一,而在补码中,0只有一种表示,即全0,可以避免这个问题。
③解决了负数溢出问题:在原码中,负数的表示范围比正数少1,这样在进行减法运算时容易出现负数溢出的情况,而在补码中,负数的表示范围与正数相同,可以避免负数溢出的问题。
④方便计算机进行运算:补码形式可以方便计算机进行加减法运算,而且可以使用相同的电路进行运算,从而提高了计算机的运算效率。
可以计算一下 -3 + 2,看看能不能理解!!!
数据类型
自动类型转换
①在Java中,对于基本数据类型来说,小容量是可以直接赋值给大容量的,这被称为自动类型转换。
等号右边先执行
对于数字类型来说大小关系为:byte < short < int < long < float < double
long b=100,有一个类型转换过程,等号右边先执行,赋值给左边long,小类型转大类型
long z = 2147483648;
编译报错,原因是2147483648被当做int类型处理,而该数字本身已经超出了int最大值,如何修改?
long z = 2147483648L;
强制类型转换
①强制类型转换时,底层二进制是如何变化的?原则:砍掉左侧多余的二进制。
多种数据类型混合运算
①在Java中,多种数据类型混合运算时,各自先转换成容量最大的类型,再做运算
byte a = 100;
int b = 200;
long c = 300L;
long d = a + b + c;
你可以测试一下,如果d变量是int类型则编译器会报错
byte和short混合运算的时候,先各自转换成int再做运算
float:单精度,可以精确到7位小数
double:双精度,可以精确到15位小数
浮点型数据存储原理
①符号位:0表示整数。1表示负数。
②指数位:比如小数0.123E30,其中30就是指数。表示0.123 * 10的30次幂。所以也有把指数位叫做偏移量的。最大偏移量127。
③尾数位:浮点数的小数部分的有效数字。例如:0.00123,那么尾数位存储123对应的二进制。
④从浮点型数据存储原理上可以看到,二进制中的指数位决定了数字呈指数级增大。因此float虽然是4个字节,但却可以表示比long更大的数值。因此float容量比long的容量大。
一旦有浮点型参与运算得出的结果,一定不要使用“==”与其他数字进行“相等比较”
主要原因是:任何浮点型数据,在计算机底层存储的都是它的近似值
①不要这样:
double x = 6.9;
double y = 3.0;
double z = x / y;
if(z == 2.3){
System.out.println("相等");
}
③可以这样:
double x = 6.9;
double y = 3.0;
double z = x / y;
if(z - 2.3 < 0.000001){
System.out.println("相等");
}
字符型char
①占用两个字节,0~65535,和short容量相同,但char可以取更大的整数
②单个字符,使用单引号括起来,不能是多个字符
③可以保存一个汉字
④char c = ‘’; 这是不允许的
⑤char c = ‘\u0000’; 这表示一个空字符,也是char的默认值。\u0000是一个Unicode码。
⑥空字符与空格字符是不同的。空字符表示什么也没有。空格字符表示一个空格。
转义字符
①\t: 表示制表符,相当于按下 Tab 键
②\n: 表示换行符
③\": 表示双引号(")
④\': 表示单引号(')
⑤\\: 表示反斜线(\)本身
char参与的运算
①Java中允许将一个整数赋值给char类型变量,但这个整数会被当做ASCII码值来处理
②需要特别注意的是,这个码值有要求,不能超出char的取值范围
③只要没有超出byte short char的取值范围,是可以直接赋值给byte short char类型变量的
④System.out.println('a' + 1);结果是什么?
⑤char c = 'a' + 1;结果是什么?
⑥以下程序结果是什么?
byte b = 1;
short s = 1;
char c = 1;
short num = b + s + c;类型错误
byte short char混合运算时,各自会先转换成int再做运算!!!!!
运算符
算术运算符
①+ :求和、字符串拼接、正数
②- :相减、负数
③* :乘积
④/ :商(除法)
⑤% :取模(求余数)
1.取模公式:x - x / y * y
⑥++ :自加1
⑦-- :自减1
键盘接收
java.util.Scanner scanner = new java.util.Scanner(System.in);
接收的是第一个空格之前的内容
String s1 = scanner.next();
接收的是第一个换行符之前的内容
String s2 = scanner.nextLine();
二者不共存。\r换行符,让nextLine直接结束了
字节码解读
bipush 10 : 将10这个字面量压入操作数栈当中。
istore_1 :将操作数栈顶元素弹出,然后将其存储到局部变量表的1号槽位上。
iload_1:将局部变量表1号槽位上的数据复制一份,压入操作数栈
iinc 2, 1:将局部变量表的2号槽位上的数据加1.
此处可以写博客
位运算
左移 <<
①它能够将一个二进制数的所有位向左移动指定的位数。左移运算符的运算规则如下:
1. 将二进制数左移n位,相当于将数值乘以2的n次方。
例如,将二进制数0b1011左移2位,即为0b101100,相当于将11乘以2的2次方(即4),得到44。
2. 左移运算符不会改变操作数的符号。左移后,右补0。
无论操作数是正数、负数还是零,左移运算符都只进行位级移动,不会改变符号。
3. 左移运算符会对溢出进行截断。
右移 >>
它能够将一个二进制数的所有位向右移动指定的位数。右移运算符的运算规则如下:
1. 将二进制数右移n位,相当于将数值除以2的n次方。
例如,将二进制数0b101100右移2位,即为0b1011,相当于将44除以2的2次方(即4),得到11。
2. 右移运算符对正数、负数和零的处理方式不同。
对于正数,符号位不变,右移时左补0
对于负数,符号位不变,右移时左补1。
对于零,右移运算符操作后结果仍为零。
3. 右移运算符会对溢出进行截断。
无符号右移 >>>
它能够将一个二进制数的所有位向右移动指定的位数,而不考虑符号位。无符号右移运算符的运算规则如下:
1. 将二进制数右移n位,相当于将数值除以2的n次方,并将最高位填充为0。
2. 任意一个数字经过无符号右移之后,最终结果一定是非负数(0或正整数)
3. 无符号右移运算符对溢出进行截断。
控制语句
switch
switch语句使用注意事项:
switch类型:int、 枚举、 字符串
1. switch 语句适用于判断固定值。if语句适用于判断范围或区间时使用。switch能做的if肯定能做,if能完成的switch不一定能完成。
2. JDK7之前,switch只支持int类型、枚举类型,在JDK7之后,增加了对字符串类型的支持。
3. case 语句中的值必须是字面量,不能是变量。
4. case 语句中的值必须和switch后面的值是同一类型,或者能够相互转换。
5. case可以合并。
6. 在每个 case 分支中要加上 break 语句,以避免case穿透现象。
7. 在 switch 语句中,一般都应该有一个 default 分支,用于处理一些特殊情况,以避免程序出错。 (当然,default语句不写,也不会编译报错。)
8. switch 语句中的 default 分支可以放在 switch 块的任意位置,但是通常建议将 default 分支放在所有 case 分支的最后面。(可读性好)
Java12新特性
Java12中switch引入了新特性,代码变得更加简洁:
switch(x){
case 1 -> System.out.println(1);
case 2 -> System.out.println(2);
default -> System.out.println("default");
}
switch(x){
case 1, 2, 3 -> System.out.println("123");
}
switch(x){
case 1 -> {
System.out.println(1);
System.out.println(1);
}
}
循环语句
②for循环适用于循环次数固定的。while循环适用于循环次数不固定的。
结束特定循环
f1:for(int j = 0; j < 2; j++){
f2:for(int i = 1; i <= 10; i++){
if(i == 5){
break f1;
}
System.out.println("i = " + i);
}
}
f1:for(int j = 0; j < 2; j++){
f2:for(int i = 0; i < 10; i++){
if(i == 5){
continue f1;
}
System.out.println("i = " + i);
}
}
// 这个过程就存在自动类型转换。
long result2 = add(200, 300);
System.out.println(result2);
方法执行过程
public class MethodTest08{
public static void main(String[] args){
System.out.println("main begin");
m1();
System.out.println("main over");
}
public static void m1(){
System.out.println("m1 begin");
m2();
System.out.println("m1 over");
}
public static void m2(){
System.out.println("m2 begin");
m3();
System.out.println("m2 over");
}
public static void m3(){
System.out.println("m3 begin");
System.out.println("m3 over");
}
}
方法
方法重载(overload):编译阶段的一种机制(静态多态)
①什么情况下构成方法重载?
1.在同一个类中
2.方法名相同
3.参数列表不同
- 类型不同算不同
- 顺序不同算不同
- 个数不同算不同
方法递归内存图
IDEA快捷键
常用的IDEA快捷操作
1.alt+insert(新建/新增任何东西)
2.退出任何窗口ESC
3.编写源码的窗口最大化ctrl+shift+F12
4.psvm生成main方法
5.快速生成输出语句sout
6.IDEA会自动保存,自动编译
7.打开Project窗口alt+1
8.查找某个类:敲两次shift,选择classes,输入类名
9.切换选项卡:alt + 左右方向键
10.自动生成变量.var
11.删除一行ctrl+y
12.复制一行ctrl+d
13.在一个类当中查找方法ctrl+F12
14.生成for循环:fori
15.自动生成if语句.if
1.单行注释:ctrl + /
2.多行注释:ctrl + shift + /
3.查看源码:按ctrl别松手,鼠标移动到对应的类名下方,出现下划线,点击过去,可以查看类源码。
4.多行编辑:按alt别松手,鼠标拖动多行,完成多行编辑。
5.怎么快速生成创建对象语句:类名.new.var
6.怎么快速生成if语句:布尔类型值.if
7.怎么快速生成setter和getter方法:alt + insert,然后选择setter and getter生成。
8.怎么快速生成构造方法:alt + insert,然后选择Constructor。
9.在IDEA当中如何自动纠错:将光标移动到错误的位置,按atl + enter。会有提示,根据提示进行纠错。
10.移动代码到上一行:alt + shift + 上/下方向
11.怎么快速重写方法?alt + insert,选择Override....
12.怎么快速重写方法?ctrl + o
13.快速向下转型,并同时生成变量名:变量名.castvar
14.快速查看方法的参数:ctrl + p
15.返回上一步:ctrl + alt + 左方向键。下一步:ctrl + alt + 右方向键。
16.代码格式化:ctrl + alt + L。
17.查看继承结构:ctrl + H
18.自动代码包裹:ctrl + alt + t