接口和抽象类
接口抽象类 异常
认识 Exception什么是 Throwable常见的 Exception与Exception有关的Java关键字
throws 和throwtry、finally、catch 什么是Error
接口和抽象类 接口
接口相当于是对外地一种约定和标准,以操作系统举例,操作系统就是为了屏蔽软件地复杂性和硬件地简单性之间的差异,为软件提供统一的标准。
在Java 语言中接口是由 interface 关键字来表示的,如下定义
public interface CxuanGoodJob {}
比如我们定义了一个CxuanGoodJob 的接口,在其内部定义cxuan做得好的事情。
public interface CxuanGoodJob {
void writeWell();
}
这里隐含了一些接口的特征:
interface 接口是一个完全抽象的类,他不会提供任何方法的实现,只会进行方法定义接口中只能使用两种访问修饰符,一种是 public ,他对整个项目可见;一种是default 缺省值,它只具有包访问权限。接口只提供方法的定义,接口没有实现,但接口可以被其它类实现,即实现接口的类需要提供方法的实现,实现接口使用 implements 关键字来表示,一个接口可以有多个实现。
class CXuanWriteWell implements CxuanGoodJob{
@Override
public void writeWell() {
System.out.println("Cxuan write Java is vary well");
}
}
-接口不能被实例化,所以接口中不能有任何构造方法。
接口的实现必须实现接口的全部方法,否则就必须定义为抽象类。
抽象类是一种抽象能力弱于接口的类,在Java中,抽象类使用 abstract 关键字来表示。如果把接口形容为狗这个物种,那么抽象类就可以说是毛发是白色,小体的品种,而实现类可以是具体的类,比如说是柴犬、边牧等。
抽象类定义如下:
public interface Dog {
void FurColor();
}
abstract class WhiteDog implements Dog{
public void FurColor(){
System.out.println("Fur is white");
}
abstract void SmallBody();
}
抽象类具有如下特征:
如果一个类中有抽象方法,那么这个类一定是抽象类。抽象类中不一定只有抽象方法,抽象类中也可以有具体的方法。抽象类中的约束不像接口那么严格,可以在抽象类中构造方法、抽象方法、普通属性、方法、静态属性和静态方法。抽象类和接口一样不能被实例化,实例化只能实例化具体的类。 异常
异常是程序经常会出现的,发现错误的最佳时机是在编译阶段。也就是在运行程序之前。但是编译期间并不能找到所有的错误,比如 NullPointerException 和ClassNotFoundException 异常在编译期找不到,是在RuntimeException 运行时异常。
Java程序经常会出现两种问题,一种是java.lang.Exception,一种是 java.lang.error, 都用来表示出现了异常情况。
认识 ExceptionException 位于java.lang 包下,是一种顶级接口,继承于Throwable 类,Exception 类及其子类都是Throwable 的组成条件,是程序出现的合理情况。
什么是 ThrowableThrowable类是Java语言中所有错误(errors)和异常(exceptions)的父类。只有继承于Throwable 的类或者子类才能够被抛出,还有一种方式是带有Java 中的@throw 注解的类也可以抛出。
Throwable 及其子类归类:
可以看出Throwable位于异常和错误的最顶层,常用的Throwable 类的方法和属性:
// 返回抛出异常的详细信息 public string getMessage(); public string getLocalizedMessage(); //返回异常发生时的简要描述 public public String toString()Ҕ // 打印异常信息到标准输出流上 public void printStackTrace(); public void printStackTrace(PrintStream s); public void printStackTrace(PrintWriter s) // 记录栈帧的当前状态 public synchronized Throwable fillInStackTrace();
此外Throwable 的父类也是Object,所以常用的方法还有继承其父类getClass() 和 getName()方法。
常见的 ExceptionException的父类是Throwable,并且Exception有两种异常,一种是RuntimeException;一种是CheckedException,这两种异常都应该去捕获。
RuntimeException
| 序号 | 异常名称 | 异常描述 |
|---|---|---|
| 1 | ArrayIndexOutOfBoundsException | 数组越界异常 |
| 2 | NullPointerException | 空指针异常 |
| 3 | IllegalArgumentException | 非法参数异常 |
| 4 | NegativeArraySizeException | 数组长度为负异常 |
| 5 | IllegalStateException | 非法状态异常 |
| 6 | ClassCastException | 类型转换异常 |
UncheckedException
| 序号 | 异常名称 | 异常描述 |
|---|---|---|
| 1 | NoSuchFieldException | 表示该类没有指定名称抛出来的异常 |
| 2 | NoSuchMethodException | 表示该类没有指定方法抛出来的异常 |
| 3 | IllegalAccessException | 不允许访问某个类的异常 |
| 4 | ClassNotFoundException | 类没有找到抛出异常 |
主要有throws、throw、try、finally、catch
throws 和throw在Java中异常是一个对象,能够被自定义抛出或者应用程序抛出,必须借助于throws和throw语句来定义抛出异常。
throws和throw通常是成对出现的。
static void cacheException() throws Exception{
throw new Exception();
}
throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者处理。throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。throw是具体向外抛异常的动作,是抛出一个异常实例。 try、finally、catch
这三个关键字主要有以下几种组合方式:try…catch、try…finally、try…catch…finally。
try…catch表示对某一段代码可能抛出异常进行的捕获,如:
static void cacheException() throws Exception{
try {
System.out.println("1");
}catch (Exception e){
e.printStackTrace();
}
}
try…finally表示对一段代码不管执行情况如何,都会走finally中的代码,如:
static void cacheException() throws Exception{
for (int i = 0; i < 5; i++) {
System.out.println("enter: i=" + i);
try {
System.out.println("execute: i=" + i);
continue;
} finally {
System.out.println("leave: i=" + i);
}
}
}
try…catch…finally也是一样的,表示对异常捕获后,再走finally中的代码逻辑。 什么是Error
Error是程序无法处理的错误,表示运行应用程序中较严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM出现的问题。这些错误是不可检查的,因为它们在应用程序的控制和处理能力之外。
首先介绍一下Java内存模型,以JDK1.7为例:
这包括两部分,由所有线程共享的数据区和线程隔离的数据区组成。在上面的Java内存模型中,只有程序计数器是不会发生OutofMemoryError情况的区域。程序计数器控制着计算机指令的分支、循环、跳转、异常处理和线程恢复,并且程序计数器是每个线程私有的。
如果应用程序执行的是Java方法,那么这个计数器记录的就是虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined)。
除了程序计数器外,其他区域:方法区(Method Area)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)和堆(Heap)都是可能发生OutOfMemoryError的区域。
虚拟机栈:如果线程请求的栈深度大于虚拟机栈所允许的深度,将会出现StackOverflowError异常;如果虚拟机动态扩展无法申请到足够的内存,将会出现OutOfMemoryError。本地方法栈和虚拟机栈一样堆:Java堆可以处理物理上不连续。逻辑上连续,就像我们的磁盘空间一样,如果堆中没有内存完成实例分配,并且堆无法扩展时,将会抛出OutOfMemoryError。方法区:方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。



