1z-808复习 第5章

Class Design

  • Describe inheritance and its benefits
  • Develop code that demonstrates the use of polymorphism;
    including overriding and object type versus reference type
    开发代码来示范多态
  • Determine when casting is necessary
  • Use super and this to access objects and constructors
  • Use abstract classes and interfaces

Introducing Class Inheritance

子类继承父类所有的public,protected变量。
子类/派生类:child class或者是descendent of the class
父类:parent class或者是ancestor of the class
single inheritance:只可以继续一个父类,但可以实现多个接口
multiple levels of inheritance: 子类继承父类,父类继承父类的父类,多层次继承。

Extending a Class

每个文件里最多只能有一个public class,也可以没有public class。

Applying Class Access Modifiers

protected 和 private 只能用于inner class

Creating Java Objects

只有一个概念,如果没有明确指定继承的父类,就会缺省继承Object,因此所有的类最终都是继承的Object

Defining Constructors

this()和super()要放在第一行

Understanding Compiler Enhancements

如果构造函数中没有明确调用父类构造函数java会自动插入一条super()的父类构建函数

Reviewing Constructor Rules
  1. 每个构建方法的第一行代码,是用this()来调用这个类里的另一个构建方法。
    或者是调用直接父类的super()。
  2. 同样super()也不能在构建方法中放在第二行以后。(必须在第一行)
  3. 如果在构建函数中不存在super(),Java会自动插入一个没有参数的super(),作为构建函数的第一行。
  4. 根据第3条,如果父类中不存在没有参数的构建函数,并且子类中没有定义任何构建方法,
    编译器会报错,因为它自动往子类里生成一个空的构建函数,该构建函数自动调用父类的空的构建函数
  5. 如果父类中不存在没有参数的构建函数,那么在子类的每个构建函数中都要明确调用父类的构建函数

Calling Constructors

父类的super比this优先调用

Calling Inherited Class Members

子类可以使用父类的public或者protected成员。
如果子类和父类在同一package中,那么子类可以使用父类所有的default成员。
this.member来调用子类。
super.member来调用父类。

Inheriting Methods

Overriding a Method

如果override一个非private的父类方法,编译器会自动进行以下check:

  1. 首先method signature必须相同,即方法名和方法参数必须完全相同。
  2. 子类的 access level必须要比父类broader。
  3. 子类的方法不可以抛出一个新的checked exception,也不可以抛出broader exception(父类Exception)
  4. 方法的放回类型必须是父类返回类型的同类或子类。这个叫covariant
Redeclaring private Methods

如果是private函数,同样的method signature,相当于声明了一个完全新的函数
所以上面的规则完全不适用,也就是说private方法是没有override的。

Hiding Static Methods

对于静态方法,没有override,只有hidden。
比override多一条check:如果父类是static,子类必须也是static。
如果父类不是static,那么子类也不可以是static。

Overriding vs. Hiding Methods

在执行时,如果是instance method ,那么child version总是被执行。
除非明确是父类的reference调用发

Creating final methods

加了final的method是不能被继承的。

Defining an Interface

接口基本上可以看做是一个抽象类。

  1. 接口不能直接实例化。
  2. An interface is not required to have any methods.
    英文水平问题,接口并不是要求一定要有方法,误认为是接口不能有任何方法。
  3. 接口需要被继承,当然不能是final的。
  4. 所有顶层接口应该是public或default的, 且在其定义中必须包含abstract <- 在编译完之后会自动加上pubic
    问题是这样的话,default就没有意义了,会被自动转成public才对
    接口的定义如果是private, protected, or final,那么就会出编译错误。
    接口定义的修饰词中,只有public以及abstract被允许
  5. 所有非default方法被假定有abstract和public在定义中。 同样因此,他们不能是private, protected, or final

只有abstract的时候,看说明似乎是不会自动加上public,因为可以是default。 但例子又是自动加上的。

Inheriting an Interface

  • 一个借口extends另一个接口,和abstract class implements一个interface相同,
    所有的abstract method都会被继承

  • 第一个实体类,实现了接口或者抽象类,必须对所有继承的abstract 方法进行实体化。

和抽象类一样,一类接口可以继承另外一个接口。它会将另一个接口的所有抽象方法都继承过来。
和抽象诶不同的是,一个接口可以extends多个接口

Classes, Interfaces, and Keywords

多重继承的两个接口中,如果定义的函数签名完全相同的方法,则不冲突。 如果方法名相同,只是参数不同,那是overloading,两个方法都实体化就可以了。 如果方法名相同,参数也相同,只是返回值不同。则会出编译错误。

Interface Variables

接口变量默认为是public static final的

Ploymophic Parameters One of themost useful applications of ploymorphism is the ability
to pass instance of a subclass

Inheriting Variables

变量没有override,只有hidden。

Creating Abstract Classes

抽象类是一个必须有abstract关键字的类,并且其不可以被实例化。
抽象方法是定义在抽象类中,有abstract关键字的方法。

Defining an Abstract Class

抽象类里面可以放非抽象的方法,和变量。
抽象类可以不包含任何抽象方法。
抽象方法必须定义在抽象类中。
抽象方法不能有方法体{}。

如何在抽象类中为抽象方法提供缺省的实装?

抽象类和方法不能是final。
抽象方法不能是private。

Creating a Concrete Class

主要是在extends抽象类时,必须实装其中的抽象方法。

Extending an Abstract Class

如果是抽象类继承抽象类,那不需要实装抽象方法。
如果是实体化抽象类,那么就需要实装所有的抽象方法。

抽象类定义规则:

  1. 抽象类不能直接实例化
  2. 抽象类中可以有任何数量的抽象方法或者非抽象方法。
  3. 抽象类不可以是final或者是private
  4. 继承抽象类,也就是继承了所有抽象方法。
  5. 第一个实例化的类必须实装所有的抽象方法。

抽象方法定义规则: 1. 抽象方法必须定义在抽象类中 2. 抽象方法不能是private或是final 3. 抽象方法在声明的类中不能有方法体或实装 4. 实装抽象方法需要满足所有override的规则

Implementing Interfaces

接口是定义了public abstract方法和数据类型。
接口中定义了常量, public static final
接口中定义了缺省的方法。

Understanding Polymorphism

Summary

Exam Essentials

Review Questions

1.BE
2.B
3.AD
4.