《Java核心技术 卷1 基础知识》三

《Java核心技术 卷1 基础知识》
第六章 接口和内部类

接口不是类,而是对类的的一组需求描述。
接口不能包含实例域——接口没有实例
可以将接口看作没有实例域的抽象类
要将类声明为实现某个接口,需要使用关键字implements。

类实现一个接口的具体步骤为:
1)使用implements关键字进行声明要实现的接口
2)对接口中的所有方法进行定义

接口中的所有方法默认为public
但在实现接口时需要声明为public

这里介绍了Comparable接口,该接口只有一个方法,compareTo。

尽管不能构造接口的对象,但是可以声明接口的变量,不过该变量必须引用实现了该接口的类对象
Comparable x;
x = new Employee();
可以使用instanceOf检查一个对象是否属于某个特定类
也可以用来检查一个对象是否实现了某个特定的接口

与类的继承关系一样,接口也可以被扩展

在接口中可包含常量,有些接口只定义了常量,没有定义方法

Java中还内置了一个非常重要的接口:Cloneable,用于实现对象的拷贝
当然Object类实现了Cloneable接口,而且其clone方法被声明为projected方法。
因此,我们必须重新定义Cloneable接口的clone方法来完成深拷贝,类似于C++的深拷贝。

接口可以提供多重继承的大多数好处,同时还能避免多重继承的复杂性和低效性

在Java SE 8 中接口中也可以定义静态方法,但是有违于将接口作为抽象规范的初衷

扫描二维码关注公众号,回复: 8906558 查看本文章

也可以为接口方法提供一个默认实现,必须使用default修饰符标记这样一个方法

默认方法的一个重要用法是“接口演化”,比如很久之前你实现了某个类
public class bag implements Collection
后来,在Java SE 8的更新中,为这个类新增了一个stream方法。若该方法是非默认的,则不能保证源代码兼容, 再对bag类编译会出错。
而若是将其方法声明为默认方法,则没有这个问题。

解决默认方法冲突:
如果先在一个接口将一个方法定义为默认方法,然后又在超类或者另一个接口中定义了同样的方法,那么某个类对上述的接口或者类进行实现或者扩展的时候,就会产生默认方法冲突。
解决该冲突的规则如下:
(1)超类优先。即一个类扩展了一个超类,同时实现了一个接口,并从超类和接口继承了相同的方法,那么只考虑超类方法,即默认方法会被忽略。
(2)接口冲突。必须在类中覆盖这个方法来解决冲突,即重新定义该方法。

回调(callback),指出某个特定事件发生时英应该采取的动作

内部类:定义在另一个类中的类。
为什么使用内部类:
内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据
内部类可以对同一个包中的其他类隐藏起来
当想要定义一个回调函数而不想编写大量代码时,使用匿名内部类比较便捷

在Java中,一个内部类可以访问自身的数据域,额可以访问创建它的外部类对象的数据域
即内部类的对象有一个隐式引用,它指向了创建它的外部类对象

只有内部类可以是私有类,而常规类只有包可见性,或公有可见性

内部类对外部类的引用:
OuterClass.this.OuterClass的属性或者方法

在外部类的作用域之外如此引用内部类:
OuterClass.InnerClass

编写内部对象的构造器
outerObject.new InnerClass(construction parameters)

内部类是一种编译器现象,与虚拟机无关。编译器会把内部类翻译成用$分隔外部类名和内部类名的常规类文件,而虚拟机对此一无所知。

局部内部类,在一个方法内定义的内部类。
不能使用public和private访问说明符进行声明,它的作用域被限定在声明这个局部类的块中。

局部类的优势在于,可以对外部世界完全地隐藏起来。

匿名内部类,将局部内部类的使用再深入一步。
例如只创建这个类的一个对象,就不必命名了。

通常的语法格式为:
new SuperType(construction parameters)
{
inner class method and data
}

匿名类没有类名,因此也就没有构造函数,取而代之的是将构造参数传递给超类构造器

使用匿名内部类可以实现事件监听器和其他回调

静态内部类
将内部类声明为static,只起到隐藏作用,不会产生引用。
即静态内部类在不需要访问外部类对象时使用

猜你喜欢

转载自www.cnblogs.com/ASE265/p/12238389.html