抽象类(abstract class)

  • 抽象类没有具体的实例,在类头使用abstract修饰符。
  • 抽象类的构造方法只能被子类使用,所以使用protected修饰符定义抽象类的构造方法。
  • 抽象方法是非静态的,不能包含在非抽象类中。
  • Java只允许为类的扩展做单一继承

接口(interface)

  • 接口无构造方法,只包含常量和抽象方法。
  • 使用extends关键字,接口可以扩展其他接口,Java允许使用接口做多重扩展

包装类(wrapper class)

包装类包括Double、Float、Long、Integer、Short、Byte、Character、Boolean,数值包装类扩展了抽象类java.lang.Number,实现了接口java.lang.Comparable

1
2
3
4
5
6
7
8
9
10
11
12
package java.lang;
//用于比较实现Comparable的类的对象
public interface Comparable{
public int compareTo(Object o);
}
package java.util;
//用于比较没有实现Comparable的类的对象
public interface Comparator{
public int compare(Object element1, Object element2);
public boolean equals(Object element);
}

泛型(generic)

泛型的主要优点是能够在编译时而不是在运行时检测出错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
import java.io.*;
public class TestGeneric{
public static void main(String[] args) throws IOException {
ArrayList<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
accept(a);
}
public static void accept(ArrayList<Object> a){
//public static void accept(List<String> a){
//public static void accept(ArrayList<String> a){
//public static void accept(ArrayList<?> a){
//public static void accept(ArrayList<? extends Object> a){
//public static void accept(ArrayList<? super String> a){
for(Object o: a)
System.out.println(o);
}
}

上述程序中的accept()方法会报错,可以使用注释中任一语句代替。

  • List为ArrayList的父类,而ArrayList不是ArrayList的父类;
  • <?>称为非受限通配,与<? extends Object>等价;
  • <? extends T>称为受限通配;
  • <? super T>称为下限通配。