Chapter 9 Abstract Classes and Interfaces
1. 抽象类不能创建任何实例,但可以被当作数据类型使用,因此可以创建抽象类类型的数组
ClassAbstract[] example = new ClassAbstract[];
2. 含有抽象方法的类必须被声名为抽象类,但抽象类不一定必须包含抽象方法。
作为抽象类的子类,如果没有实现(implement)所有的抽象方法,也只能被声名为抽象类。
抽象类也可以有自己的构造函数,以便被子类继承。
3. 子类可以重载父类的方法,并把它定义为抽象的。尽管这很少见,但是当父类的方法在子类中变得不可用时,就必须这么做。
4. 上一章跳过的一个概念:Hiding Data Fields and Static Methods
子类无法重载父类的数据域(无论静态与否)或静态方法,当你在子类中定义了同名的变量或是静态方法的时候,原来的方法或变量就被隐藏了,但仍然存在,访问它们有两种方法,一种是用super关键字,另一种就是通过父类的reference访问。
例如
class Animal {
public String news = "Animal's news";
public static String smile() {
return "smile from Animal";
}
}
class Tiger extends Animal {
public String news = "Tiger's news";
public static String smile() {
return "smile for Tiger";
}
}
x.news 为 Animal's news
x.simle() 返回 smile from Animal
只有将x造型(casting)为Tiger时,才会返回Tiger的内容。
但是实例方法(instance method)不存在这个现象。
5. Calendar 类及其子类
6. 接口 Interface
interface是一种类似于class的结构,且只包含常数和抽象方法。
如java.lang.Comparable
package java.lang;
public interface Comparable {
public int compareTo(Object o);
}
max方法用来取两个对象中较大的那一个:
public class Max {
public static Object max(Object o1, Object o2) {
if (((Comparable)o1).compareTo(o2) < 0)
return o1;
else
return o2;
}
}
使用max:以字符串为例
String s1 = "abcde";
String s2 = "abcdg";
String s3 = (String)Max.max(s1, s2);
(Comparable)o1 告诉编译器,把o1转型为Comparable以便于调用comepareTo方法。