四、变量与运算符(上次没写全)
凡是自己可以命名的地方都可以叫做标识符 比如:类名,方法名,变量名,包名,常量名等
标识符的命名规则(必须要遵守,否则编译不通过):
由26个英文字母大小写,0-9,_或$组成
数字不可以开头
不可以使用关键字和保留字,但能包含关键字和保留字
JAVA中严格区分大小写,长度无限制
标识符不能包含空格
注:在定义标识符时要注意"见名知意"。
标识符的命名规范(建议遵守):
包名:多单词组成时所有字母都小写
类名、接口名:多单词组成时,所有单词的首字母大写
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写
常量名:所有字母都大写,多单词时每个单词用下划线连接
JAVA中的基本数据类型
整型 :byte\short\int\long 声明long类型变量需要加‘l’或‘L'后缀
浮点型:float\double 声明float类型变量需要加’f'或‘F’后缀
字符型:char 表示形式:1.使用一对‘ ’表示,内部有且仅有一个字符 2.直接使用Unicode值来表示字符型常量:'\uXXXX' 3.使用转义字符 4.使用ASCII码
布尔型:boolean 不谈占用多少空间,只有两个值 false和true,真正分配的时候占用四个字节
引用数据类型 :
类(class)
数组(array)
接口(interface)
枚举(enum)
注解(annotation)
记录(record)
基本数据类型变量间的运算规则:
- 这里提到可以做运算的基本数据类型由7种,不包括boolea类型
- 运算规则包括:①自动类型提升 当容量小的变量与容量大的变量做运算时,结果自动转化为容量大的数据类型,容量大小不是指占用内存空间的大小,而是表示数据的范围大小 byte、short、char ---> int ---> long ---> float --->double byte和byte做运算,short和short做运算必须都要用int来接收,结果为int类型 ②强制类型转换 将容量大的变量类型转化为容量小的变量类型,需要使用强制类型转换 强制类型转换需要使用强转符:()在()中指明要转换为的数据类型
- 不允许变量名时数字开头是为了“自洽”
string
①关于String的理解
- String类,属于引用数据类型 俗称字符串
- String类型的变量,可以使用一对“”的方式进行赋值
- String声明的字符串内部,可以包含0、1个或多个字符
② String与基本数据类型变量间的运算
- 这里的基本数据类型包括boolean在内的8种
- String与基本数据类型变量间只能做连接运算,使用“+”表示,必须要连接string类型
- 运算的结果是String类型
- 将String类型的变量转化为基本数据类型,使用Integer类 例如:
int num2 = 10; String str9 = num2 + ""; int num3 = Integer.parseInt(str9)
运算符
运算符类型
- 算数运算符 + - + - * / % (前)++ (后)++ (前)-- (后)-- +(连接符) 取模时的结果符号与被取模数相同,即%前面那个数,连接符连接字符串型与其他类型,其他的与C++差不多
- 赋值运算符 = += -= *= /= %= ①当“=”两侧数据类型不同时,可以使用自动类型转换或使用强制类型转换原则进行处理 ②支持连续赋值③+= -= *= /= %= 操作不会改变变量本身的数据类型
- 比较(或关系)运算符 == != > < >= <= instanceof(在面向对象的多态性时讲解)
- 逻辑运算符 a&b a&&b a|b a||b !a a^b(亦或) &和&&的区别:&左边的无论什么情况,都会执行&右边的操作,而&&如果左面false则一定不会执行右面, | 和||的区别:同理,如果左边为true则都会执行右边的操作,但如果左边为false则|会继续执行右边的操作而||则不会再执行右边的操作 推荐使用:&&和||
- 位运算符 << >> >>> & | ^ ~ 针对数值类型的常量或变量进行运算,运算的结果也是数值 <<:在一定范围内:每左移一位就在原有的基础上*2(对于正负数都适用) >>:在一定范围内:每右移一位就在原有的基础上/2(对于正负数都适用) 1|1结果为1 1|0结果为1 0|1结果为1 0|0结果为0 ~0就是1 ~1就是0 ~:对应位结果为1,则结果为0,对应位为0,则结果为1 1^1 结果为0 1^0结果为1 0^1结果为1
- 条件运算符 格式:(条件表达式)?表达式1:表达式2 ①条件表达式的结果是boolean类型,如果条件表达式的结果是true则执行表达式1,否则执行表达式2 ②表达式1和表达式2需要是相同的类型或能兼容的类型 ③凡是可以使用条件运算符的位置都可以改写为if-else,反之能使用if-else结构,不一定能改写为条件运算符 两个都能用时推荐用条件运算符,执行效率稍高
- Lambda运算符
五、流程控制
- 顺序结构
- 分支语句 ①if-else条件判断结构 格式:if(条件表达式){语句块;} 或 if(条件表达式){语句块1;}else if(条件表达式2){语句块2;} 或 if(条件表达式){语句块1;}else if(条件表达式2){语句块2;} else if(条件表达式3){语句块3;} ······ else if(条件表达式n){语句块n;} 注:如果多个表达式之间没有交集,则哪个表达式声名在上面,哪个表达式声名在下面都可以 如果多个表达式之间是包含关系,需要将条件范围小的声名在大的上面,否则条件范围小的就不可能被执行
使用Scanner获取不同类型数据的步骤
- 导包 import java util.Scanner;将其写在类的前面
- 提供(或创建)一个Scanner类的实例
- 调用Scanner类中的方法,获取指定类型的变量
- 关闭资源,调用Scanner类的close()
如何获取一个随机数?
- 可以使用Java提供的API:Math类的random()
- random()调用以后会返回一个[0.0,1.0)范围内的double类型的随机数
- 获取一个[0,100]范围的随机整数:int num1=(int)(Math. random() * 100) 获取一个[1,100]范围的随机整数:int num1=(int)(Math. random() * 101) 获取一个[a,b]范围的随机整数:int num1=(int)(Math. random() * ( b - a + 1 ) ) + a
switch-case选择结构
- 格式:
switch(表达式){ case 常量1: //执行语句1 //break; case 常量2: //执行语句2 //break; ... default: //执行语句 //break; }
- 根据表达式的值,依次匹配case语句,一旦与某一个case中的常量相等,那么就执行此case中的执行语句。执行完此执行语句之后,①遇到break,则执行break后,跳出当前的switch-case结构 ②没有遇到break,则继续执行其后的case中的执行语句,直到遇到break或执行完所有的case及default中的语句,退出当前的switch-case结构
- switch中的表达式只能是特定的数据类型。如下:byte\short\char\int\枚举\string case后都是跟的常量,使用表达式与这些常量做相等的判断,不能进行范围的判断 default位置是灵活的,但如果放在第一个且未加break,在执行后会继续执行剩下的case情况。
循环语句
- for 循环 ①格式:for(①;②;④){③;}
- while循环 ①格式: ① while( ② ){③;④;}
- do-while ①格式: ① do{③ ④}while( ② ); 注:do-while 使用会较少一些
无限循环
- 格式:while(true) for( ; ;)
嵌套循环
- 不再多说
break和continue
- break 适用范围:switch-case循环结构 结束(或跳出)当前循环结构 在此关键词的后面不能再声名执行语句
- continue 适用范围:循环结构中 结束(或跳出)当次循环 在此关键词的后面不能再声名执行语句
IDEA的安装
在此网站https://www.jetbrains.com/idea/中可以安装IDEA
六、数组
- 数组中的元素在内存中是依次紧密排列的、有序的
- 属于引用数据类型的变量
数组的声明与初始化: 数据类型 变量名 = 变量值 例:double[ ]prices; prices = new double [ ] = {xx,xx,xx}; || int arr[ ] = new int [4]; || int [ ] arr1 = {1 , 2,3,4,}; 错误形式:int [ ] arr2 = new int [3]{1,2,3}; int [3] arr3 = new int [ ];
数组的长度:数组名.length;
遍历数组时的模板:fori 再按回车
输出时的模板: .sout再按回车
数组元素的默认初始化值
- 整型数组元素的默认初始化值: 0
- 浮点型数组元素的默认初始化值: 0.0
- 字符型数组元素的默认初始化值: 0 (或理解为'\u0000')
- Boolean型数组元素的默认初始化值: false
- 引用数据类型数组元素的默认初始化值: null
一维数组的内存解析
Java中内存结构的划分: 将内存区域划分为5个部分:程序计数器,虚拟机栈,本地方法栈,堆,方法区
与数组相关的内存结构:①虚拟机栈:用于存放方法中声明的变量 特点:后进的先出去,先进的后出去②堆:用于存放数组的实体(即数组中所有实体,存放的实际值)
注:int [ ] arr1 = arr;实际上是将arr的地址赋给 arr1
二维数组
- 静态初始化:数组变量的赋值和数组元素的赋值同时进行 例:int [ ] [ ] arr2 = new int [ ] [ ] { {1,2,3} , {4,5} , {6,7,8,9} };
- 动态初始化1:数组变量的赋值和数组元素的赋值分开进行 例:①string [ ] [ ] arr3 = new string [3] [4]; ②double [ ] [ ] arr4 = new double [2] [ ]
- 数组长度:可以当成一维数组来看 后面也是加 .length 后缀
- 方式①外层元素默认值:地址值 内层元素默认值和之前一维数组相同 方式②外层元素默认值:默认存储null 内层元素:不存在,如果调用会报错,(NullPointerException)
二维数组的内存解析
- 这里类似于一维数组,在每次new时都会开辟一块新空间
数组的扩容与缩容
- 将原有数组中的元素复制到新的数组中 for(int i=0;i<arr;i++){newArr [ i ] = arr [ i ];}
- 将10,20,30三个数据添加到新数组中 newArr[arr.length] = 10; newArr[arr.length + 1] = 10 ; newArr[arr.length + 2] = 10 ; arr = newArr;
- 缩容:方式1:不新建数组 for(int i= deleteIndex;i < arr.length - 1;i++){arr [i] = arr[i+1];}arr [arr.length-1] = 0; 方式2:新建数组,新的数组的长度比原有数组的长度少1个
数组的查找
- 线性查找:遍历数组,如果有相同的值就输出
- 二分法查找:数组有序,从中间开始比较,向左或向右检索
七、类与对象
三条主线:
- Java类及类的成员:(重点)属性、方法、构造器;(熟悉)代码块、内部类
- 面向对象的特征:封装、继承、多态、(抽象)
- 其他关键字的使用:this、super、package、import、static、interface、abstract