《Java从入门到精通》第十章笔记:接口、继承和多态
10 封装、继承和多态
目标:
- 掌握类的继承
- 掌握Object类中的几个重要方法
- 掌握对象类型的转换
- 掌握使用instanceof操作符判断对象类型
- 掌握方法的重载
- 掌握多态技术
- 掌握使用抽象类和接口
10.1 类的继承
子类不仅可以扩展父类的功能,还可以重写父类拥有的方法。
方法重写:
“两同”:
方法名相同;参数列表相同;
“两小”:
子类方法返回值类型应比父类方法返回值类型更小或相等;
子类方法声明抛出的异常类应比弗雷方法声明抛出的异常类更小或相等。
“一大”:子类方法的访问权限应比父类方法的访问权限更大或相等。
注意:重写方法和被重写方法要么都是类方法,要么都是实例方法,不能一个是类方法一个实例方法,否则编译出错。
10.2 Object类
Object类是所有类的父类。
注:Object类中的getClass()、notify()、notify()、wait()等方法不能被重写,因为这些方法被定义为final类型。
- getClass():返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。
- toString():将一个对象返回为字符串形式。
- equals():比较的是两个对象的引用是否相等。
注:如果是String类的equals()方法,那么比较的是两个字符串的实际内容。
10.3 对象类型的转换
10.3.1 向上转型
向上转型是从一个较具体的类到较抽象的类的转换。
10.3.2 向下转型
必须使用显示类型转换,向编译器指明将父类对象转换为哪一种类型的子类对象。
10.4 使用instanceof操作符判断对象类型
判断父类对象是否为子类对象的实例。
10.5 方法重载
“两同三不同”:
“两同”:类相同,方法名相同;
“三不同”:参数列表不同。(参数类型、个数、顺序)
10.6 多态
10.7 抽象类和接口
10.7.1 抽象类
abstract是定义抽象类的关键字。
使用abstract关键字定义的类称为抽象类,而使用这个关键自定义的方法称为抽象方法。抽象方法没有方法体,这个方法本身没有任何意义,除非它被重写,而承载这个抽象方法的抽象类必须被继承。
如果声明一个抽象的方法,就必须将城在这个抽象方法的类定义为抽象类,不可能在非抽象类中获取抽象方法。换句话说,只要类中有一个抽象方法,此类就被标记为抽象类。
抽象类被继承后需要实现其中所有的抽象方法,也就是保证相同的方法名称,参数列表和相同返回值类型创建出非抽象方法,当然也可以是抽象方法。
继承抽象类的所有子类需要将抽象类中的抽象方法进行覆盖。
但并不是每个类都需要使用父类的所有方法,所以继承的局限性较大,容易冗余。
这里引出来接口的概念。
10.7.2 接口
- 接口简介
注:在接口中定义的方法必须被定义为public或abstract形式,其他修饰权限不被Java编译器认可,即使不将该方法声明为public形式。
说明:接口中定义的任何字段自动是static和final的。 - 接口与继承
接口可以多重继承,因为一个类可以同时实现多个接口。
补充:抽象类和接口的对比。
相同点:
- 接口和抽象类都不能实例化;
- 都包含抽象方法,其子类都必须重写这些抽象方法;
- 都位于继承的顶端,用于被其他实现或继承。
不同点:
备注:Java8中接口引入了默认方法和静态方法,以此来减少抽象类和接口之间的差异。
接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:
行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量少用抽象类。
选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用的功能。