Java期末复习速成(六)

Java期末复习速成(六)


接口和抽象类



接口

接口相当于就是对外的一种约定和标准,这里拿操作系统举例子,为什么会有操作系统?就会为了屏蔽软件的复杂性和硬件的简单性之间的差异,为软件提供统一的标准。

在Java语言中,接口是由interface关键字来表示的,比如我们可以向下面这样定义一个接口

public interface CxuanGoodJob {
    
    }

比如我们定义了一个CxuanGoodJob的接口,然后你就可以在其内部定义cxuan做的好的那些事情,比如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();
}

在抽象类中,具有如下特征

  • 如果一个类中有抽象方法,那么这个类一定是抽象类,也就是说,使用关键字 abstract 修饰的方法一定是抽象方法,具有抽象方法的类一定是抽象类。实现类方法中只有方法具体的实现
  • 抽象类中不一定只有抽象方法,抽象类中也可以有具体的方法,你可以自己去选择是否实现这些方法
  • 抽象类中的约束不像接口那么严格,你可以在抽象类中定义构造方法、抽象方法、普通属性、方法、静态属性和静态方法
  • 抽象类和接口一样不能被实例化,实例化只能实例化具体的类

异常



异常是程序经常会出现的,发现错误的最佳时机是在编译阶段,也就是你试图在运行程序之前。但是,在编译期间并不能找到所有的错误,有一些NullPointerException和ClassNotFoundException异常在编译期找不到,这些异常是RuntimeException运行时异常,这些异常往往在运行时才能被发现。

我们写Java程序经常会出现两种问题,一种是java.lang.Exception ,一种是java.lang.Error,都用来表示出现了异常情况,下面就针对这两种概念进行理解。


认识Exception

Exception位于java.lang包下,它是一种顶级接口,继承于Throwable类,Exception类及其子类都是Throwable 的组成条件,是程序出现的合理情况。

在认识Exception之前,有必要先了解一下什么是Throwable 。

什么是Throwable

Throwable类是Java语言中所有 错误(errors)异常(exceptions) 的父类。只有继承于
Throwable 的类或者其子类才能够被抛出,还有一种方式是带有Java中的 @throw 注解的类也可以抛出。

在Java规范中,对非受查异常和受查异常的定义是这样的:

The unchecked exception classes are the run-time exception classes and the error classes.

The checked exception classes are all exception classes other than the unchecked exceptionclasses.That is, the checked exception classes are Throwable and all its subclasses otherthan RuntimeException and its subclasses and Error and its subclasses.

也就是说,除了RuntimeException和其子类,以及error和其子类,其它的所有异常都是checkedException 。

那么,按照这种逻辑关系,我们可以对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 的父类也是0bject ,所以常用的方法还有继承其父类的getClass()和getName()方法。


常见的Exception

下面我们回到Exception的探讨上来,现在你知道了Exception 的父类是Throwable,并且Exception有两种异常,一种是 RuntimeException ;一种是CheckedException ,这两种异常都应该去捕获。

下面列出了一些Java中常见的异常及其分类,这块面试官也可能让你举出几个常见的异常情况并将其分类

RuntimeException

在这里插入图片描述

UncheckedException

在这里插入图片描述

与Exception有关的Java关键字

那么Java中是如何处理这些异常的呢?在Java中有这几个关键字 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 = o; 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 虚拟机)出现的问题。这些错误是不可检查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况,比如
OutOfMemoryError和 StackOverflowError异常的出现会有几种情况,这里需要先介绍一下Java内存模型JDK1.7。

在这里插入图片描述

其中包括两部分,由所有线程共享的数据区和线程隔离的数据区组成,在上面的Java内存模型中,只有程序计数器是不会发生OutOfMemoryError情况的区域,程序计数器控制着计算机指令的分支、循环、跳转、异常处理和线程恢复,并且程序计数器是每个线程私有的。

什么是线程私有:表示的就是各条线程之间互不影响,独立存储的内存区域。

如果应用程序执行的是Java方法,那么这个计数器记录的就是虚拟机字节码指令的地址;如果正在执行的是 Native方法,这个计数器值则为空(Undefined)

除了程序计数器外,其他区域:方法区(Method Area)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)和堆(Heap)都是可能发生OutOfMemoryError的区域

  • 虚拟机栈︰如果线程请求的栈深度大于虚拟机栈所允许的深度,将会出现StackOverflowError异常;如果虚拟机动态扩展无法申请到足够的内存,将出现OutOfMemoryError
  • 本地方法栈和虚拟机栈一样
  • 堆: Java堆可以处于物理上不连续,逻辑上连续,就像我们的磁盘空间一样,如果堆中没有内存完成实例分配,并且堆无法扩展时,将会抛出OutOfMemoryError
  • 方法区︰方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常

在Java 中,你可以把异常理解为是一种能够提高你程序健壮性的机制,它能够让你在编写代码中注意这些问题,也可以说,如果你写代码不会注意这些异常情况,你是无法成为一位硬核程序员的。

猜你喜欢

转载自blog.csdn.net/ws15168689087/article/details/123268587