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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值