黑马程序员--高新技术(枚举和反射)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------



枚举

在Java中作为一种特别的类型存在。它是一种储存常量的数据集合,在创建其子类对象时只能创建里面定义的常量。枚举里的成员必须定义为常量,本质上是抽象的父类,而我们创建的对象就是其子类。

枚举是java1.5之后的新特性,之前的版本如果要实现这种机制,就必须用到大量的判断语句。

枚举类型的类中元素列表必须写在程序的第一行,构造方法必须是private型的,枚举元素都是static的,而静态变量在编译时就会初始化,就会调用构造方法;

枚举只有一个成员时,就可以作为一种单例的实现方式;

Enum类的常用方法:

    String  name():返回该枚举常量的String类型的名字;

    String toString():返回枚举常量的String类型的名字;

    int  ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)

    static  <T extends Enum<T>>T  valueOf(Stringname):返回带指定名字的枚举常量;


比如一个星期有7天,这7个类都是固定不变的。所以构造星期的枚举,它有7个常量成员。

  1.     public enum WeekDay  
  2.     {  
  3.         SUN,MON,TUE,WED,THU,FRI,SAT;       
  4.     }  
  5.       


再如交通灯的例子,交通灯有三种状态,分别为红、绿和黄。每种状态之间的转换有特定的规律,每种状态都有特定的持续时间。


  1.     public enum TrafficLamp  
  2.     {  
  3.         RED(40)  //成员必须写在最前面,创建时会按顺序实例化
  4.         {  
  5.             public TrafficLamp nextLamp()  
  6.             {  
  7.                 return GREEN;  
  8.             }  
  9.         },  
  10.         GREEN(60)  
  11.         {  
  12.             public TrafficLamp nextLamp()  
  13.             {  
  14.                 return YELLOW;  
  15.             }  
  16.         },  
  17.         YELLOW(5)  
  18.         {  
  19.             public TrafficLamp nextLamp()  
  20.             {  
  21.                 return RED;  
  22.             }  
  23.         };  
  24.           
  25.         private int time;  
  26.         private TrafficLamp(int time)  //带有构造方法
  27.         {  
  28.             this.time = time;  
  29.         }  
  30.         public abstract TrafficLamp nextLamp();   //有抽象方法,成员一定要复写它

实例化:TrafficLamp lamp=TrafficLamp.YELLOW; .  这时lamp就是YELLOW的实例化对象,它可以调用YELLOW里的构造方法。而且在创建对象时只能创建三种状态中的一种,担高了程序的安全性。当元素只有一个,可以实现单例设计模式,都是为了安全出发的。




反射


反射在Java1.2出现。它的基石就是Class类。

Java程序中有各种不同的类,各种类的抽象就是类。

每个对象都属于一种JAVA类,使用.getClass()可以获取。

第一个Java类都有自己的字节码。

获取类的各个字节码的三种方法

1.类名.class,例如System.class

2.对象.getClass

3.Class.forName(“类名”)  反射中这种方法较常用,因为写程序时往往还不知道所要调用的类,类名可以后期通过参数的方法传进来。


每一个类都有共性的成分,如Constructor,Field,Method.有构造参数的类还有ParameterType(可使用这个获得泛型中的实际参数)。

获得这个类的字节码之后,就可以使用Class类中的方法,如getConstructor,getField,getMethod得到这个类的成分。最后再使用这些成分中的方法得到这个类的构造和成员信息。

Constructor的反射应用

Constructor constructor = String.class.getConstructor(StringBuffer.class)

String是一个类,它有很多种构造方法,StringBuffer是其中一种的参数,这里就通过反射的方法获得了这种特定的构造方法。然后可以通过下面的方法实例化和应用。

constructor.newInstance(new StringBuffer("Hello"))

这就创建了一个String的实例化对象,它的参数是StringBuffer对象。


同理,其它成分的获取大同小异,只是方法调用上有所不同。最主要是把思想理解了。



---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值