Java多态和异常「掘金日新计划 · 12 月更文挑战」

104 阅读4分钟

“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 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)
*/