- 类 继承 构造函数
- 类命名规则,类名大写,构造函数完成类初始化,与类同名。
- 抽象类 抽象类往往包含抽象的方法,同时包含具体的方法。抽象类的作用是提供一种适当的超类,之类可以通过继承来实现其抽象的方法。
- super关键字,子类调用父类的方法及成员时使用,super必须放在子类的方法内部进行使用?
- 向上类型转换和向下类型转换:向上类型转换后,无法访问子类中自定义的实例变量和方法。向下类型转换时,需要进行类型转换判断。
- 接口就是一系列常量和空方法的集合,它提供了多个类公有的方法,但不限制每个类如何实现这些方法。接口中不能声明任何变量和构造函数。
- 接口和类一样,可以作为一种数据类型使用。若定义了一个A接口,则任何实现A接口的类对象都是A类型的,通过这个引用可以访问接口中的方法,具体访问哪一个类中所实现的方法,由系统在运行时动态确定。
- String对象其内容不可改变,改变的只是对象的引用。StringBuffer其内容是可以改变的。toString方法可以把StringBuffer对象内的内容负责到一个新的String类对象中,返回这个新的String对象。+号连接的多个字符串对象在实际运行时进行的是叠加运算,即生成多个临时对象而后生成最后的对象。
- 在面向对象领域,抽象类主要用来进行类型隐藏。那什么是类型隐藏呢?我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。好比,动物是一个抽象类,人、猴子、老虎就是具体实现的派生类,我们就可以用动物类型来隐藏人、猴子和老虎的类型。
- 再来看一下接口,接口是什么呢?Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口是一种特殊形式的抽象类。
抽象类和接口有很大的区别,首先,抽象类在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个接口。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
其次,在抽象类的定义中,我们可以赋予方法的默认行为。但是在接口的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。
已经提到过,抽象类在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在”is a”关系,即父类和派生类在概念本质上应该是相同的。对于接口来说则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已。接口表示的是”like a”关系。
使用抽象类来定义允许多个实现的类型,比使用接口有一个明显的优势:抽象类的演化比接口的演化要容易的多。在后续的发行版中,如果希望在抽象类中增加一个方法,只增加一个默认的合理的实现即可,抽象类的所有实现都自动提供了这个新的方法。对于接口,这是行不通的。虽然可以在骨架实现类中增加一方法的实现来解决部分问题,但这不能解决不从骨架实现类继承的接口实现的问题。由此,设计公有的接口要非常谨慎,一旦一个接口被公开且被广泛实现,对它进行修改将是不可能的。
所以,使用接口还是抽象类,取决于我们对问题的概念的本质理解和设计的意图。