《Java程序设计》第7周学习总结

201711671215《Java程序设计》第7周学习总结

教材学习内容总结

第6章:接口与实现

6.1 接口

使用关键字interface来定义一个接口。接口的定义和类的定义相似,分为接口声明和接口体,例如:

interface Printable {
    final int MAX=100;
    void add();
    float sum(float x,float y);
}
1、接口声明:定义接口时使用关键字interface来声明自己是一个接口,格式如下:

interface 接口的名字
2、接口体

接口体中包含常量的声明(没有变量)和抽象方法两部分。

接口体中所有的常量的访问权限一定都是public,而且是static常量(允许省略public、final和static修饰符),所有的抽象方法的访问权限一定都是public(允许省略public abstract修饰符),例如:

interface Printable {
    public static final int MAX=100;   //等价写法:int MAX=100;
    public abstract void add();        //等价写法:void add();
    public abstract float sum(float x,float y);
}
6.2 实现接口

1、类实现接口

一个类需要在类声明中使用关键字implement声明该类实现一个或多个接口。如果实现多个接口,用逗号隔开接口名,例如:

class A implements Printable,Addable
2、重写接口中的方法

如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。

注意:由于接口中的方法一定是public abstract方法,所以类在重写接口方法时不仅要去掉abstract修饰符、给出方法体,而且方法的访问权限一定要明显地用public来修饰(否则就降低了访问权限,这是不允许的)。

接口可以通过继承产生新的接口。

3、接口的细节说明

注:Java提供的接口都在相应的包中,通过import语句不仅可以引入包中的类,也可以引入包中的接口。例如:

import java.io.*;
不仅引入了java.io包中的类,同时也引入了该包中的接口。

6.3 接口的UML图

使用一个长方形描述一个接口的主要构成,将长方形垂直地分成三层。

顶部第一层是名字层,接口的名字必须是斜体字形,而且需要用<<interface>>修饰名字,并且该修饰和名字分列在两行。

第二层是常量层,列出接口中的常量及类型,格式是“常量名字:类型”。

第三层是方法层,也称操作层,列出接口中的方法及返回类型,格式是“方法名字(参数列表):类型”。

                   实现关系的UML图
 

如果一个类实现了一个接口,类和接口的关系是实现关系,称类实现接口。

UML通过使用虚线连接类和它所实现的接口,虚线的起始端是类,虚线的终点端是它实现的接口,但终点端使用一个空心的三角形表示虚线的结束。

6.4 接口回调

接口属于引用型变量,接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用。

接口回调是指:可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。实际上,当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法。

接口回调非常类似于上转型对象调用子类重写的方法。

注:接口无法调用类中的其他的非接口方法。

6.5 理解接口

理解的关键点是:

(1)接口可以抽象出重要的行为标准,该行为标准用抽象方法来表示。

(2)可以把实现接口的类的对象的引用赋值给接口变量,该接口变量可以调用被该类实现的接口方法,即体现该类根据接口里的行为标准给出的具体行为。

接口的思想:它可以要求某些类有相同名称的方法,但方法的具体内容(方法体的内容)可以不同,即要求这些类实现接口,以保证这些类一定有接口中所声明的方法(即所谓的方法绑定)。接口在要求一些类有相同名称的方法的同时,并不强迫这些类具有相同的父类。

6.6 接口与多态

由接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法时就可能具有多种形态。

6.7 接口参数

如果一个方法的参数是接口类型,我们就可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。

6.8 abstract类与接口的比较

1、abstract类和接口都可以有abstract方法。

2、接口中只可以有常量,不能有变量;而abstract类中既可以有常量,也可以有变量。

3、abstract类中也可以有非abstract方法,接口不可以。

(抽象类与接口:1、作为行为准则。2、抽象类用在同一类别对象。3、接口更注重行为一致性。)

6.9 面向接口编程

接口只关心操作,但不关心这些操作的具体实现细节,可以使我们把主要精力放在程序的设计上,而不必拘泥于细节的实现。也就是说,可以通过在接口中声明若干个abstract方法,表明这些方法的重要性,方法体的内容细节由实现接口的类去完成。

核心思想:使用接口回调。

第7章:内部类与异常类

7.1 内部类

Java支持在一个类中定义另一个类,这样的类称作内部类,而包含内部类的类称为内部类的外嵌类。

内部类和外嵌类之间的重要关系:

1、内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。

2、内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。

3、内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象。

注:内部类可以被修饰为static内部类。static内部类不能操作外嵌类中的实例成员变量。非内部类不可以是static类。

7.2 匿名类

7.2.1 和子类有关的匿名类

Java允许我们直接使用一个类的子类的类体创建一个子类对象,也就是说,创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类体,称作匿名类。

假设Bank是类,那么下列代码就是用Bank的一个子类(匿名类)创建对象:

new Bank() {
    匿名类的类体
};
匿名类有如下特点:

1、匿名类可以继承父类的方法也可以重写父类的方法。

2、匿名类一定是内部类。

3、匿名类可以访问外嵌类中的成员变量和方法,匿名类的类体中不可以声明static成员变量和static方法。

4、由于匿名类是一个子类,但没有类名,所以在用匿名类创建对象时,要直接使用父类的构造方法。

7.2.2 和接口有关的匿名类

假设Computable是一个接口,那么,Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。

下列代码就是用实现了Computable接口的类(匿名类)创建对象:

new Computable() {
    实现接口的匿名类的类体
};
7.3 异常类

所谓异常就是程序运行时可能出现的一些错误,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。

Java使用throw关键字抛出一个Exception子类的实例表示异常发生。

异常对象可以调用如下方法得到或输出有关异常的信息:

public String getMessage();
public void printStackTrace();
public String toString();
程序运行出现异常时,Java运行环境就用异常类Exception的相应子类创建一个异常对象,并等待处理。

7.3.1 try-catch语句

Java使用try-catch语句来处理异常,将可能出现的异常操作放在try-catch语句的try部分,将发生异常后的处理放在catch部分。

try-catch语句的格式如下:

try {
    包含可能发生异常的语句
}
catch(ExceptionSubClass1 e) {
    …
}
catch(ExceptionSubClass2 e) {
    …
}
各个catch参数中的异常类都是Exception的某个子类,表明try部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的catch即可。

注:Java的io异常(输入输出异常)也就是文件不存在。

7.3.2 自定义异常类

一个方法在声明时可以使用throw关键字声明要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,并使用throw关键字抛出该异常对象,导致该方法结束执行。

注:throw是Java的关键字,该关键字的作用就是抛出异常。throw和throws是两个不同的关键字。

7.4 断言

断言语句一般用于程序不准备通过捕获异常来处理的错误。

1、断言语句的语法格式

使用关键字assert声明一条断言语句,断言语句有以下两种格式:

assert booleanExpression;
assert booleanExpression:messageException;
例如,对于断言语句:

assert number >= 0;
如果表达式number>=0的值为true,程序继续执行,否则程序立刻结束执行。

如果使用

assert booleanExpression;
形式的断言语句,当booleanExpression的值是true时,程序从断言语句处继续执行;值是false时,程序从断言语句处停止执行。

如果使用

assert booleanExpression:messageException;
形式的断言语句,当booleanExpression的值是true时,程序从断言语句处继续执行;值是false时,程序从断言语句处停止执行,并输出messageException表达式的值,提示用户出现了怎么样的问题。

2、启用与关闭断言语句

当使用Java解释器直接运行应用程序时,默认地关闭断言语句,在调试程序时可以使用-ea启用断言语句,例如:

java -ea mainClass
7.5 应用举例

带finally子语句的try-catch语句,语法格式如下:

try{ }
catch(ExceptionSubClass e){  }
finally{ }
其执行机制是:在执行try-catch语句后,执行finally子语句,也就是说,无论在try部分是否发生过异常,finally子语句都会被执行。

教材学习中的问题和解决过程

无。

代码调试中的问题和解决过程

无。

感悟

这周的知识开始有点难理解了,还是要多实践与思考。
 

猜你喜欢

转载自blog.csdn.net/ab111996/article/details/84403560