9. Extends, Casting, Higher Order Functions
约 695 字大约 2 分钟
2025-05-10
Extends
之前我们是通过 interface 进行继承关系的设置的。Interface 定义了子类可以做什么,实现了一种契约。这节课我们介绍继承关系的另外一种:extends,它实现两个类之间的继承关系,子类继承父类的成员,并且可以有所修改。
public class RotatingSLList<Item> extends SLList<Item>
在定义类的时候,后面跟着 extends 关键词,再加上父类就可以啦。
继承的成员包括:
- 所有的实例和静态变量
- 所有的方法
- 所有的内置类
注意,构造器是不能继承的,private 成员也是不能直接访问的。
构造器是不能继承的
有个问题是构造器为什么不能继承。
这是因为在 Java 中,所有的构造开头必须调用所有的父类构造器(通过在构造器开头加入 super 方法)。要是构造器可以继承,就重复了。
Object 类
万类之母——Object。
所有的类都是 Object 的子类。它有 .equals(Object obj)
、.hashCode()
和 toString()
方法。
封装
OOP 编程有个最重要的敌人是复杂性。我们要学会让程序不那么复杂,或者说程序员写代码不需要考虑太多。
有一个方法可以很好管理复杂性,就是封装。封装的含义是,让外界无法访问类内部的成员,而是只能通过类提供的方法(或者说接口)来实现一些操作。
这样就可以不管一个类内部怎么实现的,只需要调用类提供的方法,实现功能即可,就很简单了。
类型验证和强制转换
上节课我们讲过,当子类覆盖了父类的方法等时候,Java 会根据动态类型来确定运行采用什么方法。因此动态类型也被称为运行时类型。而在正常状况的时候,编译器则通过静态变量来确定,因此静态变量也称为编译时类型。
表达式
SLList<Integer> sl = new VengefulSLList<Integer>();
这样的有 new 的语句我们都叫它表达式。表达式也是含有编译时类型的。
确定表达式的编译时类型,我们需要往右看,new 的类型即编译时类型。
类型转换
有的时候我们希望告诉编译器,这个实例的编译时类型是 xx 类型,这种情况可以用类型转换。
Poodle largerPoodle = (Poodle) maxDog(frank, frankJr);
Higher Order Functions
一般的函数都是传数据,但有一种特别的函数,可以往它的参数列表传函数名。这样的函数我们叫 Higher Order Functions。