202105小白训练营-day04 流程控制

Posted 长安紫薯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了202105小白训练营-day04 流程控制相关的知识,希望对你有一定的参考价值。

java数据结构

旧的程序:数据结构+算法,构建小型项目核心
新的程序:数据结构+算法+框架+架构,天生构建大型项目核心
数据结构目标,开发者合理利用资源(内存)计算数据

java提供两种的数据结构:
1)基本类型:它本身不属于面向对象概念,占用内存少,运行速度快(c语言面向过程)
2)引用类型(java/python语言面向对象,面向对象和生活很相近,面向对象成为开发主流方式),相对基本类型占用空间大,运行速度慢。好处:拥有额外方法,java底层写好,开发者事半功倍,开发效率高。

八种基本类型:
1)byte 字节,1个字节=8bit,-128~127,0 Byte
2)short,2个字节,-32768~32767,0 Short
3)int,4个字节,±21亿,0。默认(平衡) Integer
4)long,8个字节,0 Long
5)float,4个字节,0.0 Float
6)double,8个字节,0.0,默认(平衡) BigDecimal Double
7)char,2个字节(2~4个字节 ascii,unicode(utf-16、utf-8)) Character
8)boolean,true 1/false 0,1个字节 0000 0001,0000 0000 Boolean

8个基本类型如果和对象一起使用,不能直接使用,类型转换。
包装类型:把基本类型进行封装(包装),变成对象,有额外方法。
基本类型名字全小写,包装类型的名字按大驼峰规则,首字母大写。

基本类型和包装类型它们只能表达一个类型的一个值:int a = 10; a = “abc”; int b= 20;
不够灵活,生活中有表达一组值:学生成绩100,99,60
数组:它可以存储一个类型的多个值,它的内存空间是连续的

数组的两种声明的方式:
1)int[] arr = new arr[4]; //声明一个整型数组,数组4个元素,第一个元素下标0 arr[0],最后一个 arr[ arr.length-1 ]
2)简洁,推荐:int[] arr = {100, 99, 60, 88 } 数组4个元素,arr[0],
String[] s = new String[3]; 数组3个元素,s[0] 值null 空
String[] s = {“语文”,“数学”,“英语”},数组3个元素,s[0] 语文

数组的缺点,只能一个类型。复杂生活物品抽象就无法使用数组来表达,在java中最强大,一等公民,对象
万物皆对象Object。

Student 学生对象
1)创建类 Student
2)创建属性(字段、成员变量)
no 学号,Integer
name 姓名,String
sex 性别,Boolean
birthday 出生年月,日期 java.util.Date 必须用它,java.sql.Date 数据库
school 毕业学校,String
salary 薪资,Float,Double

package cn.tedu.datatype;

import java.util.Date; //日期类型必须导包,必须到util工具类下的

//创建学生实体类
public class Student {
	//成员变量,属性,字段
	//4种:public公有、default不写,protected保护,private私有
	Integer no; // 学号
	String name; // 姓名
	Boolean sex; // 性别
	Date birthday; // 出生年月
	String school; // 毕业学校
	Double salary; // 薪资
}

package cn.tedu.datatype;

import org.junit.Test;
import java.util.Date;

public class TestStudent {
	@Test
	public void student() {
		// 1、创建实例
		Student student = new Student();

		// 2、对象的属性赋值
		student.no = 100;
		student.name = "陈强";
		student.sex = true;

		student.birthday = new Date(); // 创建一个当前时间,导包
		student.school = "北京大学";
		//Type mismatch: cannot convert from int to Double
		student.salary = 10000D; //1000.0、d、D 都是Double类型

		// 3、打印对象的属性值
		System.out.println( student.no );
		System.out.println( student.name );
		System.out.println( student.sex );
		
		System.out.println( student.birthday );
		System.out.println( student.school );
		System.out.println( student.salary );
	}
}

流程控制

1、顺序结构:从左向右执行,从上往下执行,每条语句都执行,执行一次
2、分支判断结构:部分代码执行,部分代码不执行
3、循环结构:反复执行一段代码(执行多次)

分支结构

1)if 单分支:if、if-else、多分支 else-if
需求:天晴晒被子
if(boolean表达式){ 晒被子 }

package test;

import org.junit.Test;

//if分支判断语句(业务逻辑判断)
public class TestIf {
	// if语法
	@Test
	public void testIf() {
		// 需求:天晴晒被子
		boolean running = true; // 是否下雨布尔变量,判断的依据(条件)
		//取反代表天晴,它是一个条件,
		//条件true执行后面代码,条件false则不执行
		//if特殊,如果if语句代码体(代码段)如果里面只有一句话,大括号可以省略
		if( !running ) {   //好习惯,不论代码段中是否是一句话,都写上括号
			System.out.println("晒被子");
		}
		System.out.println("执行完成");
	}

	// if-else语法
	@Test //单独运行这个测试方法,双击方法名,右键运行
	public void testIfElse() {
		//需求:天晴晒被子,下雨收衣服(分支互斥,不会同时发生)
		boolean running = false;
		//判断条件true成立if后面代码段执行,
		//false不成立执行else后面的代码段
		if( running ) {
			System.out.println("下雨收衣服");
		}else {
			System.out.println("天晴晒被子");
		}
	}

	// else-if语法,多分支
	@Test
	public void testElseIf() {
		//需求:电话号码,110 警察,114 查号,119 火警,120 医院,根据不同电话输出不同身份
		//分支天生是互斥,所以只要有一次判断成功其它分支就不再判断
		int phone = 911;
		if(phone==110) {
			System.out.println("警察");
		}else if(phone==114) {
			System.out.println("查号");
		}else if(phone==119) {
			System.out.println("火警");
		}else if(phone==120) {
			System.out.println("医院");
		}else {	//上面多有分支都不成立,就执行else里的代码
			System.out.println("电话号码非法");
		}
	}
}

2)switch 多分支
和else if类似,语法结构不同的。
switch、case、default

package test;

import org.junit.Test;

//switch多分支判断语句
public class TestSwitch {
	@Test
	public void testSwitch() {
		//需求:电话号码,110 警察,114 查号,119 火警,120 医院
		int phone = 110;
		//不良现象,switch语句特性
		//如果有一个分支成立,这个分支后的所有的分支就不再判断,判断失效,它的代码直接执行
		//Cannot switch on a value of type long.
		//从小往大转char ,byte,short,int,没有精度损失;从大往小转long
		//Only convertible int values, strings or enum 枚举 variables are permitted
		switch(phone) {  
		case 1:	//判断:phone的值是否和case的相等
			System.out.println("警察");
			break;	//在每个分支后加此语句,跳出switch语句
		case 114:
			System.out.println("查号");
			break;
		case 119:
			System.out.println("火警");
			break;
		case 120:
			System.out.println("医院");
			break;
		default: //else作用
			System.out.println("电话号码非法");
			break;	//可加可不加,因为它已经是最后一个
		}
	}
}

模拟ATM机

package test;

import java.util.Scanner;	//导包别导错误

import org.junit.Test;

/*
 * 需求:输入一个数字对应去执行相应内容
 * 1,查询余额
 * 2,取款
 * 3,存款
 * 4,退出
 * 特点:用户去输入,根据用户输入进行判断,执行相应动作
 */

public class ATM {
	@Test
	public void atm() {
		//用户动态输入 Scanner类,他可以支持获取键盘的输入内容
		//它获取到内容,可以字符串,也可以它转换成整数
		//监控键盘输入,参数:键盘System.in
		//程序运行到这句话就停止:等待用户输入值,回车后输入结束
		//这个现象叫做阻塞
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入数字:");
		int n = scan.nextInt();	//获取键盘输入的数字
		switch(n) {
		case 1:
			System.out.println("查询");
			break;
		case 2:
			System.out.println("取款");
			break;
		case 3:
			System.out.println("存款");
			break;
		case 4:
			System.out.println("退出");
			break;
		}
		
		System.out.println("完成");
	}
}

一个类中有多个单元测试方法

1)执行所有的单元测试方法:在空白处鼠标右键执行,它会执行所有方法
注意:测试方法没有顺序,单元测试方法互相独立,互相之间没有关系,没有顺序要求!

2)只执行某一个单元测试方法:双击方法名(光标停留在这个方法上)

循环结构

1)while循环
2)do-while循环
3)for循环

package test;

import org.junit.Test;

//循环结构
//while和do循环差异:while可能一次都不执行,do最少执行一次
public class TestLoop {
	@Test
	public void whileLoop() {
		//判断条件成立就反复执行循环体内容,当条件不成立则退出循环
		int i = 0;
		while(i<5) {  //循环体,注意:在循环体内一定要改变判断条件
			System.out.println(i); //0 1 2 3 4
			i++;	//不能少,修改判断条件
		}
	}
	
	@Test
	public void doLoop() {
		int i = 0;
		do {
			System.out.println(i); //0 1 2 3 4
			i++;	//改变判断条件
		}while(i<5);
	}
	
	@Test
	public void forLoop() {
		//经典写法,小括号中3条java语句
		//第一条语句只执行一次
		//第二条语句判断语句
		//第三条语句:打印
		//第四条语句:i++
		for(int i=0; i<5; i++) {
			System.out.println(i); //0 1 2 3 4
		}
	}
}

死循环

package test;

import java.util.Scanner;	//导包别导错误

import org.junit.Test;

/*
 * 需求:输入一个数字对应去执行相应内容
 * 1,查询余额
 * 2,取款
 * 3,存款
 * 4,退出
 * 特点:用户去输入,根据用户输入进行判断,执行相应动作
 */

public class ATM {
	@Test
	public void atm() {
		//用户动态输入 Scanner类,他可以支持获取键盘的输入内容
		//它获取到内容,可以字符串,也可以它转换成整数
		//监控键盘输入,参数:键盘System.in
		//程序运行到这句话就停止:等待用户输入值,回车后输入结束
		//这个现象叫做阻塞
		//Resource leak 资源弱引用: 'scan' is never closed
		Scanner scan = new Scanner(System.in);
		
		//while(true) {	//死循环,退出条件
		for(;true;) {
			System.out.println("请输入数字:");
			int n = scan.nextInt();	//获取键盘输入的数字
			switch(n) {
			case 1:
				System.out.println("查询");
				break;
			case 2:
				System.out.println("取款");
				break;
			case 3:
				System.out.println("存款");
				break;
			case 4:
				System.out.println("退出");
				int a = 10;		//基本类型,在方法结束,自动释放空间
				scan.close();	//对复杂对象需要手动关闭
				return;  //方法的结束,程序结束
			}
		}
		
		
		
		//Unreachable code 不能在return后面写语句,无法执行
		//System.out.println("完成");
	}
}

退出循环

1)break; 跳出
2)continue; 跳过
3)return; 退出(退出方法)

package test;

import org.junit.Test;

//3种退出循环的方式
public class TestExitLoop {
	@Test
	public void exitLoop() {
		int i = 0;
		while(i<6) {
			i++;
			if(i==3) {
				//break;		//跳出
				//continue;	//跳过本次循环,继续下一次循环,continue后的语句就不执行
				return;		//退出,结束方法
			}
			System.out.println(i);
		}
		System.out.println("执行完成");
	}
}

在这里插入图片描述

小结

1)执行流程:
a. 顺序执行:从上往下,从左到右(赋值语句,先执行右边,然后赋值给左边)所有代码都执行
b. 分支判断执行:它是程序的灵魂。程序体现用户业务逻辑。(618商品促销活动,赠券VIP用户,不同折扣)
c. 循环执行:也是业务逻辑体现,反复执行多次,直到退出条件成立
2)分支执行
a. if语句(单分支)
if
if-else
else-if(多分支)
b. swtich语句(多分支)
switch-case
switch-case-default
两个特殊点:
a. 正常每个case后都应该跟break;语句
b. switch(n),n的类型:char、byte、short、int、String、enum枚举;long不行转换由大往小转换,可能会有精度损失
3)循环
a. while
b. do-while
c. for
while和do的差异:while可能一次都不执行(先判断,条件不成立直接就不执行了),do最少执行一次(后判断,先执行了一次,才开始判断)

java的代码要经过编译,你看到的源代码和编译后的代码不一致。
for循环声明变量i,只在for循环内部有效,出了for循环这个简单类型变量就被释放,不能在使用。
4)死循环
a. while(true)
b. for( ; ; )、for(;true;)
5)退出循环
a. break 跳出
b. continue 跳过本次循环
c. return 结束方法

以上是关于202105小白训练营-day04 流程控制的主要内容,如果未能解决你的问题,请参考以下文章

202105小白训练营-day03 数据结构

java小白训练营day04-流程控制:分支+循环+异常

202105小白训练营-day01 开发环境配置

202105班小白训练营 小白学java

java小白训练营2109-day04-流程控制:分支判断+循环迭代+异常

202105小白训练营-day02 java基础