全文大量涉及上转型对象与接口回调,请事先熟悉。
目录
6.1 内部类(对应字节码文件名“外嵌类$内部类”)
在一个类中声明另一个内部类,这样的类称为内部类。而包含内部类的类称为外嵌类。
(1)内部类仅它的外嵌类使用,也就是public,protected等是无意义的。
(2)外嵌类的成员变量在内部类仍然有效,内部类中的方法也可以调用外嵌类方法。
(3)内部类的类体不可以声明类变量与类方法,在外嵌类的类体中可以用内部类声明对象作为外嵌类的成员。
6.2 匿名类(一定是内部类)
6.2.1 和类有关的匿名类
直接使用一个类的子类的类体创建一个子类对象。以People类为例:
new People() {
匿名类的类体
};
匿名类作为内部类,当然要遵守内部类的一切规则。包括不允许声明类变量与类方法等(见上面内部类规则)
其常用方式是向方法的参数传值。
abstract class Speak {
public abstract void speakHello();
}
class Student{
void f(Speak sp) { //参数传值
sp.speakHello();
}
}
public class Example6_2 {
public static void main (String args[ ]) {
Student st = new Student();
st.f(new Speak(){
//匿名类引用生成,并传给Student类中f方法的sp对象声明,可认为是对象的上转型
public void speakHello(){
System.out.println("i am student.");
}
});
}
}
6.2.2 和接口有关的匿名类
直接用接口名和一个类体创建一个匿名对象。以Computable接口为例:
new Computable() {
实现接口的匿名类的类体
}
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,但类体必须重写接口所有方法。
void f(ComPutable x)
//其中参数x为接口,那么调用f时,可以向f的参数传递一个匿名对象。
f(new ComPutable() {
实现接口的匿名类的类体,重写接口中所有方法
}
6.3 Lambda 表达式
Lambda 表达式就是只写参数列表和方法体的匿名方法
(参数列表) -> {
方法体
}
其只是一种在使用单接口(只有一个方法)匿名类时的简化用法,而且在代码表达复杂逻辑时不应该使用。
//通常方法
int f(int a,int b) {
return a + b
}
//lambda表达式
(int a,int b) -> {
return a + b
}
下面以单接口Cubic来讲解Lambda表达式的用法:
//单接口Cubic如下
public interface Cubic {
double getCubic(double x);
}
//使用Cubic接口有关的匿名类创建对象,做法如下。
Cubic a = new Cubic() {
public double getCubic(double x) {
return x*x*x;
}
}
//Lambda表达式简化
Cubic a = (double x) -> {
return x*x*x;
}
6.4 异常类(包含拓展部分)
throws声明异常/throw抛出异常
throws 声明异常
当一个方法产生一个它不处理的异常时,那么就需要在该方法的头部声明这个异常,以便将该异常传递到方法的外部进行处理。使用 throws 声明的方法表示此方法不处理异常。throws 具体格式如下:
returnType method_name(paramList) throws Exception 1,Exception2,…{…}
throw抛出异常
与 throws 不同的是,throw 语句用来直接拋出一个异常,后接一个可拋出的异常类对象,其语法格式如下:
throw ExceptionObject;
try/catch
一个try语句块可以对应多个catch子句,每个catch子句处理一种try语句块中抛出的异常。每一个catch子句,都称为一个异常处理器。一旦错误发生,直接跳出,不再执行后面的语句。
finally
无论try语句块正常退出或由于抛出异常而退出,都将执行finally子句。try语句可以没有catch,但是它任然可以使用finally。
异常的传递
如果异常没有被这一级处理,那么它会传递到上一级,直到异常被捕捉和处理,或异常传递出main方法关闭程序,也就是逐层向上。如果要在外层捕捉异常,那么这个异常应该包含在外部try语句中,并且应当具有catch语句来捕捉异常。
异常类层次结构
可以由Exception类或它的后代类派生一个新类来定义一个新的异常。
检查型与非检查型异常
对于检查型异常,如果发生异常的方法不捕捉和处理这个异常,则必须在该方法定义的声明头中包含throws 子句。
Java中唯一的非检查型异常,是RuntimeException类的对象或该类的后代类对象。所有其他的异常,都是检查型异常。
I/O异常
流(stream)是一个有序的字节序列,它可以用作输入源或作为输出目标,就像水沿着小溪流淌一样。
一个程序可以同时处理多个输人流和输出流。一个数据存储(如文件)可以作为一个程序的输人流或输出流,但一般不能同时既是输入流又是输出流。
标准I/O流有三种,System类中有三种对象引用变量(in、out、err)
6.5 class类
Class类是java中的一个类,默认的父类是Object。