think in java 第七章 多形性 第二部分

think in java 第七章的学习 第二部分

接口,内部类

 

1.接口

一些接口的基本概念

我的理解:

具体实现了一个接口以后,就获得了一个普通的类,可用标准方式对其进行扩展。

可决定将一个接口中的方法声明明确定义为“public”。但即便不明确定义,它们也会默认为public。所以在实现一个接口的时候,来自接口的方法必须定义成public。否则的话,它们会默认为“友好的”,而且会限制我们在继承过程中对一个方法的访问——Java编译器不允许我们那样做。

only public, abstract, default, static and strictfp are permitted

总之,接口中方法一定要是友好的。不然接口中的方法无法被实现,这就失去了接口的意义了。

上溯类型也是支持接口的:

可以发现selectMethod(xie xie)方法中的xie可以是普通类、抽象类、接口。所以说上溯类型也是支持接口的。selectMethod(xie xie)方法完全不知道xie是什么类型的,但是因为上溯造型,依然能够正常运作。

(1)Java的“多重继承”

在一个衍生类中,我们并不一定要拥有一个抽象或具体(没有抽象方法)的基础类。

如果确实想从一个非接口继承,那么只能从一个继承。剩余的所有基本元素都必须是“接口”。我们将所有接口名置于implements关键字的后面,并用逗号分隔它们。可根据需要使用多个接口,而且每个接口都会成为一个独立的类型,可对其进行上溯造型。

我的理解:

说是多重继承,我觉得实际上是多重引用才对。

举个例子:

这样的接口也是可以进行上塑造新的。

(2)通过继承扩展接口

利用继承技术,可方便地为一个接口添加新的方法声明,也可以将几个接口合并成一个新接口。在这两种情况下,最终得到的都是一个新接口。

我的理解:

举个例子:

接口可以继承接口。类在实现子接口时,必须初始化子接口父接口中的方法。子类父类都可以上溯造型。

(3)常数分组

由于置入一个接口的所有字段都自动具有static和final属性,所以接口是对常数值进行分组的一个好工具,它具有与C或C++的enum非常相似的效果。

我的理解:

效果如下:

这样写就可以直接调用接口中的字段属性了。

(4)初始化接口中的字段

接口中定义的字段会自动具有static和final属性。它们不能是“空白final”,但可初始化成非常数表达式。

由于字段是static的,所以它们会在首次装载类之后、以及首次访问任何字段之前获得初始化。

字段并不是接口的一部分,而是保存于那个接口的static存储区域中。

我的理解:

关于第一点,举个例子:

关于第二点,我觉得和类加载的概念有点不一样啊:

虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化。

但是这里确却是:

由于字段是static的,所以它们会在首次装载类之后、以及首次访问任何字段之前获得初始化。

我记得static对象的初始化是在类加载的过程中进行的。但是如果按照书上的说法:接口里的static字段却是在装载完接口类之后,在首次访问之前进行初始化。不知道是这两种情况不同呢,还是我之前搞错了。(回头校正)

关于第三点,字段并不是接口的一部分,而是保存于那个接口的static存储区域中。涉及到jvm,这也是我不明白的地方。

2.内部类

在Java 1.1中,可将一个类定义置入另一个类定义中。这就叫作“内部类”。内部类对我们非常有用,因为利用它可对那些逻辑上相互联系的类进行分组,并可控制一个类在另一个类里的“可见性”。然而,我们必须认识到内部类与以前讲述的“合成”方法存在着根本的区别。

通常,对内部类的需要并不是特别明显的,至少不会立即感觉到自己需要使用内部类。在本章的末尾,介绍完内部类的所有语法之后,大家会发现一个特别的例子。通过它应该可以清晰地认识到内部类的好处。

我的理解:

这样就算是内部类。但是使用起来有讲究,比如说:

在类的内部使用,看起来和平时没有什么两样。

但是如果要在类的外部使用,就要用特殊方法去获得内部类的对象:

总之,在这里类的作用范围显得很重要。内部类可以在类中调用,但是无法在类外创建和直接调用。正确的获取方式是在类内部创建get方法。

因为内部类中涉及很多内容,我下次再来研究下究竟是怎么一回事。

3.总结

多态是java中重要的特性,能简易实现复杂的功能,但是相对的也比较难理解。特别是内部类的知识,我觉得think in java中的例子很好,但是解释得很复杂。所以我下次将照着书本自己写一些例子,研究一下是怎么一回事。

发表评论

电子邮件地址不会被公开。 必填项已用*标注