Static
- static{} 静态代码块 在创建时 只会执行一次
- {} 匿名代码块 初始化值
- import static java.lang.Math.random 静态导入方法
抽象类(是一种约束)
-
abstract修饰符可以用来修饰方法 也可以用来修饰类
-
抽象类中可以没有抽象方法 但是抽象方法的类 一定为抽象类
-
抽象类不能用new关键字创建 它是用来让子类继承的
-
抽象方法 只有方法的声明 没有方法的实现 (无方法体) 它是用来让子类实现的
-
子类继承抽象类 那就必须要实现抽象类没有实现的抽象方法 否则该子类也要声明为抽象类
接口(约束和实现分离,规范)
- 接口中所有定义方法默认都是公共抽象 public abstract
- 不能被实例化 无构造方法
- 接口中所有定义常量(很少) 默认public static final
- 接口的本质就是契约 制定好后大家都遵循
- OO的精髓 是对对象的抽象 最能体现这一点的就是接口
- 声明接口的关键字是 interface
- 接口可以多实现 实现接口关键字 implements
- 利用接口实现多继承
- 必须重写接口中方法
内部类
- 在类的内部定义一个内
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
异常
- 检查性异常 最具代表的检查性异常就是用户错误或问题引起的异常 这是程序员无法预见的 例如要打开一个不存在的文件时 一个异常就发生类 这些异常在编译时不能被简单地忽略
- 运行时异常 运行时异常是可能被程序员避免的异常 与检查性异常相反 运行时异常可以在编译时被忽略
- 错误 不是异常 而是脱离程序员控制的问题 错误在代码中通常被忽略. 例如 当栈溢出时 一个错误就发生了,它们在编译也检查不到
- 抛出异常
- 捕获异常
- 异常处理五个关键字 : try catch finally throw throws
- IDEA中快捷键 ctrl + alt + t
public class Demo02 {
public static void main(String[] args) {
int a=1;
int b =0;
// try {
// System.out.println(a/b);
// } catch (Exception e) {
// System.out.println("b不能为0");
// e.printStackTrace();
// } finally {
// System.out.println("finally");
// }
//
try {
new Demo02().test(1,0);
}
// catch (ArithmeticException e) {
// System.out.println("b can not be zero");
// e.printStackTrace();
// }
catch (Error e){
System.out.println("error");
} catch (Throwable t){
System.out.println("Throwable");
}
}
public void test(int a , int b) throws ArithmeticException{
if(b ==0){
throw new ArithmeticException();
}
}
}
- 自定义异常 extends Exception
package com.wu.oop;
public class Demo02 {
public static void main(String[] args) {
int a =90;
try {
test(a);
} catch (Myexception myexception) {
//myexception.printStackTrace();
System.out.println(myexception);
}
}
public static void test(int a) throws Myexception{
if(a >10){
throw new Myexception(a);
}else {
System.out.println("OK");
}
}
}
class Myexception extends Exception{
private int a ;
public Myexception(int a){
this.a =a;
}
@Override
public String toString() {
return "Myexception{" +
"a=" + a +
'}';
}
}