Java基础知识篇(中)

2.0 Java 执⾏控制流程


Java 中的控制流程其实和 C ⼀样,在 Java 中,流程控制会涉及到包括 if-else、 while、 do-while、for、 return、 break 以及选择语句 switch 。下⾯以此进⾏分析

2.1 顺序结构

程序从上到下执行


2.2 选择结构


定义:选择结构:根据条件来选择性地执行某段代码

2.21if语句

语法结构:

if(boolean 表达式 或 boolena 变量) {
	条件执行体 //为true 执行
}

执行流程
在这里插入图片描述
if (boolean 表达式) 后没有 ;

2.22if else语句

语法结构
else 的隐含条件是对前面条件的取反

if(boolean 表达式或boolean 变量){
	条件执行体1  //为true 时执行
}else{
	条件执行2  //为false 时执行
}

执行流程
在这里插入图片描述
if-else 语句语句和三元运算符;从语义上两者含义相同;从本质说if-else 是语句控制,而三元运算符是一种运算符号,三元运算符运算结束后会**得到一个结果,**而if-else,不能返回结果,只能控制语句的执行流程

else语句不能直接使用

2.23if-else if-else 语句

语法结构

if(boolean 表达式A 或boolean 变量A ){
	条件执行体1   //  A  为true 时执行
}else if( boolean 表达式B 或 boolean 变量B)  {
	条件执行体2   // B 为true  时执行
}else  {
	条件执行体3false 时执行
}

执行流程
在这里插入图片描述
不能单独使用else -if
可以不需要else 但是最少要有一个 else-if

2.24switch语句

语法结构

switch (整体表达式) {
	case1:
		执行语句 1;
		break;   //注意是否要写 break  
	case2:
		执行语句 2;
		break;
	case3:
		执行语句 3;
		break;
	default:
		以上所有值都不匹配时 执行语句  ;  不需要break		 
}

执行流程
在这里插入图片描述

switch 适合对多个整数值进行匹配判断,从而实现条件分支控制,即" 整型表达式 == int类型 的值

switch语句后的表达式数据类型只能是byte short char int 不支持long 类型,本质 上 switch 只支持int 类型( byte,char ,short) 会自动提升为 int 类型

switch 执行时会把入口case 之后的case 统统忽略,会一直执行下去 ,直到遇到break 或 return (穿透)

default 一般放在switch 的最后,也就不用写 break

switch中表达式的类型,只能是如下6种类型: byte \ short \ char \ int \ 枚举对象(jdk5.0) \ String(jdk7.0)
5. 总结


if 语句针对单个条件判断
if-else 语句针对两个相斥条件判断
if-else if-else 语句 针对多个相斥条件判断(范围)
switch 语句针对 针对多个相斥条件判断( 整数值)

2.3 循环结构


循环语句就是在满⾜⼀定的条件下反复执⾏某⼀表达式的操作,直到满⾜循环语句的要求。使⽤的循环语句主要有 for、 do…while() 、 while
定义 : 根据循环条件重负执行某段代码。 定义对象,变量,获取数据库连接等操作尽量移至循环体外处理。

2.31 while 循环

while 循环语句的循环⽅式为利⽤⼀个条件来控制是否要继续反复执⾏这个语句。 while 循环语句的格式如下
语法结构

while(boolean 表达式){
	循环体;
	迭代语句 ;  // 自增或自减 对 循环次数进行控制
}

它的含义是,当 (布尔值) 为 true 的时候,执⾏下⾯的表达式,布尔值为 false 的时候,结束循环,布尔值其实也是⼀个表达式,⽐如

int a = 10;
while(a > 5){
a--;
}

执行流程
在这里插入图片描述

while 循环特定 先判断表达式 ,若为true 就 执行循环体 ,否则,跳出循环体

while循环 和do-while 循环 的循环体 至少要有一条语句用于对循环次数的控制(死循环除外)

2.32 do-while 语句

while 与 do…while 循环的唯⼀区别是 do…while 语句⾄少执⾏⼀次,即使第⼀次的表达式为 false。⽽在 while 循环中,如果第⼀次条件为 false,那么其中的语句根本不会执⾏。在实际应⽤中, while 要⽐do…while 应⽤的更⼴。它的⼀般形式如下
语法结构

do{
	循环体;
	迭代语句  //自增或自减  用于对循环次数的控制
}while(boolean 表达式)
int b = 10;
// do···while循环语句
do {
System.out.println("b == " + b);
b--;
} while(b == 1);

执行流程
在这里插入图片描述
do-while 循环特点.先执行一次循环体,再判断表达式,若为true 就执行循环体,否则,就跳出该循环体
while循环和do-while 循环 的循环体 至少有一条语句用来对循环次数的控制 (死循环除外)

2.33 for循环

for 循环是我们经常使⽤的循环⽅式,这种形式会在第⼀次迭代前进⾏初始化。它的形式如下
语法结构

for(初始化语句 ;boolean 表达式;  迭代语句){
	循环体;
}

每次迭代前会测试布尔表达式。如果获得的结果是 false,就会执⾏ for 语句后⾯的代码;每次循环结束,会按照步进的值执⾏下⼀次循环。

  1. 逗号操作符
    这⾥不可忽略的⼀个就是逗号操作符, Java ⾥唯⼀⽤到逗号操作符的就是 for 循环控制语句。在表达式的初始化部分,可以使⽤⼀系列的逗号分隔的语句;通过逗号操作符,可以在 for 语句内定义多个变量,但它们必须具有相同的类型
    for(int i = 1;j = i + 10;i < 5;i++, j = j * 2){}
    

执行流程
在这里插入图片描述

  1. for-each 语句
    在 Java JDK 1.5 中还引⼊了⼀种更加简洁的、⽅便对数组和集合进⾏遍历的⽅法,即 for-each 语句,例⼦如下
	int array[] = {7,8,9};
	for(int arr:array) {
	System.out.println(arr);
}
  1. 死循环
while(true){
}
do{
}while(true)

for( ; ; ){

}
  1. 循环选择
    事先不知道循环次数,使用while 或do-while循环,至少执行一次do-while 循环
    事先知道循环次数 ,优先使用for 循环
    死循环 建议使用 while 循环

  2. 嵌套循环
    重负的操作(内层循环), 需要做N次循环(外层循环)
    确定: 要循环的是什么,循环的次数
    嵌套for 循环性能优化:
    将循环变量放在循环外
    将循环次数少做为外层循环

  3. 循环控制
    break :结束当前 break 所在的整个循环
    continue: 跳过 ,continue 所在的本次循环 剩下语句,开始下一次循环
    return : 结束return 所在的方法

  4. 控制外层循环:
    在外层循环开始前使用标签标识一个外层循环,如outer
    在break 或continue 后紧跟标签名 ,如break outer ;或continue outer;
    三者相同点:在其后不能写语句(这个语句与其在同一个花括号中) 否则,编译保持

2.4 跳转语句


Java 语⾔中,有三种跳转语句: break、 continue 和 return

2.41 break

break 语句我们在 switch 中已经⻅到了,它是⽤于终⽌循环的操作,实际上 break 语句在for、 while、do···while循环语句中,⽤于强⾏退出当前循环,例如

	for(int i = 0;i<10;i++) {
		if(i == 5){
			break;
		}
	}

2.42 continue

continue 也可以放在循环语句中,它与 break 语句具有相反的效果,它的作⽤是⽤于执⾏下⼀次循环,⽽不是退出当前循环,还以上⾯的例⼦为主

for(int i = 0;i<10;i++) {
	System.out.println("i = " +i)
		if(i == 5){
			System.out.println("continue...")
			continue;
		}
	}

2.43 return

return 语句可以从⼀个⽅法返回,并把控制权交给调⽤它的语句。

	public void getName() {
		return;
	}

2.5方法


方法定义的格式

[修饰符] 返回值类型 方法名 [参数类型 形参1 参数类型  形参2 ....] {
 	方法体;
 	[return 返回值]   ;//这个方法需要调给调用者返回值时
}

当方法无返回值时,必须给出返回类型 void
参数列表/参数清单 包含参数的个数 参数类型 参数顺序
方法签名:方法名+ 方法参数列表 判断是否同一个方法标准
在同一个类中,方法签名是唯一的,否则编译报错
考虑当调用者传入数据的范围不合理时,该如何处理(进行参数校验)

2.51 方法定义的位置


在类中 ,其他方法之外
方法直接声明顺序无规定

2.52方法的调用


main 方法由JVM 调用
使用static 修饰的方法:属于这个类本身,方法所在类名,方法名,[实参 1 实参2,…]
无static 修饰的方法属于该类的对象,不属于这个类本身,使用方法所在类的对象来调用,对象 ,方法名( [实参 1 实参 2,…])
针对于有返回的方法;调用者可以使用对应类型的变量接收返回值,也可以不去接收

2.53 方法重载 Overload


作用


解决了同一个类中相同功能由于参数列表不同造成方法名不同的问题
规则


两同 : 同一个类中 ,方法名相同
一不同: 方法参数列表不同

注意: 方法重载与方法的返回值类型,修饰符无关

2.54 方法参数的值 传递机制


方法被调用时,方法里的参数是以值传递的方式传递的,即传递的是实参的副本
参数是基本数据类型,传递的是实参值的副本
参数是引用数据类型,传递的是实参所引用的十六进制地址值的副本

形参个数可变的方法

// 与getSum(int[] arr) 的方法签名相同
static int getSum((int .....arr) {
	//操作 arr 数值
}
//调用 getSum 
int sum =getSum(1,2,3.4);
int sum = getSum();

定义方法时,在最后一个形参的类型后增加三点(…) 表示该形参可以接受多个参数值
作用: 调用者不用创建数组,调用时对应的实参可以没有,(动态初始化一个数组长度为0的数组进行传递)
本质就是一个数组参数:底层,在调用该方法的适合,用对应的实参作为元素创建一个数组,再将该数组传递给形参
注意: 一个方法最多只有一个可变参数, 必须放在参数列表最后

2.55递归方法


  1. 递归一定要向已知方向递归
  2. 一个方法的方法体实现中再次调用了方法本身

2.6 修饰符


修饰符适用范围
在这里插入图片描述

2.61 访问权限修饰符

  1. 用于控制一个类的成员是否可以在其它类中访问,不能修饰局部变量
    在这里插入图片描述
  2. 访问权限修饰符
  3. private(当前类访问权限):在同一类内可见,只能被所属类访问
  4. (包访问权限):不使用任何修饰符时,在同一包内可见
  5. protected(子类访问权限):对同一包内的任何其它类和不同包中的子类可见,不能修饰接口中的成员变量和成员方法(注意:在不同包中的子类只能通过该子类访问父类中 protected 成员,通过其它子类或父类都无法访问)
  6. public(公共访问权限):对所有类可见

2.62 非访问修饰符

  1. static 用来创建类方法和类变量,类方法不能访问的实例变量
  2. final 用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,不可修改
  3. abstract 用来创建抽象类、抽象方法
  4. synchronized 修饰的方法、代码块在同一时间只能被一个线程访问,不能修饰构造器、成员变量等
  5. volatile 修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值;并且,当成员变量发生变化时,强迫线程将变化值回写到共享内存(保证了线程操作时变量的可见性,即一个线程修改了某个变量的值,这新值对其它线程来说是立即可见的)(只能保证内存可见性,无法保证操作的原子性)
  6. transient 序列化的对象包含被 transient 修饰的实例变量时,JVM 跳过该特定的变量
  7. native 修饰的方法通常采用 C/C++ 语言来实现

2.63 volatile 的实现原理

  1. 如果对声明了 volatile 变量进行写操作,JVM 就会向处理器发送一条 Lock 前缀的指令,将这个变量所在缓存行的数据写回到内存,这个写回内存的操作会引起在其它 CPU 里缓存了该内存地址的数据无效
  2. 缓存一致性协议(如 Intel 的 MESI 协议):每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里

2.64 final 修饰符

2.641 final 修饰的类

  1. 表示最终的类,不可被继承的类
  2. java 里 final 修饰的类有很多,比如八大基本数据类型包装类和 String 类,也是不可变类(当创建它们的实例后,其实例的实例变量不可改变)

2.642 final 修饰的方法

  1. 最终的方法,该方法子类可以调用,但不允许被子类覆盖
  2. 构造方法不能使用 final 修饰

2.643 final 修饰的变量

  1. 最终的变量,常量,该变量只能被赋值一次
  2. final 修饰的成员变量必须显式指定初始值(定义时、初始化块或构造器中指定),系统不会为 final 字段初始化;静态常量的单词全部大写,单词间使用下划线隔开 final int MAX_VALUE = …;
  3. final 是唯一可以修饰局部变量的修饰符
  4. final 修饰基本类型的变量,表示该变量不能被重新赋值
  5. final 修饰引用类型的变量,表示该变量所引用的地址不能变,而所引用对象的内容可以改变
  6. 可执行“宏替换”的 final 变量:当定义 final 变量时就为该变量指定了初始值,编译器会把程序中所有用到该变量的地方直接替换成该变量的值(在编译阶段能确定的内容只能来自于常量池中)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值