1、变量用来不断的存放同一类型的常量,并可以重复使用
- 格式:数据类型 变量名 = 变量值;
- 定义:在程序执行的过程中,在某个范围内其值可以发生改变的量
- 注意:1.局部变量在使用之前必须赋值 2.同一个区域不能使用相同的变量名 3.一条语句可以定义几个变量int a,b,c...;
2、
数据类型 | 所占字节数 | 范围 | 备注 |
byte(整数型) | 1 | -128 ~ 127 | |
short(整数型) | 2 | -2^15 ~ 2^15-1 | |
int(整数型) | 4 | -2^31 ~ 2^31-1 | |
long(整数型) | 8 | -2^63 ~ 2^63-1 | |
float(浮点型) | 4 | -3.403E38 ~ 3.403E38 | 单精度 |
double(浮点型) | 8 | -1.798E308 ~ 1.798E308 | 双精度 |
char(字符型) | 2 | 0 ~ 65535 | |
boolean(布尔型) | boolean理论上是占八分之一个字节,因为一个开关就可以决定是true和false了,但是java中boolean类型没有明确指定他的大小 |
3、Java中的默认转换规则
取值范围小的数据类型与取值范围大的数据类型进行运算,会先将小的数据类型提升为大的,再运算
4、强制转换
- 格式:b = (byte)(a + b);
- 注意事项:如果超出了被赋值的数据类型的取值范围得到的结果会与你期望的结果不同
5、进行混合运算的时候,byte、short、char不会相互转换,都会自动类型提升为int类型。其他类型进行混合运算的是小的数据类型提升为大的。
- byte、short、char -- int -- long -- float -- double
6、任何数据类型用加号与字符串相连接都会产生新的字符串,此时加号被称为字符串连接符
7、加号在java中有三种作用:代表正号,做加法运算,字符串的连接符
8、Java中的字符char可以存储一个中文汉字,Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节,中文也是占的两个字节。
9、整数
- 整数相除结果只能得到整数
- 整数想得到小数,必须把其中一个数据变化为浮点数类型,另一个数据在运算的时候会自动类型提升
10、%运算符
- %获取的是除法操作的余数,/获取的是除法操作的商
- %运算符结果的符号只和符号左边的数据有关系,与右边的数据无关
- 当左边的绝对值等于右边或是右边的倍数时,结果是0
- 当左边的绝对值大于右边绝对值时,结果是余数
- %运算符结果的符号只和左边有关系,与右边无关
- 任何一个正整数%2结果不是0就是1可以用来当作切换条件
11、++ --运算符
- 自加(++)自减(--)运算
- ++:自加,对原有的数据进行+1
- --:自减,对原有的数据进行-1
- 单独使用,放在操作数的前面和后面效果一样
- 放在变量前面的时候,会先自身加一或者自身减一,然后再将结果赋值。
- 放在变量后面的时候,会先将变量中的值取出做赋值操作,然后再自身加一或者自身减一
12、Shift + Tab键 向前缩进
13、当byte、short与int进行混合运算
- 相同:都会自动提升为int类型,两个int相加的结果还是int,再赋值给原类型会损失精度
- 不同:byte类型进行++ --会默认加强制类型转换符使结果与左边类型相同,short类型进行+=、-=、*=、/=、%=会默认加强制类型转换符使结果与左边类型相同
14、==不能写成=
- =是基本的赋值运算符,把=右边的数据赋值给左边
- 扩展的赋值运算符有+=、-=、*=、/=、%=,+= 把左边和右边做加法,然后赋值给左边,其余类似,不在赘述
15、位运算符
- 位运算符有&、|、^、~、>>、>>>、<<
- &:有0则0
- |:有1则1
- ^:相同则0,不同则1。一个数据对另一个数据位异或两次,该数本身不变(交换两个数:x=x^y; y=x^y; x=x^y)
- ~:按位取反
- <<:左移 左边最高位丢弃,右边补齐0。向左移动几位就是乘以2的几次幂
- >>:右移 最高位是0,左边补齐0; 最高为是1,左边补齐1。向右移动几位就是除以2的几次幂
- >>>:无符号右移 无论最高位是0还是1,左边补齐0
16、比较表达式无论简单还是复杂,结果必须是boolean类型
- 关系运算符(比较运算符,条件运算符)有==、!=、>、>=、<、<=
- 表达式,就是用运算符把常量或者变量连接起来的符合java语法的式子
- 表达式举例:a + b(算术表达式)a == b(条件表达式)
17、逻辑运算符一般用于连接boolean类型的表达式或者值
- 逻辑运算符有哪些&、|、^、!、&&、||
- & 逻辑与,有false则false
- | 逻辑或,有true则true
- ^ 逻辑异或,相同为false,不同为true
- ! 逻辑非,非false则true,非true则false
- &&和&最终结果一样。&&具有短路效果,左边是false,右边不执行。&是无论左边是false还是true,右边都会执行
- 同理,||和|结果也相同,||有短路效果,左边true,右边不执行。|是无论左边是true还是false,右边都会执行
- 开发中常用谁&&、||、!
18、int x = 10;是两句话,int x 声明是一句,x = 10赋值是一句。
19、一般来说:有左大括号就没有分号,有分号就没有左大括号 。
20、else后面是没有比较表达式的,只有if后面有。
21、三元运算符
- 格式: (关系表达式) ? 表达式1 : 表达式2;
- 三元运算符实现的,都可以采用if语句实现。反之不成立。当if语句控制的操作是一个输出语句的时候就不能,因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出
22、流程控制语句,可以控制程序的执行流程
- 分类:顺序结构、选择结构、循环结构
- 执行流程:从上往下,依次执行
23、选择结构
- 分类:if语句、switch语句
- if语句的格式一:
if(比较表达式) {
语句体;
}
执行流程:先计算比较表达式的值,看其返回值是true还是false,如果是true,就执行语句体;如果是false,就不执行语句体
- 比较表达式无论简单还是复杂,结果必须是boolean类型
- if语句控制的语句体如果是一条语句,大括号可以省略; 如果是多条语句,就不能省略。建议永远不要省略
- 一般来说,有左大括号就没有分号,有分号就没有左大括号
- if语句的格式二:
if(比较表达式) {
语句体1;
}else {
语句体2;
}
执行流程:首先计算比较表达式的值,看其返回值是true还是false,如果是true,就执行语句体1;如果是false,就执行语句体2
- else后面是没有比较表达式的,只有if后面有
- if语句的格式3:
if(比较表达式1) {
语句体1;
}else if(比较表达式2) {
语句体2;
}else if(比较表达式3) {
语句体3;
}
...
else {
语句体n+1;
}
执行流程:首先计算比较表达式1看其返回值是true还是false,如果是true,就执行语句体1,if语句结束。如果是false,接着计算比较表达式2看其返回值是true还是false,如果是true,就执行语句体2,if语句结束。 如果是false,接着计算比较表达式3看其返回值是true还是false,如果都是false,就执行语句体n+1。
- 最后一个else可以省略,但是建议不要省略,可以对范围外的错误值提示
- switch(表达式) 表达式的值可以是byte,short,char,int,枚举,string字符串
- switch语句的格式:
switch(表达式) {
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
…
default:
语句体n+1;
break;
}
执行流程:先计算表达式的值,然后和case后面的匹配,如果有就执行对应的语句,否则执行default控制的语句
- case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的
- default可以在任意位置。但是建议在最后,因为它总是最后被执行
- default可以省略,但是不建议,因为它的作用是对不正确的情况(例如:范围外的错误值)给出提示
- break最后一个可以省略,其他最好不要省略。否则会出现一个现象:case穿透。我们建议不要省略
- switch语句的结束条件:遇到break、执行到switch的右大括号
- switch建议判断固定值的时候用,if建议判断区间或范围的时候用
24、循环结构
- 分类:for、while、do...while
- for语句的格式:
for(初始化表达式; 条件表达式; 循环后的操作表达式) {
循环体;
}
执行流程:执行初始化语句,再执行判断条件语句,看其返回值是true还是false,如果是true,就继续执行;如果是false,就结束循环。执行循环体语句;执行循环后的操作表达式,回到判断条件语句继续
- 判断条件语句无论简单还是复杂结果是boolean类型
- 循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略
- 一般来说,有左大括号就没有分号,有分号就没有左大括号
- while语句的基本格式:
while(判断条件语句) {
循环体语句;
}
- while语句的完整格式:
初始化语句;
while(判断条件语句) {
循环体语句;
控制条件语句;
}
执行流程:执行初始化语句,再执行判断条件语句,看其返回值是true还是false,如果是true,就继续执行;如果是false,就结束循环。执行循环体语句;执行控制条件语句,回到判断条件语句继续
- do...while语句的格式:
do {
循环体语句;
}while(判断条件语句);
- do...while语句的完整格式:
初始化语句;
do {
循环体语句;
控制条件语句;
}while(判断条件语句);
执行流程:执行初始化语句,再执行循环体语句;执行控制条件语句;执行判断条件语句,看其返回值是true还是false。如果是true,就继续执行;如果是false,就结束循环。回到循环体语句继续
- 三种循环的区别:do...while循环至少执行一次循环体。而for、while循环必须先判断条件是否成立,然后决定是否执行循环体语句
- for循环和while循环的区别:如果你想在循环结束后,继续使用控制条件的变量,用while循环,否则用for循环。不知道用谁就用for循环。因为变量及早的从内存中释放掉,可以提高内存的使用效率
- 一定要注意控制条件语句控制的那个变量的问题,不要弄丢了,否则就容易死循环
- 两种最简单的死循环格式: while(true){...} for(;;){...}
25、'\x' x表示任意,\是转义符号,这种做法叫转移字符。'\t' tab键的位置 '\r' 回车 '\n' 换行 '\"' '\''
26、控制跳转语句:
- 分类:break语句、continue语句、标号、return语句
- break只能在switch和循环中使用
- continue只能在循环中使用
- 标号:标记某个循环对其控制。组成规则,其实就是合法的标识符
- return的作用:返回;其实它的作用不是结束循环的,而是结束方法的
- 区别:return是结束方法、break是跳出循环、continue是终止本次循环继续下次循环
27、方法可以提高代码的复用性
- 方法是完成特定功能的代码块
- 格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
方法体语句;
return 返回值;
}
格式说明:
- 修饰符:目前就用 public static。后面我们再详细的讲解其他的修饰符
- 返回值类型:功能结果的数据类型
- 方法名:符合命名规则即可,方便我们的调用
- 参数:实际参数,就是实际参与运算的;形式参数,就是方法定义上的,用于接收实际参数的
- 参数类型:参数的数据类型
- 参数名:变量名
- 方法体语句:完成功能的代码
- return:结束方法的
- 返回值:就是功能的结果,由return带给调用者
如何写一个方法
- 明确返回值类型
- 明确参数列表
28、方法调用
- 有具体返回值,调用方式:单独调用、输出调用、赋值调用
- 单独调用,一般来说没有意义,所以不推荐
- 输出调用,不够好。因为我们可能需要针对结果进行进一步的操作
- 赋值调用,推荐
- 注意:方法不调用不执行
- 方法与方法是平级关系,不能嵌套定义
- 方法定义的时候参数之间用逗号隔开
- 方法调用的时候不用在传递数据类型
- 如果方法有明确的返回值,一定要有return带回一个值
- 无返回值,void :只能单独调用
29、方法重载
- 在同一个类中,方法名相同,参数列表不同
- 与返回值类型无关
- 参数列表不同:参数个数不同、参数类型不同、参数的顺序不同(算重载,但是在开发中不用)
30、数组(容器) 存储同种数据类型的多个值
- 概念:数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器
- 数组既可以存储基本数据类型,也可以存储引用数据类型。
- 格式:
数据类型[] 数组名 = new 数据类型[数组的长度];
- 数组的初始化:就是为数组开辟连续的内存空间,并为每个数组元素赋予值
- 动态初始化只指定长度,由系统给出初始化值:数据类型[] 数组名 = new 数据类型[数组长度];
- 静态初始化给出初始化值,由系统决定长度:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
- 简化格式:数据类型[] 数组名 = {元素1,元素2,…}; 声明和赋值在同一行
- 数组的初始化不允许动静结合
31、Java中的内存分配以及栈和堆的区别
- 栈 存储局部变量
- 堆 存储new出来的数组或对象
32、ArrayIndexOutOfBoundsException:数组索引越界异常。原因:你访问了不存在的索引。
33、NullPointerException:空指针异常。原因:数组已经不在指向堆内存了,还用数组名去访问元素。(当数组引用赋值为null,再去调用数组中的元素)
34、数组操作
- 遍历:依次输出数组中的每一个元素
- 数组的属性:arr.length数组的长度
- 数组的最大索引:arr.length - 1
- 演示:
public static void print(int[] arr) {
for (int i = 0;i < arr.length ;i++ ) {
System.out.print(arr[i] + " ");
}
}
- 取最值,演示:
public static int getMax(int[] arr) {
int max = arr[0];
for (int i = 1;i < arr.length ;i++ ) { //从数组的第二个元素开始遍历
if (max < arr[i]) { //如果max记录的值小于的数组中的元素
max = arr[i]; //max记录住较大的
}
}
return max;
}
- 元素反转,演示:
public static void reverseArray(int[] arr) {
for (int i = 0;i < arr.length / 2 ; i++) {
//arr[0]和arr[arr.length-1-0]交换
//arr[1]和arr[arr.length-1-1]交换
//arr[2]和arr[arr.lentth-1-2]
//...
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
}
- 查表法(根据键盘录入索引,查找对应星期),演示:
public static char getWeek(int week) {
char[] arr = {' ','一','二','三','四','五','六','日'} //定义了一张星期表
return arr[week]; //通过索引获取表中的元素
}
- 数组元素查找(查找指定元素第一次在数组中出现的索引),演示:
public static int getIndex(int[] arr, int value) {
for (int i = 0;i < arr.length ;i++ ) { //数组的遍历
if (arr[i] == value) { //如果数组中的元素与查找的元素匹配
return i;
}
}
return -1;
}
35、 二维数组
- 格式1形式1:数据类型[][] 数组名 = new 数据类型[m][n];
- 格式1形式2:数据类型 数组名[][] = new 数据类型[m][n];
- 格式1形式3:数据类型[] 数组名[] = new 数据类型[m][n];
- 格式2:数据类型[][] 数组名 = new 数据类型[m][];
- 格式3:数据类型[][] 数组名 = {{1,2,3},{4,5},{6,7,8,9}};
- 遍历:外循环控制的是二维数组的长度,其实就是一维数组的个数;内循环控制的是一维数组的长度。
- 演示:
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
for (int i = 0;i < arr.length ;i++ ) { //获取到每个二维数组中的一维数组
for (int j = 0;j < arr[i].length ;j++ ) { //获取每个一维数组中的元素
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
- 求和,演示:
int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
int sum = 0; //定义变量,记录每次相加的结果
for (int i = 0;i < arr.length ;i++ ) { //获取每一个一维数组
for (int j = 0;j < arr[i].length ;j++ ) { //获取每一个一维数组中的元素
sum = sum + arr[i][j]; //累加
}
}
System.out.println(sum);
36、不同数据类型做参数传值问题
- 基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失。
- 引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问。
- Java中到底是传值还是传址?Java中只有传值,因为地址值也是值。(Java之父支持)