- if-else:基于Boolean的双分支
- switch-case:基于数字(整数、char、枚举、byte)、字符串类型的多分支
- 方法
-
- 方法不是必须的,但是方法体现的是模块化编程思维,是高级语言拥有的特性
- 方法的签名:方法名称+参数列表(参数有严格的顺序) 注意无关返回值,java是根据签名区分到底调用那个方法
- 方法命名:简明知意:简单明了,一看就知道含义
- 一个类里面不能有两个签名相同方法
- 方法参数的传递,实际上由参数的类型决定(参数类型:基本类型、引用类型)也叫传值和传址
- 方法的重载:是从面向对象的多态的一种体现,只要求方法签名不同
- 方法的重写:是从面向对象中继承和派生的角度考虑,只要求子类重新改写父类方法的方法体,但返回值和方法签名不变
- 重构之提取方法
-
- 将某一段代码抽取出来,构成方法,Eclipse快捷键shift+alt+M
- 作用:使用模块化、单一职责,功能拆分等思想,避免代码过于冗长导致的难以阅读和维护
- 程序调试
-
- 通过调试可以观察程序的执行过程和内部数据(断点和单步执行功能是由jvm和CPU联合支持的)
- 断点:程序执行到这个位置会停下来。【单步执行F5(进入方法),F6(跳过方法)】
- 调用栈:栈是一个只有一个口的容器,即栈顶,先进后出,方法调用时会在内存开辟一块存储空间,作为当前线程的栈空间。每个线程都有自己的调用栈
-
- 调用一个方法时会向栈压入一个栈帧,用于存储这个方法的参数和局部变量,称为进栈
- 返回时,栈帧会弹出,相应的参数和局部变量也会被清除,称为出栈
- 如果调用层级过深,可能会发生栈溢出,尤其是执行递归运算的时候
- 程序的执行速度很快,所以栈帧的生存时间极短,栈波动频繁,这也就使得栈内保存的局部变量来不及被外界使用就被销毁了 ,栈的这种特性使得局部变量无法被外界调用
- 异常处理机制
-
- 异常处理(try/catch)和异常传递(throws)以及手动抛出异常(throw)
- 受查异常:受到检查的异常,必须传递出去(throws)或者处理掉(try/catch),不能忽略
- 异常捕获过程
-
- 当程序执行到try块时会在出错点之前建立一个安全点,
- 一旦try块中发生错误,jvm就会检查并收集错误信息(错误的原因类型,位置,当前栈结构),然后利用这些信息创建一个Exception对象(类型取决于错误的原因)并抛出,这时runtime system得到一个异常类,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码。找到能够处理这种类型异常的方法后,运行时系统把当前异常交给这个方法处理;如果找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。
- 可以通过这个异常对象相应的方法获取对应的异常信息(尝试阅读异常信息排查错误)
- try块中,从出错位置开始到catch上面的这段代码不会执行,但finally 块无论怎样都会执行
- 只要类型匹配就被捕获。但是子类异常优先放置在最内层,父类异常放置在外层,使得捕获的异常更准确
- 出现异常时,jvm会扫描栈,查找try建立的安全点,直到找到该点(然后交由匹配的catch块处理),若找不到而到达栈底则程序崩溃
- catch是一个异常匹配过程,只有类型匹配成功才会捕获异常,否则异常会抛给方法的调用者。
- 异常的分类
-