CS61B-lecture7,8,9
Interface Inheritance
子类和父类的构造器
Super();
当使用了子类的构造器时,会自动加入一行代码
super();
表示使用了父类的构造器Use super to invoke overridden superclass methods and constructors.(使用super来调用父类被override的方法)
implements和extends
父类和子类
implements和extends 代表了父类和子类的关系,子类继承父类所有的签名
如果子类要继承方法,需要用default标明
子类需要override所用方法并用 ·@override· 标明
原因是可能有些时候两个方法不满足override条件,需要这行代码来检查
子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。
当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量
- 子类覆盖父类的方法,必须有同样的参数返回类型,否则编译不能通过
- 子类覆盖父类的方法,在jdk1.5后,参数返回类可以是父类方法返回类的子类
- 子类覆盖父类方法,可以修改方法作用域修饰符,但只能把方法的作用域放大,而不能把public修改为private
- 子类方法能够访问父类的protected作用域成员,不能够访问默认的作用域成员,除非子类与父类同包
- 子类的静态方法不能隐藏同名的父类实例方法
注意: 子类不能直接访问父类的私有属性,子类只能在父类中写一个public的getXXX的方法来获取父类中的private属性,子类就调用父类的getXXX来获取private属性
总结
父类中的公有方法和域(属性),在类继承中将会被子类继承,但是私有的将不能被继承。
extends和implements的区别
When a class is a hyponym of an interface, we used implements.
Example: SLList
If you want one class to be a hyponym of another class, you use extends.
- extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,
- JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,
- 继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了 ,
比如class A extends B implementsC,D,E
总结
对于class而言,extends用于(单)继承一个类(class),而implements用于实现一个接口(interface)。
interface的引入是为了部分地提供多继承的功能。在interface中只需声明方法头,而将方法体留给实现的class来做。这些实现的class的实例完全可以当作interface的实例来对待。在interface之间也可以声明为extends(多继承)的关系。
注意:一个interface可以extends多个其他interface。
Casting
以下代码用了casting可以编译
1 | Poodle frank = new Poodle("Frank", 5); |
注意:
- casting使得编译器可以将动态类型为父类表示为它的子类,但是在使用子类的方法时可能会报错
- casting不会改变参数类型
Dynamic Method Selection
在使用override时
决定最终方法使用的是dynamic type
,也叫run-time type
与次相对应的还有static type
,也叫compile-time type
在使用overload时
根据参数静态类型来决定方法调用,当找不到时会找一个近似的,实在没有会报错
注意事项:
overload的优先级在override之上
Remember: The compiler chooses the most specific matching method signature from the static type of the invoking class.(override调用规则)
JUnit
New Syntax #1:
assertEquals(expected, actual);
- Tests that expected equals actual.
- If not, program terminates with verbose message.
- Other methods like
assertEquals
includeassertFalse
,assertNotNull
, etc., see http://junit.org/junit4/javadoc/4.12/org/junit/Assert.html
在使用JUnit时import
1 | import org.junit.Test; |
JUnittest 格式:
1 | @Test |
Higher Order Function
A function that treats another function as data.
Example in Python
1 | def tenX(x): |
Same in java
1 | public interface IntUnaryFunction { |