『黑马程序员』---java--基础加强--枚举+注解
2014-02-08 19:11
302 查看
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
枚举
当然,为了避免nextDay()方法中,过多写入if.else语句,可以,使用抽象类,让每个子类去复写nextDay()方法,去创建实例对象.
[采用抽象方法将定义nextDay()就是将大量的if.else语句转移成一个个独立的类]
说白了,简化抒写.
注解
✔@SuppressWarnings
指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
✔@Deprecated
用
@Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。
✔@Override
表示一个方法声明打算重写超类中的另一个方法声明。
总结:
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,
没加,则等于没有某种标记,以后javac编译器,开发工具和其他程序可以用
反射来了解你的类及各种元素上有没有标记,看你有什么标记,就取干相应的事.
标记可以加在包,类,字段,方法的参数以及局部变量上.
注解自定义注解及其应用
✔定义一个最简单的注解:public
@ interface MyAnnotation{}
✔把他加在某个类型上
✔用反射进行测试Annotatino
Test的定义上是否有@MyAnnotation
✔根据发射测试的问题,引出@Retention元注解,其三种取值.
枚举
package cn.itcast.day1; //1.5新特性 /* * Custom[定制] */ public class EnumTest { public static void main(String[] args) { WeekDayCustom weekDayCus=WeekDayCustom.MON; //打印该对象的下一个对象.(因为覆盖了toString方法,所以,打印出来的不是对象地址) //System.out.println(weekDayCus.nextDay()); //........演示用,java中给封装好的枚举........ WeekDay weekDay=WeekDay.MON; System.out.println(weekDay); //可以实现排行的方法.ordinal() System.out.println(weekDay.ordinal()); //枚举这个类中的静态方法 //valueOf返回一个所指定的枚举对象 WeekDay sun=WeekDay.valueOf("SUN"); System.out.println(sun.ordinal()); //values(); //返回一个数组,该数组中包含枚举中所有对象 WeekDay[] week=WeekDay.values(); for(int i=0;i<week.length;i++){ System.out.println(week[i]); } } public enum WeekDay{ //注意:元素列表必须位于最前,如果列表后没有跟成员就可以不用写分号. //在枚举元素后跟上一个括号,括号中填写参数的个数,来调用不同的构造方法 //每个元素就是该类的一个实例对象 SUN(1),MON(),TUE,WED,THI,FRI,SAT; //构造方法必须为私有的,当然必须位于,列表后 private WeekDay(){} private WeekDay(int day){} } //抽象方法,每个元素,都是有子类来写.必须复写抽象方法 public enum TrafficLamp{ //new子类的实例对象,并且调用父类的有参构造方法 RED(30){ public TrafficLamp nextLamp() { return GREEN; } }, GREEN(45){ public TrafficLamp nextLamp(){ return YELLOW; } }, YELLOW(5){ public TrafficLamp nextLamp(){ return RED; } }; //类的方法,可以返回自己这个类的类型 public abstract TrafficLamp nextLamp(); private int time; private TrafficLamp(int time){this.time=time;} } }
当然,为了避免nextDay()方法中,过多写入if.else语句,可以,使用抽象类,让每个子类去复写nextDay()方法,去创建实例对象.
[采用抽象方法将定义nextDay()就是将大量的if.else语句转移成一个个独立的类]
说白了,简化抒写.
package cn.itcast.day1; public abstract class WeekDayCustom { //私有构造方法,不允许外界自行实例对象. private WeekDayCustom(){} //抽象nextDay方法,每个子类对象,该有的功能.... public abstract WeekDayCustom nextDay(); //加上,终极访问修饰符三联上 public final static接口的风范,,匿名子类对象. public final static WeekDayCustom SUN=new WeekDayCustom(){ public WeekDayCustom nextDay() { return MON; } }; public final static WeekDayCustom MON=new WeekDayCustom(){ public WeekDayCustom nextDay() { return SUN; }}; //不能为静态,这个方法,必须有实实在在的一个对象来调用. //因为,要确定返回,该对象的下一个对象....所以必须由对象调用. //this,表示当前对象 /*public WeekDay nextDay(){ if(this==SUN){ return MON; }else{ return MON; } } 以上这种nextDay方法,中要写很多if.else语句,我们可以 采用抽象方法将定义nextDay方法中大量的if.else语句转移成一个个独立的类. */ //打印该对象,显示对象.要覆盖toString()方法. //如果不覆盖,打印出来的是该对象的地址 @Override//注意力,在要覆盖方法前加@Override,可以帮你检查,你到底是否准确的抒写了覆盖方法 public String toString(){ return this==SUN?"SUN":"MON";//用到了三元运算符嘿嘿... } }
注解
✔@SuppressWarnings
指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
✔@Deprecated
用
@Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。
✔@Override
表示一个方法声明打算重写超类中的另一个方法声明。
总结:
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,
没加,则等于没有某种标记,以后javac编译器,开发工具和其他程序可以用
反射来了解你的类及各种元素上有没有标记,看你有什么标记,就取干相应的事.
标记可以加在包,类,字段,方法的参数以及局部变量上.
注解自定义注解及其应用
✔定义一个最简单的注解:public
@ interface MyAnnotation{}
✔把他加在某个类型上
✔用反射进行测试Annotatino
Test的定义上是否有@MyAnnotation
✔根据发射测试的问题,引出@Retention元注解,其三种取值.
package cn.itcast.day2; //涉及到的小单词: /* * Annotation[注释,注解] deprecation[祈免,贬低] Present[现在的;出席的] */ //小习惯注意下: //类名中的,Test最好不要放到前面.类名往往是名词....只有方法是动词.. //类名,属性名,变量名,都是名词.形容词+名词;;;;;动词.动词+名词 //小习惯,一定要注意....养成良好的习惯 //注解小理解:1.5的新特性 //注解就相当于一个标记,加了注解,就相当于为程序打了某种标记. //该标记可以加,在包,类,字段,方法,方法的参数以及局部变量上 //未来的开发模式都基于注解 //一个有多属性的注解....标识一个注解,就相当于创建他的实例对象,所以,创建时要给他的属性赋值... @ItcastAnnotation(color="red",value="abc",arrayAttr=1,annotationAttr=@MetaAnnotation("flx")) //注意:如果数组属性中只有一个元素,这时候属性值部分可以省略大括号. public class AnnotationTest { @ItcastAnnotation("values")//如果只有value属性需要赋值时,那么就可以省略抒写这个value="red" @SuppressWarnings("deprecation")//给方法加上一个注解,表示在编译时不再提示,过时的方法. public static void main(String[] args) { sayHello();//当然,在ide中,还是有划线的... //下面--------是对这个类进行检查,看他身上有什么东西..,这就要用到反射喽. //用Class类中的,对象.isAnnotationPresent(annotationClass)方法判断该类中是否有什么注解.. if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){ //如果有指定的注解,就用Class类中的,对象.getAnnotation(annotationClass),获取到该注解类的实例对象. ItcastAnnotation annotation=(ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); //以下测试,注解的属性.... System.out.println(annotation.color()+"---"+annotation.value()); System.out.println("测试数组类型数组的长度:"+annotation.arrayAttr().length); //虽然,上面,@ItcastAnnotation类注解中,没有对这个枚举赋值,但他有默认值,所以也 //可以拿出来.---------这里,再加上他的nextLamp()方法. System.out.println(annotation.lamp().nextLamp().name()); //测试,注解属性... System.out.println(annotation.annotationAttr().value()); } } @Deprecated//这个注解,可以自定义声明,该方法[过时]. public static void sayHello(){ System.out.println("outmoded[过时的]"); } }
package cn.itcast.day2; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import cn.itcast.day1.EnumTest; /* * Retention[保留] Policy[政策] Target[目标] * Element[元素] Type[类型] */ //小提示: //在注解类上加的注解,称为元注解. //扩展,还有元数据,元信息.比如元信息就是,信息的信息. /***************孝祥哲理部分**************** * 元注解以及其枚举属性值等什么的了,都不用死记,其实只要会看jdk提供 * 那几个基本的API帮助文档的定义或其源代码,按图索骥即可查到,或者直接 * 看java.lang.annotation包下面的类即可. * 常用的有:@Deprecated[-表示已经过时-],@Override[-覆写检查-],@SuppressWarnings[-抑制警告-] */ //元注解@Retention: 将该注解类保留到某个时期..(保留策略默认为 RetentionPolicy.CLASS) //一共有三个时期,分别为:java源文件(SOURCE)--->class文件(CLASS)--->内存中的字节码(RUNTIME) //我们,要在其他类中注解这个类,所以,要将该注解类保留在内存中的字节码时期..才可以被其他类调用哈.. @Retention(RetentionPolicy.RUNTIME) //元注解@Target: 规定该注解类所作用的范围(Target的默认值为任何元素) //注意了,这里的TYPE(1.5),他表示更广一些表示和class同级的所有范围.----他是与class平级类型的爸爸 //如果定义多个作用范围,就用数组的方式传递进去,如下... @Target({ElementType.METHOD,ElementType.TYPE}) //一个注解就是一个特殊的类,标识这个注解就相当于创立了他的实例对象.....他很像一个接口.. public @interface ItcastAnnotation { //下面是,为该注解添加属性......他的属性很像一个方法.... //下面这些方法,默认修饰符为 public abstract的,自己不用加,和接口很像呀.. //字符串类型的属性 //全写:public abstract String color()----返回值是String String color() default "yellow";//指定一个缺省属性. //***********属性名为value的属性..可以简写********** String value();////如果在标识注解时,只需给value属性赋值时,那么就可以省略"value=" //数组类型的属性----,注:在传递数组的时候,如果是一个值,就可以省略大括号arrayAttr=1 int[] arrayAttr()default {1,2,3};//指定一个缺省属性,默认值. //枚举类型的属性 EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;//枚举的一个元素就是他的一个实例对象 //注解类型的属性----有缺省属性 MetaAnnotation annotationAttr()default @MetaAnnotation("--value--");//设置缺省值. }
相关文章推荐
- 黑马程序员_Java基础加强(下)_类加载器,代理_28
- 黑马程序员 java基础加强--代理类
- 黑马程序员_java基础加强_静态导入_反射_枚举_注解_内省_泛型_代理
- 黑马程序员--Java基础加强(7)-----代理和AOP(面向方面编程)
- 黑马程序员_java基础加强学习笔记之注解
- 黑马程序员-java基础加强_myeclipse
- [黑马程序员] Java基础加强(5-7天)2010年Java高新技术_张孝祥
- 黑马程序员-------------(十)Java基础知识加强(一)
- 黑马程序员_Java基础加强(3)
- 黑马程序员--第三阶段--Java基础加强--第27天
- 黑马程序员_Java基础加强_内省
- 黑马程序员---Java基础加强---反射
- 黑马程序员__JAVA基础加强__高新技术(二)
- 黑马程序员--Java基础加强(一)
- 黑马程序员----java基础加强(5)
- 黑马程序员_Java基础加强第二天——Annotation
- 黑马程序员_Java基础加强2
- 黑马程序员_张孝祥_Java基础加强_泛型
- 黑马程序员-JAVA基础加强之类加载器
- 黑马程序员---java基础加强_可变参数和静态导入