泛型
  • 泛型是JDK5的新特性;泛型指广泛的类型,即类型参数化
  • 现多用于集合;
  • 泛型擦除:
  • 泛型只存在编译期,运行期就会消失;
  • 泛型类:
  • 定义:在定义类的时候在类名后面直接使用 < T > 形式指定泛型;
  • 当子类继承一个泛型父类时,如果子类不是泛型类,则需要明确父类上的泛型参数;如果在子类继承泛 型父类时没有给父类指定泛型参数,则需要将子类也定义成泛型类,并且子类的泛型参数变量名要和父类 保持一致;
class Abc<T>{
 private T t;
 public void setObj(T t){
	this.t=t;
 }
 public T getObj(){
 	return t;
}
  • 泛型接口
  • 定义:跟泛型类一致;
  • 规则:和泛型类一致;
  • 泛型方法
  • 定义:public void show(T t){} / public static void show(T t){} (在静态方法的参数要使用类的泛 型时,静态方法也要加上泛型)
  • 泛型通配符:?
  • A类是B类的子类,G是带泛型声明的类或接口。则G<?> 是G < A > 、G < B > 的父类!
    以List<?>为例:
    能读取其中的数据。因为不管存储的是什么类型的元素,其一定是Object类的或其子类的。
    不可以向其中写入数据。因为没有指明可以存放到其中的元素的类型!唯一例外的是:null
  • 泛型上限:List<? extends A>
    可以将List< A >的对象或List< B >的对象赋给List<? extends A>,其中B 是A的子类;
  • 泛型下限:List<? super A>
    可以将List< A>的对象或List< B >的对象赋给List<? super A>,其中B 是A的父类;
枚举(enum)
  • 枚举就是一个由final修饰的、具有固定个数对象的class,默认继承Enum类
  • 枚举类中也能定义普通的成员变量和方法
  • 可以定义抽象方法,但需要在枚举类的每个对象都要重写其抽象方法
  • 枚举对象的定义必须在第一行,后面还有声明必须加上分号
  • 枚举类中也能定义构造器,但构造器默认是私有的
  • 枚举类也实现接口,同时也要实现其抽象方法,可以在枚举类中实现为公共(所有对象共有)的方法,也可以在枚举对象中分别实现;
public class EnumTest {
    public static void main(String[] args){
        Teacher curry = new Teacher("Curry", Gender.MALE);
        System.out.println(curry);
        Gender male = Gender.valueOf("MALE");
	Gender female = Gender.FEMALE;
	Gender[] values = Gender.values();
	System.out.println(male+"\t"+female+"\t"+ Arrays.toString(values));
    }
}

enum Gender{
    MALE,FEMALE
}

class Teacher{
    String name;
    Gender gender;
    public Teacher(String name, Gender gender) {
    this.name = name;
    this.gender = gender;
    public String getName() {
   	 return name;
    }
    public void setName(String name) {
   	 this.name = name;
    }  
    public void setGender(Gender gender) {
    	this.gender = gender;
    } 
    @Override
    public String toString() {
    	return "Teacher{" +
            "name='" + name + '\'' +
            ", gender=" + gender +
            '}';
    }
}

enum X{
    X,XX,XXX;
}
//enum X等价于class Xx
class Xx{
    private static final Xx X=new Xx();
    private static final Xx XX=new Xx();
    private static final Xx XXX=new Xx();

    private Xx() {}
}