抽象类
1.抽象类和普通类的区别
1、 抽象类需要修饰符abstract,而普通类不需要;
2、 普通类可以被实例化,而抽象类不可以被实例化;
3、 抽象方法只能定义在抽象类之中,而抽象类中既可以定义普通类也可以定义普通方法;
4、 普通类不可以存在抽象方法;
5、 一个类在继承抽象类是,如果没有实现所有抽象方法,那么该抽象类也必须声明为抽象类;
6、 抽象类不可以实例化,但可以指向一个实现它的子类对象;
7、 抽象方法没有方法体;
8、 abstract不能和final同时修饰一个类,abstract不能和static、private、final和native并列修饰同一方法。
2.抽象类的优点
抽象类中已经对实现的方法可以被子类使用,使代码可以复用;
同时提供了抽象方法,保证了子类具有自身的独立性。
3.语法
[访问符] abstract class 类名{
[访问符] abstract<返回类型>([参数列表]);
}
4.Demo
抽象类:
package com.hyg.abs;
/**
* 抽象类:模仿的多态
* @author 15332
*
*/
public abstract class Shape {
//抽象方法:面积
public abstract double callArea();//抽象类里的抽象方法必须有abstract关键字
//抽象方法:周长
public abstract double callPre();
}
实现类:
package com.hyg.abs;
/**
* 实现类
* @author 15332
*
*/
public class Circle extends Shape {
public int raduis;//半径
/*
* 有参构造方法
*/
public Circle(int raduis) {
this.raduis = raduis;
}
/*
* 无参构造方法
*/
public Circle() {
}
/*
* 实现父类的抽象方法
* @see com.hyg.abs.Shape#callArea()
*/
@Override
public double callArea() {
// TODO Auto-generated method stub
return Math.PI*raduis*raduis;
}
@Override
public double callPre() {
// TODO Auto-generated method stub
return Math.PI*2*raduis;
}
}
测试类:
package com.hyg.abs;
public class TestAbs {
public static void main(String[] args) {
Shape shape = new Circle(5);//抽象类不能直接实例化,只能指向他的实现类
System.out.println("圆的面积为:"+shape.callArea());
System.out.println("圆的周长为:"+shape.callPre());
}
}
接口
1.抽象与接口的相同点
1、 只被继承;
2、 不能通过new方法直接实例化;
3、 变量可以引用具体实现类的实例;
2.抽象与接口的区别
1、 抽象类是is – a的关系,接口是has – a ;接口一般都是添加额外的功能;
2、 抽象类与接口最大的区别在于抽象类的属性是可以继承的。而接口只是常量;
3、 一般情况下我们尽可能使用接口,因为接口从方法上去描述对象特性,可以实现多个接口。而继承只能继承一个。
4、 抽象类可以定义任意属性,可以重新定义或赋值,而接口默认是常量,用public static fina I修饰的,必须赋初值;
5、 抽象类可以有抽象方法和已实现的方法,而接口方法均只有方法声明,没有方法体; 不存在已实现的方法;
6、 抽象类中extends来表示继承抽象类,只能继承一个父类;继承抽象类的同时,必须实现抽象类中的所有抽象方法,而接口用implements来表示实现接口,可以实现多个接口,实现接口的同时,实现接口中的所有方法;
7、 抽象类可以有静态代码块和静态方法,接口不能有静态代码块和静态方法
3.定义接口
语法:
<访问符>interface 接口名{
[访问符]<返回类型>方法名([参数列表]);
}
4.实现接口
一个类实现一个接口实,必须实现接口中定义的所有没有方法体的方法,除非将该类定义为抽象类。
语法:
<访问符>class 类名 implements 接口名[,接口列表]{
……
}
instanceof运算符
格式:<引用类型变量>instanceof<引用类型>
当instanceof左侧的引用类型变量所引用对象的实际类型是其右侧给出的类型或其子类类型时,表达式结果为true ,否则为false
异常
1.非检查型类型
指编译器不要求强制处理的异常。因设计或实现方式不当导致的,可以避免。
常见非检查型异常
2.检查型类型
是指编译器要求必须处理的异常,是程序运行时由外界因素造成的一般性异常。
常见检查型异常
检查型类型 | 描述 |
---|---|
SQLException | 操作数据库时发生的异常 |
IOException | 操作文件时发生的异常 |
FileNotFoundException | 访问不存在的文件的异常 |
ClassNotFoundException | 找不到指定名称类的异常 |
3.两种处理异常的机制
捕获异常
在程序运行过程中系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码,找到处理这种类型异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,该过程称为捕获(catch)异常。
声明抛出异常
当运行时系统得到一个异常对象,如果当前方法并不知道如何处理所出现的异常或者此时处理不合适,则可在定义方法时,声明抛出(throws)异常。
4.异常处理涉及的关键字
try、catch、finally、throw和throws
5.try – catch
解释
try代码块的功能就是监视异常的发生。
catch块进行捕获并处理。
语法
try {
// 代码段(可能发生异常的代码)
} catch (Throwable ex) {
// 对异常进行处理的代码段
}
示意图
6.多重catch处理异常
解释
在一个程序中可能会引发多种不同类型的异常,此时可以提供多个catch语句用来捕获用户感兴趣的异常。当引发异常时,程序会按顺序来查看每个catch语句块,并执行第一个与异常类型匹配的catch语句块,其后的catch语句块将被忽略。
语法
try {
// 代码段
// 产生异常(异常类型2)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
} catch (异常类型3 ex) {
// 对异常进行处理的代码段
}
示意图
7.finally
解释
在某些特定的情况下,不管是否有异常发生,总是要求某些特定的代码必须被执行,比如进行数据库连接时,不管对数据库的操作是否成功,最后都需要关闭数据库的连接并释放内存资源。这就需要用到finally关键字,finally不能单独使用必须和try结合使用。
两种用法:
try-finally
try-catch-finally (较为常用)
语法
try {
// 代码段(可能发生异常代码)
} catch (Throwable ex) {
// 对异常进行处理的代码段
} finally {
// 总要被执行的代码
}
示意图
8.throw/throws
在Java程序中如果要明确地引发异常,则需要用到throw或throws语句
throw语句
throw语句用来明确地抛出一个“异常”。
throws语句
如果一个方法methodName()可以引发异常,而它本身并不对该异常进行处理,那么该方法必须声明将这个异常抛出,以使程序能够继续执行下去。这时候就要用到throws语句。
语法
returnType methodName() throws ExceptionType1,ExceptionType2 {
// body
}