基础学习笔记(面向对象—抽象类、多态、异常) ————各位大神别喷啊,绝对自己敲的。 1、抽象类(abstract) 特点: 1)抽象方法一定在抽象类中; 2)抽象方法和抽象类都必须被abstract关键字修饰; 3)抽象类不可以用new创建对象,调用抽象方法没有意义; 4)抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用;如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。 2、接口(interface) 格式:interface{ } 1)接口中成员修饰符是固定的: 成员常量:public static final 成员函数:public abstract 2)接口的出现将“多继承”通过另外一种形式体现了出来,即“多实现”。 3)当抽象类中的方法都是抽象的,那么该类可以通过接口的形式表示。 4)接口是不可以创建对象的,因为有抽象方法;需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才可以实例化,否则子类是一个抽象类。 5)一个类可以同时实现多个接口。 3、多态 1)多态的体现 父类的引用指向了自己子类的对象,父类的引用也可以接收自己的子类对象。 如: Animal a = new Cat(); 2)多态的前提 类与类之间必须有关系,要么继承,要么实现。通常还有一个前提:存在覆盖,父类中有方法被子类重写。 3)多态的利处与弊端 利处:提高了程序的可扩展性和后期可以维护性。 弊端:只能使用父类的引用访问父类中的成员。父类型的引用在使用时,不能直接调用子类中的特有方法。子类对象可以向父类类型提升,可以强制将父类的引用转成子类类型,即向下转型;但千万不要将父类对象转成子类类型。多态自始至终都是子类对象在做着变化。 如:Animal a = new Cat(); 类型提升了,向上转型。 Cat c = (Cat) a;强制将父类的引用转成子类类型,向下转型。如果父类创建了对象Animala = new Animal(),则就不能将父类对象转成子类类型。 4)多态的特点 A、成员函数在多态调用时,编译看左边,运行看右边。 B、多态中成员变量是无论编译和运行,都参考左边。 4、异常 异常就是程序在运行时出现不正常情况。 1)由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述并封装成对象,java对不正常情况进行描述后的对象体现。 2)有两种对问题的划分方式: 严重的和非严重的。 对于严重的问题,java通过Error类进行描述,一般不编写针对性的代码对其进行处理。 对于非严重的,java通过Exception类进行描述,可以使用针对性的处理方式进行处理。 3)异常体系的特点: 异常体系中的所有类以及建立的对象都具备可抛性,也就是说可以被throw和throws关键字所操作,只有异常体系具备这个特点。
4)异常分两种:编译时异常和运行时异常。
编译时异常如果编译时没有处理,则编译失败,若异常被标识,代表可以被处理;运行时异常,若发生了建议不处理,直接让程序停止,需要对代码修改。 5)异常的处理: try { 需要被检测的代码。 } catch(异常类 变量) { 处理方式; } finally { 一定会执行的语句; } 另外还有两个格式:try{}和catch(){},try{}和finally{}。 注意:finally中定义的通常是关闭资源代码,因为资源必须释放;或者在一个功能中定义了一些必须要执行的代码,可以功过try{}finally{}的方式实现。Finally只有一种情况不会执行,那就是执行到System.exit(0)。 6)throw和throws的用法: throw定义在函数内,用于抛出异常对象; throws定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。 当函数内容有throw抛出异常对象(RuntimeException除外),并未进行try处理,则必须要在函数上声明,否则编译失败。 7)自定义异常 将项目中出现的特有的并且java中没有进行描述封装的问题,可以进行自定义异常封装,定义类继承Exception或者RuntimeException。 如何定义异常信息呢? 因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类,通过super()语句就可以直接通过getMessage方法获取自定义异常信息。 继承Exception的原因: 因为异常体系有一个特点:异常类和异常对象都被抛出。他们具备可抛性,这个是Throwable体系中独有的特点。只有这个体系中的类和对象才可以被throw和throws操作。 8)异常在子父类覆盖中的体现 子类在覆盖父类时,如果父类的方法抛出异常,那么子类覆盖方法,只能抛出父类的异常或者该异常的子类,或者不抛; 如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集; 如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。
|