CS61b:Week 4
Extends
关键字
- 当类是一个Interface接口的Hyponym时,使用
implements
关键字 - 类似地,当类是其他类的Hyponym时,使用
extends
关键字 - extends 继承了父类的所有实例变量,方法,嵌套类.
1 | public class List61b interface{//... |
super
关键字
- 在子类引用父类中的元素时,可以使用
super
关键字
1 | public class VengefulSLList<Item> extends SLList<Item>{ |
- 在子类调用构造函数时,也会调用父类的构造函数。
- 注意没有
super
关键字时,隐式调用的是父类的默认构造函数(不带形参) - 若想要调用父类的有参构造函数则需加上super关键字。
- 注意没有
1 | //正确的有参构造函数 |
Object类
- 在Java中任何创建的对象都是Object类的子类,可以使用Object中的方法。
接口继承vs实现继承
- Interface Inheritance 实际上提供了(What 方式的继承)
- 只提供方法的原型,不提供具体实现
- Implementation Inheritance 实际上提供了(How 方式的继承)
- 提供了默认的用法,当然可以重写
- 这两种继承都是is-a的上下级关系,而不是has-a的关系。
- 如:SLList is a List61b.
Stack
- 数据结构栈只有两种用法:
push()
: 在栈的顶部添加元素pop()
: 从栈顶弹出元素
- 栈和列表的关系
- Stack is a List ? 错误,这样栈就多出了许多没用的方法(List中的方法)
- Stack has a List.正确,栈用一个列表储存元素,而只有属于自己的两种用法.
Encapsulation
- 封装(Encapsulation),面向对象编程的三大特性之一。
- 封装提供了一个数据抽象层次。(不关心方法的具体实现,只关心方法的用法和效果,类比为一个黑箱)
- 封装有利于模块化编程。
- 实现继承破坏了封装。实现继承重写了父类封装中的方法,破坏了父类的封装性。
1 | //Dog.java |
类型检查和类型转换
类型检查
- Java编译器在编译程序时会进行类型检查(静态类型),确保程序中每个语句的静态类型相匹配,否则不会通过编译。
- 表达式,函数等也具有编译时类型,编译器会检查是否匹配。
1 | //Example1. |
类型转换
- 类型转换十分强大,但同时也十分危险,使用时要非常小心。
1 | //举上面的例子为例 |
高阶函数(Higher Order Funtion)
- 将函数作为参数传递或返回的函数称为高阶函数(Higher Order Funtion)
在Java中的实现
- 将函数封装在类中作为参数进行传递即可。
- 缺点:要新建多个文件,来仅仅实现一个高阶函数。
1 | //jaca中抽象函数的实现,将函数封装在类中进行传递,以实现传递参数的行为 |
子类型多态(Subtype Polymorphism)
子类型与子类
- 只要是A类运用了extends关键字实现了对B类的继承,那么我们就可以说Class A是Class B的子类,只要满足继承的语法,就存在子类关系。
- 子类型比子类有更严格的要求,它不仅要求有继承的语法,同时要求如果存在子类对父类方法的改写(override),那么改写的内容必须符合父类原本的语义,其被调用后的作用应该和父类实现的效果方向一致。
子类型多态性
- Polymorphism多态:为不同类型的实体提供一个统一的接口。
- 派生类对象可以替代基类对象,从而实现多态性。它是面向对象编程中的一个重要特征。
- 子类型多态性,在面向对象编程的上下文中几乎被称为多态性,是一种类型的能力,A,像另一种类型B一样出现和使用。
- 多态通常有两种实现方法:
- 子类继承父类(extends)
- 类实现接口(implements)
- 核心之处在于对父类方法的改写或对接口方法的实现,以取得在运行时不同的执行效果。
内置Comparable
接口和Comparator
接口
-
重写比较接口:实现自定义类型的比较函数
-
内置可比较对象接口
1 | public interface Comparable<T>{ |
- 内置比较器接口
1 | public interface Comparator<T>{ |
- 例子
1 | import java.util.Comparator; |
Enhanced For Loops
1 | Set<Integer> S = new HashSet<>(); |
迭代器Iterator
- 内置迭代器接口
1 | public interface Iterator<T>{ |
- 增强for循环的内在实现
1 | for(int i : S){ |
-
实现迭代器方法
hasnext()
- 若迭代器指向的对象不为空,则返回真,否则返回假
next()
- 返回迭代器当前指向的对象,将迭代器的指向向后推移(使其指向下一个元素)
-
内置可迭代对象(具有迭代器的类)接口
1 | public interface Iterable<T>{ |
-
自定义类要想正常使用增强for循环的条件
- 实现可迭代对象接口
- 要有类内有迭代器(接口)的实现
-
示例代码
1 | import java.util.Iterator; |
Object:toString
- 函数原型
1 | public String toString(); |
- java中的所有类都是Object的子类,因此继承了Object的方法
- 在使用Java的
System.out.print
时,实际上隐式调用了toString
方法 toString
方法的重写
1 |
|
- 使用内置的字符串构建类构建字符串来加快运行速度(前一种方法构建时会创建原字符串的副本,处理大型数据时耗时大)
1 |
|
Object:equals
- 原型
1 | public class Object{ |
- 使用Object内置的
equal
函数可以比较两个对象是否相同- 仅仅比较内存中存储的比特位,如果存储的是引用类型,只比较储存的对象的地址是否相同,而不比较对象的属性。
- 用户可以重写
equal
函数使其满足个性化的需要
1 |
|
instanceof
方法- 用来检查对象是否为相应的类型,例子如上所述
- 如果o为对应类型则返回真,且将o转化为对应类型的变量,名为otherarrayset
- 如果o不为对应类型则返回假
1 | if(o instanceof Arrayset otherarrayset){ |