您的位置:首页 > 职场人生

『黑马程序员』---java--基础加强--枚举+注解

2014-02-08 19:11 302 查看
----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

枚举



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--");//设置缺省值.

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息