标识符与变量
标识符命名规则:
- 由大小写字母,数字,_ ,$,组成。
- 数字不能作为标识符的开头。
- Java中的关键字和保留字 不能使用。
- java严格区分大小写。
常量:在程序运行中,有些值是不能改变的,此时可以使用常量来表示,常量的命名规则遵循标识符规则。
- 常量名通常大写。
- 不同字符使用下划线分隔。
- 只能被赋值一次,通常定义时即对其初始化。
数据类型:
Java中的数据类型可以分为基本数据类型,引用数据类型
基本数据类型有八个:
整数4个:byte,short,int,long
小数2个:double,float
字符:char,用单引号--' '
boolean类型:boolean
引用数据类型:字符串--String(" "),数组,集合,类,对象
键盘录入
第一步:导入Scanner类
import java.util.*;
第二步:创建Scanner对象
Scanner input = new Scanner(System.in);
第三步:获得键盘输入的数据:
int now = input.nextlnt();
类型转换
一种数据类型转换为另一种数据类型称作为数据的类型转化;类型转换分为自动类型转换和强制类型转换。
自动类型转换:
只要double参与的运算,都会自动转换为double类型
两种数据类型要兼容(整数和小数)
目标类型大于源类型,如double和int
强制类型转换:
需要手动转换,可能会丢失精度(精准度)
目标类型 变量名=(目标类型)源类型
运算符:
1.赋值运算符
变量名 = 变量值;
变量值是一个表达式的结果:如两个数的和
2.算术运算符
基本的算术运算符:+,-,*,/,%,++,--
// ++ 自增1。 可以跟在变量的前面也可以跟踪后面,
// 如果仅仅是单纯的自增的话,前面和后面是一样的,除了自增以外没有其他的操作,
// 如果还有其他的操作,++在前的话则先加在做其他操作,++在后则是先做其他的操作,完成之后在自增
// i++; 12
// ++i; 12
// System.out.println(i++); 11
// System.out.println(i); 12
// System.out.println(++i); //12
// System.out.println(i); //12
复合算术运算符:+=,-=,*=,/=,%=
3.关系运算符
== 比较2个值是不是相等的, != > < >= <=
一定会有一个结果,这个结果是一个boolean类型的值
4.逻辑运算符
&,|,!
会有一个结果,结果是一个Boolean类型的值
&&,||
具有短路的功能, // 短路 : 如果第一个表达式已经确定了整个表达式的结果了,那么第二个表达式则不会进行操作
! 表达式,! true - false ! falsse -- true
5.三元运算符/三目运算符/条件运算符
结果 = 表达式? 结果1:结果2,
表达式是一个布尔类型的值,为true的时候结果1作为整个表达式的结果,为false的时候,结果2为整个表达式的结果
程序流程说明
程序流程可以分为以下三种:
顺序结构:程序从上向下逐行执行,只能向下;
分支结构:选择结构,判断语句
循环结构:重复执行一段或一条语句
if语句
if语句主要用于分支结构,表示判断的意思,主要分为3种表现方式:
1:if语句:
if一般用于单个判断,表示如果的意思;条件成立则会执行相应的代码。
if(表达式){
//当表达式为true时,才会执行这里的代码
}
//表达式的结果必须是一个布尔值,如果条件有多个可以使用逻辑运算符&&-并且, || - 或者, !-非,取反
if——else
if else 结构一般用于二选一的情况,如果if成立执行if的代码块,否则执行else中的代码块。
if(表达式){
//代码块,当表达式为true时,才会执行这里的代码
}else{
//表达式为false时,执行这里的代码
}
if - else if - else
多重if结构主要用于多重判断的情况
if(表达式1){
//表达式1为true时,执行这里的代码
}else if(表达式2){
//表达式2为true时,执行这里的代码
}else if(表达式3){
//表达式3为true时,执行这里的代码
}else{
//所有条件都不满足的时候,会执行这里的代码
}
if小结:
一次判断用if语句
两次判断(一个真一个假)用if - else语句
两次以上判断使用if - else if - else
嵌套if
嵌套if就是在if判断语句中还有if判断的语句,嵌套if控制语句可以通过外层语句和内层语句的协作,增强程序的灵活性。
if(条件1) {
if(条件2) {
代码块1
} else {
代码块2
}
} else {
代码块3
}
switch语句
switch语句是一种选择语句,可以通过匹配某个条件,来执行某块代码。
switch (表达式) {
case 常量 1:
语句;
break; // 跳出switch语句
case 常量 2:
语句;
break;
…
default:
语句;
}
表达式可以接受的类型有:int ,short,byte,char,枚举类型,String
Switch语句的特点:
- switch用于多重分支且条件判断是等值判断的情况
- switch结束有两种情况:遇到break;或执行到switch语句结束;
- case和default是没有先后顺序的,但执行时先执行case语句,如果没有符合的会执行default语句:Default语句一般是放在最后。
switch语句和if语句比较
- 相同点: 都可以用来处理多分支结构
- 区别:if多用区间判断,switch用于等值条件的判断
- 用switch能做的,用if都能做,但反过来则不行
循环
循环是学习java常用的语句之一。for循环语句是最灵活也是最常用的循环结构。
常用的循环结构有三大类: While循环, do-while循环,for循环。
while循环
while(循环条件){
//循环操作/循环体
}
- While是先判断在执行, 编写循环时,明确循环条件和循环操作。
- 只有当循环条件为true时,才会执行循环操作
- 注意在循环体中更新循环条件,否则容易造成死循环(条件永远成立)
do - while循环
do{
//循环操作(先执行一次)
}while(循环条件);
while 和 do - while的区别
- 语法不同,注意do - while 后面的分号不能丢;
- 执行次序不同
- while是先判断在执行,如果不满足条件,一次都不会执行
- do - while 是先执行一次,再做判断,如果不满足,至少执行了一次
- 当初始情况不满足循环条件时
- while循环一次都不会执行
- do - while 循环不管任何情况都至少执行一次
for循环
for(参数初始化;循环条件;更新循环变量){
//循环体
}
For 循环中必须要参数初始化,否则报错
For循环中必须要有循环条件,且必须更新循环条件,否则就是死循环
补充break,continue break 主要是在循环或 switch 语句中,用来跳出整个语句块的. break用于完全结束一个循环,跳出循环体,执行循环后面的语句 continue是跳过本次循环中剩下的语句,执行下一次循环。 简单点说就是break是结束本次循环,continue终止本次循环。
双层循环
所谓双层(双层)循环,就是在循环内部嵌套循环。
for(变量 i; 循环条件;跟新变量){ // 外层循环
//循环操作1
for(变量 j; 循环条件;跟新变量){ // 内层循环
//循环操作2
}
}
1:外层循环控制行,内层循环控制列 2:外层循环更新一次,内层循环更新一轮 闹钟- 外层循环可以理解为分针,秒针转一圈
简单点说就是break完全结束循环,continue终止本次循环。 break和continue的比较: 1:使用场合: break常用于switch结构和循环结构中 continue只能用于循环结构中 2:在循环中的作用 break用于完全结束一个循环 continue是跳过本次循环,执行下一次循环
3:常用的调试说明 可以在程序中打断点进行调试:说明如下 在程序中双击,做个断点,budeg启动程序进入调试模式
说明: 1表示当前继续执行代码(放行),直到遇到下一个断点,快捷键F8(resume), 2表示停止调试(terminate), 3表示进入当前方法内部,一步一步执行,快捷键F5(step into), 4表示运行下一行代码(下一步),执行当前行,但不进入执行细节,快捷键F6(step over), 5表示退出当前方法,返回到调用层,快捷键为F7(step return)
另外调试中鼠标移到代码编辑窗口,放在变量上时会显示当前变量的值。
注意:必须debug模式下的启动才会进入debug调试视图,否则断点无效 取消断点方式: 1:直接双击断点,可以取消 2:在debug视图可以取消所有的断点
数组是什么
数组是一个容器,可以用来存储相同数据类型的一组数据。
特点:
1:数组是有长度的;长度:这个数组可以存储几个值。长度从1开始;
2:数组是有下标的;下标:用来操作存取数组中的值,表示数组中元素的位置。下标从0开始;最大值都是长度-1
数组的定义方式
方式一:先创建数组,然后赋值
数据类型[] 数组名 = new 数据类型[数组长度];
或者 数据类型 数组名[] = new 数据类型[数组长度];
如:
int[] arr = new int[5]; 创建了一个长度为5的整数类型的数组;
String[] arr = new String[10]; 创建了一个长度为10的字符串类型的数组;
特点:1:数组的长度一旦定义了,就不能在改变了,数组的长度是固定的
2:数组在创建的时候就已经有了初始值,初始值是根据数据类型而定。Int:0,String-null
3:通过下标来操作数组(存取值),下标是从0开始的,到长度-1结束
操作数组:
向数组中存值:
arr[0] = 12; //向下标为0的空间存值
arr[1] = 5; //向下标为1的空间存值
arr[2] = 109; //向下标为2的空间存值
取值:
int one = arr[0]; //取出下标为0的值,并赋给变量one
int two = arr[1]; //取出下标为1的值,并赋给变量two
int three = arr[2]; //取出下标为2的值,并赋给变量three
方式二:创建数组的同时,就赋值
数据类型[] 数组名 = {值,值,值,----};
如:
int[] arr = {12,11,9,76,56};创建了一个整数类型的数组,数组名为 arr, 数组中的值为:12,11,9,76,56
String[] str = {"abc","aaa"}; 创建了一个字符串类型的数组。
数组的使用
1:数组的循环,数组的长度
2:高级for循环
冒泡排序
1:比较相邻的元素。如果第一个数比第二个数大,就交换他们两个位置。
2:对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。此时第一轮,最后的元素应该会是最大的数。
3:针对所有的元素重复以上的步骤,除了最后一个。
4:持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序可以使用双重循环来实现
外层循环:控制比较的轮数,比较多少轮
内层循环:控制每轮比较多少次,
数组常见异常
ArrayIndexOutOfBoundsException: 5
数组下标越界异常 : 你的下标超过了最大的下标值了