“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情”
一、什么是多态
1.1、概念
多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果
1.2、必要条件
- 需要存在继承或实现(接口)关系
- 同样的方法调用而执行不同操作、运行不同代码(重写)
- 在运行时父类或者接口的引用变量可以引用其子类的对象
1.3、作用
- 多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离
- 多态消除了类型之间的耦合关系
- 多态的存在提高了程序的拓展性和后期的可维护性
1.4、代码理解
//需要存在继承或实现(接口)关系
abstract class Animal{
public String name;
public abstract void eat();
}
class Dog extends Animal{
public void eat(){
System.out.println("狗啃骨头");
}
}
//同样的方法调用而执行不同操作、运行不同代码(重写)
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
}
public class Test {
public static void main(String[] args) {
//在运行时父类或者接口的引用变量可以引用其子类的对象
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.eat();
a2.eat();
}
}
/*
狗啃骨头
猫吃鱼
*/
二、对象的上下转型
2.1、概念
- 由子类转型成父类,在继承图上是向上移动的,一般称为向上转型,上面的代码就是向上转型
Animal a1 = new Dog();
Animal a1 = new (Animal)Dog(); //实际上就是强转,但是一般不需要写出来
- 向上转型是从一个较专用类型向通用类型转换,所以总是安全的(体现在运行过程,编译报错),也就是说,子类是父类的超集
- 向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
- 与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)
- instanceof操作符 返回值指出对象是否是特定类或者是它的子类的一个实例
三、异常
3.1、什么是异常
指在程序运行过程中发生的一些不正常事件,如:除0溢出,数组下标越界,所要读的文件不存在
3.2、异常导致的后果
java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将其被提交给java运行时系统,这个过程称为抛出异常,不处理的话会导致程序直接中断
3.3、如何防止异常
设计良好地程序应该在程序异常发生时提供处理这些异常的方法,使得程序不会因为异常的发生二阻断或产生不可预见的结果
3.4、异常分类
1.Error:一般处理不了,操作系统方面的异常
2.IOException:例如,读取的文件不存在,连接网络连不上
3.RuntimeException:除数除以0,常规的编码错误
3.5、异常处理机制
Try-catch-finally try:监控区域,执行可能产生异常的代码 catch:捕获、处理异常 finally:善后处理,无论是否发生异常,代码总能执行
四、处理机制Try-catch-finally
Try-catch-finally不一定要同时存在,就像if else一样,可以只有Try-catch,没有finally
- try{}语句块中放的是要检测的java代码,可能有会抛出异常,也可能会正常执行
- catch(异常类型){}块是当java运行时系统接收到try块中所抛出的异常对象时,会寻找能处理这异常catch块来处理(可以有多个catch块)
- finally{}不管系统有没有抛出异常都会去执行,一般用来释放资源,除了在之前执行了System.exit(0)
五、throw、throws及自定义异常
5.1、throw和throws
- throw用于手动抛出异常,作为程序员可以在任意位置手动抛出异常
- throws用于在方法上标识要暴露的异常,抛出的异常交由调用者处理
- 两者区别 1.throw用在方法内,后面跟上要抛出的异常类对象 2.throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上要抛出的异常类名
5.2、自定义异常
- 常见异常 RuntimeException,IOException,SQLException,ClassNotFoundException
- 自定义异常 java提供的异常体系不可能预见所有希望加以报告的错误
- 自定义异常类必须从已有的异常类继承
- 建立新的异常类型最简单的方法就是让编译器产生默认构造方法
- 对异常来说,最重要的部分就是它的类名
- 可以为异常类定义一个接收字符串参数的构造方法,字符串参数描述异常信息
class Bar{
int age;
public Bar(int age){
this.age = age;
}
void check()throws AgeLessThanEighteenException{
if(age < 18){
throw new AgeLessThanEighteenException("年纪太小");
}
}
}
//这种就是前面说的受查异常,必须要在代码里处理
class AgeLessThanEighteenException extends Exception{
private String message;
public AgeLessThanEighteenException(String message){
this.message = message;
}
}
public class Test {
public static void main(String[] args) {
Bar b = new Bar(15);
try{
b.check(); //自定义异常,必须要在代码里处理
}catch(AgeLessThanEighteenException e){
System.out.println(e.getMessage());
e.printStackTrace();
}
System.out.println("end");
}
}
/*
null
AgeLessThanEighteenException
end
at Bar.check(Test.java:9)
at Test.main(Test.java:27)
*/