zoukankan      html  css  js  c++  java
  • java day12第十二课 泛型和枚举

    泛型和枚举

    泛型

    jdk1.5版本之后出现的新特性,用于解决安全问题,是一个安全机制.
    泛型格式;通过<>定义操作的引用数据类型,在java提供的对象时,什么时候写泛型呢?
    通常在集合框架里面很常见,只要有<>就定义泛型。
    
    练习:通过我们的TreeSet练习一下泛型,或者通过ArrayList练习一下泛型。
    

    泛型类

    class Worker{
    
    }
    
    
    /*class Tool{
    	private Worker w;
    public void setWorker(Worker w){
        this.w = w;
      
    }
    public Worker getWorker(){
    	
     return w;
    }
    
    }
    */
    //泛型前做法
    /*class Tool{
    private Object obj;
    public void setObject(Object obj){
        this.obj = obj;
      
    }
    public Object getObject(){
    	
     return obj;
    }
    
    }
    */
    // 泛型后做法:
    class Uitl<T t>{//一个类对应一个工具类 比较麻烦。所以我们不这么定义
    
    private T t;
    public void setObject(T t){// 此处可以随便写标识符号,T是type的简称
        this.t = t;
      
    }
    public Object getObject(){
    	
     return t;
    }
    
    
    }
    
    class Demo{
    
    public static void main(String[] agrs){
    
    Tool t = new Tool();
    t.setWorker(new Worker);
    //Worker w = (Worker)t.getWorker();
    //使用泛型后不用强转
    Worker w = t.getWorker();
    
    }
    
    
    }
    

    什么时候使用泛型类?

    当类中腰操作的引用数据类型不确定的时候,早起定义Object来完成扩展,现在定义泛型类来扩展。
    泛型类定义的泛型,在整个类中有效,如果被方法是用,那么泛型类对象的明确要操作的具体类型。所有方法类型不确定,那么可以将泛型定义在方法上。
    

    泛型方法

    public <T> void show(T t){
    	System.out.println("show方法"+t);
    }
    public <Q> void print(Q q){
    	System.out.println("print方法"+t);
    }
    

    注意静态泛型方法:

    1、静态方法不可以访问类上定义的泛型。
    2、如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。
    public static <T> void menthods(T t){
    
    }
    

    泛型接口:

    import java.util.Date;
    
    interface Show<T,U>{  
        void show(T t,U u);  
    }  
    
    class ShowTest implements Show<String,Date>{  
        @Override  
        public void show(String str,Date date) {  
            System.out.println(str);  
            System.out.println(date);  
        }  
    }  
    
    public class TestDemo {
        public static void main(String[] args) {
            ShowTest showTest=new ShowTest();  
            showTest.show("Hello",new Date());      
        }
    }
    

    泛型限定:

    public class TestDemo {
        public static void main(String[] args) {
              ArrayList<Person> list = new ArrayList<Person>();
    	list.add(new Person("张三",20));
    	list.add(new Person("李四",20));
    	 ArrayList<Student> list = new ArrayList<Student>();
    	list.add(new Student("学生1",20));
    	list.add(new Student("学生2",20));
    	
    	    
        }
        
       public static void print(ArrayList<? extends Person> aa){//?称为通配符,也可以叫做占位符。不确定什么类型。? extends Person上限,Person的子类都可以 ? super Student Student的父类都可以叫做下限。
       		Iterator<? extends Person> it = tr.iterator();//
    	while(it.hasNext()){
    		
    		System.out.println(it.next().getName());
    	}	   
       }
        
        
    }
    

    练习:用TreeSet装入学生类型和工人类型两种类型,两种类型都要进行排序。要求只有一个比较器。

    枚举

     enum 的全称为enumeration,是 JDK1.5中引入的新特性,在 java.lang 包中。
      语法定义:
        创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
    
    
    	// 枚举定义
    	public enum Color {//enum是计算机编程语言中的一种数据类型。枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内。
    	     RED, GREEN, BLANK, YELLOW 
    	}
    	// 枚举使用
    	public static void main(String[] args) { 
    	    System.out.println( isRed( Color.BLANK ) ) ;  //结果: false
    	    System.out.println( isRed( Color.RED ) ) ;    //结果: true
    	 
    	}
    	// 枚举值的使用
    	static boolean isRed( Color color ){
    	    if ( Color.RED.equals( color )) {
    	        return true ;
    	    }
    	    return false ;
    	}
    	
    	===================================================
    	public enum Color {
    	    RED, GREEN, BLANK, YELLOW
    	}
    	
    	public static void main(String[] args) {
    	    showColor(Color.RED);
    	}
    	
    	static void showColor(Color color) {
    	    switch (color) {
    	    case BLANK:
    	        System.out.println(color);
    	        break;
    	    case RED:
    	        System.out.println(color);
    	        break;
    	    default:
    	        System.out.println(color);
    	        break;
    	    }
    	}
    	
    	
    	
    	===================================================
    	//自定义函数
    	public enum Color {
    	    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
    	    private String name;
    	    private int index;
    	    private Color(String name, int index) {
    	        this.name = name;
    	        this.index = index;
    	    }
    	    public String getName() {
    	        return name;
    	    }
    	    public void setName(String name) {
    	        this.name = name;
    	    }
    	    public int getIndex() {
    	        return index;
    	    }
    	    public void setIndex(int index) {
    	        this.index = index;
    	    }
    	}
    	
    	
    	public static void main(String[] args) {
    	    // 输出某一枚举的值
    	    System.out.println(Color.RED.getName());
    	    System.out.println(Color.RED.getIndex());
    	    // 遍历所有的枚举
    	    for (Color color : Color.values()) {
    	        System.out.println(color + "  name: " + color.getName() + "  index: " + color.getIndex());
    	    }
    	}
    

    EnumSet,EnumMap 的应用

    
    public class Test {
        public static void main(String[] args) {
            // EnumSet的使用
            EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);
            for (EnumTest day : weekSet) {
                System.out.println(day);
            }
     
            // EnumMap的使用
            EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);
            weekMap.put(EnumTest.MON, "星期一");
            weekMap.put(EnumTest.TUE, "星期二");
            // ... ...
            for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {
                Entry<EnumTest, String> entry = iter.next();
                System.out.println(entry.getKey().name() + ":" + entry.getValue());
            }
    
    

    总结:

      enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
      简单讲: 可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
     	
    
  • 相关阅读:
    Kail命令
    [UIScreen mainScreen].applicationFrame与[UIScreen mainScreen].bounds区别
    Excel使用技巧
    vs2012配置OpenGL
    IP首部校验和的计算
    链接保存
    Android精讲--界面编程1(界面编程与视图的组件)
    Intent对象详解
    安卓四大组件之--Service
    android的事件处理机制
  • 原文地址:https://www.cnblogs.com/chendujie/p/6859053.html
Copyright © 2011-2022 走看看