Interface Inheritance

子类和父类的构造器

aViADe.png

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: SLListimplements List61B

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
2
3
4
Poodle frank  = new Poodle("Frank", 5);
Poodle frankJr = new Poodle("Frank Jr.", 15);
Dog largerDog = maxDog(frank, frankJr);
Poodle largerPoodle = (Poodle) maxDog(frank, frankJr);

注意:

  • 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

aEvnVx.png

New Syntax #1:

assertEquals(expected, actual);

在使用JUnit时import

1
2
import org.junit.Test;
import static org.junit.Assert.*;

JUnittest 格式:

1
2
3
4
@Test
public void testSort() {
...
}

Higher Order Function

A function that treats another function as data.

Example in Python

1
2
3
4
5
6
7
def tenX(x):
return 10*x

def do_twice(f, x):
return f(f(x))

print(do_twice(tenX, 2))

Same in java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface IntUnaryFunction {
int apply(int x);
}

public class TenX implements IntUnaryFunction {
public int apply(int x) {
return 10 * x;
}
}

public class HoFDemo {
public static int do_twice(IntUnaryFunction f, int x) {
return f.apply(f.apply(x));
}
public static void main(String[] args) {
System.out.println(do_twice(new TenX(), 2));
}
}