选择结构语句switch
选择结构语句之switch
格式:
switch(表达式或者某个变量值){
case 值1:
语句1;
break ;
case 值2:
语句2:
break ;
…
default:
语句n;
break ;
}
执行流程
switch接收结果:
1)接收的结果和case后面的值1进行对比,成立,执行语句1,break 结束语句;
2)值1和switch接收的结果不匹配,和值2进行比较,成立,执行语句2, break,结束语句;
3)…
如果上面case都不匹配,执行default语句,语句n,break ,结束…
面试题:
switch后面的跟的值的数据类型可以有哪些类型?
基本数据类型:byte,short,int,char
jdk5以后可以是枚举类型 enum:引用类型
jdk7以后可以是String字符串 :引用类型
switch语句中的注意事项也是 (考点)
1)关于switch中的case语句后面只能常量,不能是变量 (体现Java是一种强类型语言)
2)在书写switch语句的标准结构,不忘了break,如果语句中忘了书写break,会出现一个现象:case穿透!
3)关于switch语句的结束条件
a)要么遇见break结束
b)程序默认执行到末尾
4)关于default语句可以在switch语句中的任何位置,不影响语句的执行流程;
不管在任何位置,只要case语句都不匹配,执行default;
如果default语句在语句中,break不要省略
如果default语句的末尾,break可以省略;
循环结构语句
for :使用最多:
普通for循环
求和思想
统计思想
格式
for(初始化语句;条件表达式;控制体语句或者步长语句){
循环体语句;
}
执行流程
1) 初始化语句:给变量赋值 (只执行一次)
2)然后执行条件表达式,看其是否成立,如果成立,执行的是循环体语句------>再次回到控制体语句或者步长语句—>变量自增或者自减
3)再次执行条件表达式,是否成立,成立,继续循环体语句---->再次回到控制体语句或者步长语句---->变量自增或者自减
4)一直执行到条件表达式不成立,for循环结束;
什么是水仙花数 :
三位数,每个位上的数据的立方相加的,是这个数据本身 157
public class ForDemo4 {
public static void main(String[] args) {
// 1)定义一个统计变量count:从0开始
int count = 0 ;
// 2)水仙花:满足3位数,每一个位的数据的立方和相加是这个数据本身
// 100-999之间
for(int x = 100 ; x <=999; x++){
// 3)确定每各位的数据本身
int ge = x %10 ;
int shi = x /10 % 10;
int bai = x /10/10 %10 ;
//判断
if(x==(ge*ge*ge+shi*shi*shi+bai*bai*bai)){
//count++
count ++;
System.out.println("第"+count+"次,"+"水仙花数是:"+x);
}
}
System.out.println("共有"+count+"个");
}
}
while:其次才是这个while
while循环的格式
经常使用的格式
初始化语句;
while(条件表达式){
循环体语句 ;
控制体语句或者步长语句;
}
执行流程:
首先,先初始化语句,对变量赋值;
执行条件表达式,是否成立;成立,则执行循环体语句,依次控制体语句进行变量控制
—>再次判断条件表达式是否成立,成立,执行循环体语句—>控制体语句进行变量控制
…
…
当条件表达式不成立,while循环结束;
注意事项:控制体语句不要忘了,否则死循环;
while循环和for循环的区别?
1)共同点:能够描述一种循环思想,可以将重复性冗余代码进行优化,提供程序阅读性
2)不同点
a)格式不同
for(初始化语句;条件表达式;控制体语句){
循环体语句;
}
初始化语句;
while(条件表达式){
循环体语句;
步长语句;
}
b)场景不同
for循环:明确循环次数 (开发中优先都使用for)
while循环:不明确循环次数:
举例:
键盘录入一个数据,玩猜数字游戏,你也不知道到录入多少次才能猜中;
c)是否节省内存资源:从格式上说
for循环的好处:循环结束之后,变量被释放了
而while循环,循环结束,依然能够使用这个变量,相对for循环格式来说,比较耗费内存资源;
实际开发中:for是使用最常见的;
循环语句之do-while循环
实际开发中用的非常少的;
这个循环语句和while,for循环最大的区别:
当条件不成立的,循环体至少执行一次;
jdk一些源码就会用到do-while
格式
初始化语句;
do{
循环体语句 ;
控制体语句 ;
}while(条件表达式) ;
死循环(两种格式)
第一个格式
for(;😉{
循环体语句;
}
第二个格式:
while(true){ //死循环格式中使用比较多
循环体语句;
}
for循环嵌套
for(初始化语句1;条件中表达式1;控制体语句1){
//外层循环
// 循环体语句又是一个for循环
for(初始化语句2;条件表达式2;控制体语句2){
//内层循环 循环体语句…
}
}
流程控制语句
跳转控制语句
break:中断结束(结束循环或者switch)(不能单独使用,只能在循环中或者switch中用)
continue:只是结束当前循环,继续立即进入下次循环(循环语句中使用)
return:结束方法的 (结束有具体返回值的方法:讲方法的时候返回值的意义是什么?)
Java中的方法
方法的定义格式
在Java中,使用{}代码块,将我们的业务逻辑进行实现,给{}起一个名字,就是方法;
在Java中,定义方法的格式 有两种
-
第一种:
有具体返回值的方法定义 格式 public static 返回值类型 方法名(形式参数类型1 参数名1,形式参数类型2 参数名3....){ //业务逻辑进行实现:举例:完成两个数据比较,获取最大值 return 具体的结果; } 解释说明 public:权限修饰符:公共的公开的/访问权限足够大 static:静态修饰符(面向对象中) 返回值类型:就是数据类型,现在只学习了基本数据类型, 方法名:满足标识符的规范 :方法名和变量名, "小驼峰命名法" 一个单词:字母小写 多个单词:第一个单词字母全部小写,从第二个单词开始,每一个单词首字母大写,其余小写 形式参数类型1/形式参数类型2:就是数据类型, 现在只学习了基本数据类型, 参数名1/参数名2 :就是变量名,起一个名字 调用格式 在main方中 赋值调用 接收的结果类型 变量名 = 方法名(实际参数1,实际参数2,...) ; 实际参数:直接赋值或者main中键盘录入
-
第二种
没有具体返回值类型的方法定义和调用 当某个业务逻辑里面比如完成的数据的直接输出,展示数据----System.out.println("xxx") ; 或者:业务逻辑中可能数据某个数据在进行排序 数据交换 没有没有具体的结果是直接输出在控制台上, 此时java提供了一个关键字 void,代替返回值类型(Java定义方法语法的要求:需求没有具体返回结果,就是用void) 定义格式: public static void 方法名(形式参数类型1 参数名称1,形式参数类型2 参数名2,....){ } 调用格式: 1)单独调用 2)输出调用 3)赋值调用 ![比较三个数大小](https://img-blog.csdnimg.cn/13bb229f74ef482899c42615f3c68e96.png)
定义方法的注意事项
1)方法和方法是平级关系,不能够在一个方法中定义另一个方法,只能在一个方法中调用另一个方法
2)在定义方法的时候,方法中的形式参数必须带上数据类型,因为Java是一个强类型语言;
3)调用方法的时候,实际参数不需要带数据类型;
4)在定义方法的时候,有{的地方不能分号;,有分号;的地方不能{
5)有具体返回值类型的方法,必须携带return,否则报错;
Math的随机数使用
jdk提供了类:java.lang.Math
java.lang包下的类不需要导包
针对数学运算的工具类,提供了很多的方法;
获取伪随机数,取值范围:[0.0,1.0)
public static double random():
快速使用: Math.random()—获取一个随机数
方法重载
什么是overload?就是方法重载
方法重载:为了某个功能扩展性,多个方法方法名可以相同(完全相同),参数列表不同,与返回值无关
参数列表不同
1)参数个数不 同
2)参数类型不 同
3)考虑参数类 型的顺序
jvm的内存分配
1)栈内存 :存储的就是局部变量
2)堆内存 :以后 new出来的东西都在堆中 (new :创建对象)
3)方法区 :
xxx.class :字节码文件区域
后面static区域
常量池区域.
4)寄存器
5)本地方法区—> 都和cpu和系统相关的
数组
Java中数组就是容器,这个容器 “只能存储同一种类型的元素”
在数组中定义格式
动态初始化和静态初始化
-
动态初始化:自己定义数组的长度,数组的元素有系统(jvm)默认分配
格式: 数据类型[] 数组名称 = new 数据类型[数组长度] ; 数据类型 数组名称[] = new 数据类型[数组长度] ;
-
静态初始化:直接我们自己给定的了元素内容,数组的长度由系统默认分配
原生的格式写法: 数据类型[] 数组对象名 = new 数据类型[]{元素1,元素2,元素3.....} ; 数据类型 数组对象名[] = new 数据类型[]{元素1,元素2,元素3.....} ; 静态初始化的简写格式 数据类型[] 数组对象名 = {元素1,元素2,元素3.....} ; 推荐的写法 数据类型 数组对象名[] = {元素1,元素2,元素3.....} ;
在数组中有一个特有的属性:length
数组名称.length:获取数组长度
数组中的最大索引值: 数组名称.length-1
java.lang.ArrayIndexOutOfBoundsException:数组角标越界异常;
访问了数组中的不 存在的索引就会出现这种问题;
异常:Exception
编译时期异常:idea写代码的,编译通过不了,无法运行; 语法有问题;
运行时期异常: 开发者在编写代码的时候,大部分逻辑性不严谨,比如: 数组的5个元素,角标最大4,你访问角标5
数组的遍历
数组的其他基本应用
最值问题:最大值
1)定义一个参照物 array[0]就是最大值
2)从角标1开始遍历数组的其他元素
3)判断:使用后面的元素依次和参照物比较
如果后面元素比参照物,将最大值修改了
4)获取最大值;
数组元素查表法 :通过数组名称[索引值]确定元素
给定一个数组,快速获取数组中的某个元素:数组名称[索引值]
//字符串数组—里面存储字符串
//创建数组的格式:静态初始化
数据类型[] 数组名称 = {元素1,元素2,…} ;
数据类型:
基本数据类型
引用数据类型
String[] strArray = {"星期一","星期二","星期三"....}, ;
需求:
键盘录入一个数据:
显示"星期"
public class ArrayDemo2 {
public static void main(String[] args) {
//键盘录入一个数据
Scanner sc = new Scanner(System.in) ;
//提示并录入数据
System.out.println("请您输入一个数字(0-6):") ;
int num = sc.nextInt() ;
//已知字符串数组--->里面存储 了一些元素
String[] strArray = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"} ;
System.out.println("你查询的星期是:"+strArray[num]) ;
}
}
基本元素查询:查询数组中某个元素的角标值
public class ArrayDemo3 {
public static void main(String[] args) {
//已知这个数组:
int[] arr = {69,57,13,24,87} ;
//调用方法
int index = getIndex(arr, 13);//找13
System.out.println("index:"+index);
System.out.println("----------------------------") ;
int index2 = getIndex(arr, 133);//找13
System.out.println("index2:"+index2);
System.out.println("-----------------------------") ;
//调用
int index3 = getIndex2(arr, 255);
System.out.println("index3:"+index3);
System.out.println("------------------------------");
int index4 = getIndex2(arr, 87) ;
System.out.println("index4:"+index4);
}
//方式2:假设思想
public static int getIndex2(int[] array,int target){
//1)先定一个变量index:表示索引值
int index = -1 ; //假设角标找不到
//2)遍历数组array
for(int x = 0 ; x <array.length ; x ++){
//获取到每一个元素array[x]
//如果 target == array[x]:找到了,
if(target==array[x]){
//将index修改
index = x ;
break ;
}
}
return index ;
}
/**
* 定义一个方法
* 明确返回值类型: int
* 明确参数类型以及参数个数
* int[],查询的具体的元素 2个参数
*/
public static int getIndex(int[] array,int target){//array:传递一个数组,target:查询目标元素
//遍历数组,获取所有元素
for(int x = 0 ; x < array.length; x++){
//array[x]:每一个元素就可以获取到
//判断
//如果array[x] 和target 相等,就找到了,x返回
if(target == array[x]){//考虑找到的情况
return x ;
}
}
//查询数组:找不到元素,返回负数 -1
return -1 ;
}
}
对于基本元素查找法的----数组的元素的内容,可以无序/可以有序
int[] arr = {87,56,13,24,17};
弊端: 每次查询元素的时候,都是从头查到尾
高级数组中的元素:二分搜索法(折半查询) :高级查询算法
前提条件:数组的元素必须有序!
特点:能够节省查询时间,效率高
数组逆序
冒泡排序:
两两比较,将较大的值往后放,第一次比较完毕,最大值出现在最大索引处;
依次这样比较,可以得到排好序的数组;
规律
1)两两比较,将较大的值往后放,
2) 第一次有0个不比
第二次有1个不比
…
每次比较,就会减少一次比较
比较的次数:数组长度-1次
面向对象的思想特点以及特征
什么是面向对象?
Java语言 —对比 面向过程: 代表 c语言
面向对象的思想特点
1)更符号生活中的思想行为习惯
2)让复杂的事情简单化
3)从执行者变成了指挥者
面向对象的三大特征
封装,继承,多态 (整个java最重要的)
Java重要特点:代码的健壮性(里面涉及Java面向的对象特征以及java设计模 式)
基本类型作为形式参数和引用类型(数组,类,接口) 作为形式参数的特点
基本类型作为形式参数,形式参数改变不影响实际参数;
引用类型作为形式参数,形式参数的改变直接影响实际参数;
类
类
是能够描述现实世界事物一组属性和行为的集合;
类和事物的关系:一一对应的关系
事物:一定现实真实存在的
学生事物属性: 姓名,身高, 年龄 等等…
行为: 主要目的学习…
Java中规定,需要定义类描述这个事物 ,Java中最基本单元就是类
代码体现 描述哪一个事物
class 类名{ //类名:满足标识符的规范: 见名知意
}
封装
封装:
就是将显示世界事物的属性隐藏了(加入一个关键字private),
私有的,无法直接访问的,对外数据的安全性!(外界不能访问的)
对外提供一个方法,公共的(public)访问方法(setXXX()/getXXX())
重新创建这个类 来优化上面的代码;加入封装思想
注意事项:
以后在书写的代码的时候,写一个类,描述真是存在事物的属性的时候, 需要属性(英文单词字母全部小写)全部加入private
private关键字的特点
1)被private修饰的成员变量以及成员 方法只能在本类中访问
2)可以修饰成员变量也可以成员方法,就是为了外 界不能直接访问
3)被private修饰的成员变量/成员方法可以间接的通过 通过的方法访问;