abstract 抽象
1.被abstract修饰的方法是抽象方法,抽象方法没有方法体
2.被abstract修饰的类是抽象类
如果一个类中包含了抽象方法,那么这个类必须被声明成一个抽象类
3.1变成抽象子类,躺平,实现一部分/不实现,继续抽象
3.2.变成普通子类,”父债子偿”,子类需要实现抽象父类中的所有的抽象方法(即 重写)
4.抽象类不可以实例化 即 不能创建对象
注意:abstract 不可以和 private static final一起使用
private: 被私有化后,子类无法重写,与abstract相违背
static: 静态优先于对象存在,存在加载顺序问题
final: 被final修饰后,无法重写,与abstract相违背
/*
1.抽象类是否有构造方法? 有
2.既然抽象类不能实例化 为什么有构造方法?
不是为了自己使用 是为了子类创建对象时使用
*/
/*
抽象类中可以定义成员变量吗? -- 可以
抽象类中可以定义成员常量吗? -- 可以
抽象类中可以定义普通方法吗? -- 可以
抽象类中可以定义抽象方法吗? -- 可以
抽象类中可以全是普通方法吗? -- 可以
如果一个类中都是普通方法,为什么还要被修饰成抽象类呢?
because,抽象类不可以被实例化,so如果不想让外界创建本类的对象,就可以把普通类声明成抽象类
抽象类中可以全是抽象方法吗? -- 可以
*/
面向对象 - 异常
异常的继承结构
异常层次结构中的根是Throwable 异常的顶级父类
Error:目前我们编码解决不了的问题
编译异常:为运行代码就报错了,强制要求处理
Exception:异常
运行时异常:运行时代码才报错,可以通过编译,不强制要求处理
报错ArithmeticException—算数异常
报错InputMismatchException—输入不匹配异常
学会看报错信息提示,找到错误方向
看报错的行号提示,确定报错位置,哪里不对点哪里
解决方案
1.捕获处理 - 自己解决
2.向上抛出 - 别人解决 ↓
异常捕获处理格式:
//try-catch 可以嵌套,如果有多种异常类型需要特殊处理的情况
try{
可能会抛出异常的代码
}catch(预先设想的异常类型 异常名){
万一捕获到了异常,进行处理的解决方案
}
例:
try{
System.out.println("请输入要计算的第1个整数");
int a = new Scanner(System.in).nextInt();
System.out.println("请输入要计算的第1个整数");
int b = new Scanner(System.in).nextInt();
System.out.println(a/b);
}catch (Exception e){
System.out.println("您输入的数据不对");
}
//使用多态的思想,无论是什么异常,都可以统一看做父类型Exception
2.向上抛出
在方法的小括号和大括号之间,写throws 异常类型
如果有多个异常,使用逗号隔开即可
//如果一个方法抛出了异常,那么谁来调用这个方法,谁就需要处理这个异常
//这里的处理有两种方法: 捕获异常 或 向上抛出
//注意:我们一般会在main()函数调用之前将异常解决掉
public static void main(String[] args) {
f();
}
private static void f(){
try {
method3();
} catch (Exception e) {
System.out.println("输入数据不对");
}
} //向上抛出
private static void method3() throws Exception{
System.out.println("请输入要计算的第1个整数");
int a = new Scanner(System.in).nextInt();
System.out.println("请输入要计算的第1个整数");
int b = new Scanner(System.in).nextInt();
System.out.println(a/b);
}