java初学笔记08-枚举和注解

1.枚举

1.枚举概述

在某些情况下, 一个类的对象是有限且固定的。如季节类、月份类等, 可以采用枚举类
手动实现枚举类:

  • private修饰构造器
  • 属性使用 private final 修饰
  • 把该类的所有实例都是用 public static final 来修饰

枚举类和普通类的区别:

  • 枚举类的构造器只能使用private访问控制符
  • 枚举类的所有实例必须在枚举类中显示列出(,分隔 ;结尾)。
  • 列出的实例系统会自动添加 public static final 修饰
  • 所有的枚举类都提供了一个 values() 方法, 该方法可以很方便地遍历所有的枚举值

2.使用 enum 定义枚举类

  • JDK1.5新增的enmu关键字用于定义枚举类
  • 使用 enmu定义的枚举类默认继承了java.lang.Enum类
public class Test {
	public static void main(String[] args) {
		Season spring = Season.SPRING;
		//Season.SPRING,相当于获取一个Season类的对象
		spring.showInfo();
		Season spring1 = Season.SPRING;
		//每次执行Season.SPRING得到的是同一个对象,枚举类中的每个枚举都是单例
		System.out.println(spring.equals(spring1));
	}
}

enum Season{
	SPRING("春天", "春暖花开"),//相当于调用有参的私有构造方法
	SUMMER("夏天", "炎炎夏日"),
	AUTURM("秋天", "秋高气爽"),
	WINTER("冬天", "凛凛寒冬");
	
	private final String name;
	private final String desc;
	
	private Season(String name,String desc) {//私有化构造方法
		this.name=name;
		this.desc=desc;
	}
	
	public void showInfo() {
		System.out.println(this.name+":"+this.desc);
	}
}

3.通过values()遍历枚举

values()方法可以将枚举类转变为一个枚举类型的数组

       //遍历枚举
        Season[] season = Season.values();
        for (Season s : season) {
            s.showInfo();
        }

4.实现接口的枚举类

  • 和普通类一样, 枚举类可以实现一个或多个接口
  • 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 可以让每个枚举值分别来实现该方法。
public class Test {
	public static void main(String[] args) {
		Season.SPRING.test();
	}
}
enum Season implements In{
	SPRING("春天", "春暖花开"),//相当于调用有参的私有构造方法
	
	private final String name;
	private final String desc;
	
	private Season(String name,String desc) {//私有化构造方法
		this.name=name;
		this.desc=desc;
	}
	@Override
	public void test() {
		System.out.println("实现In接口的test方法");
	}	
}

interface In{
	void test();
}

4.枚举类的方法

在这里插入图片描述

2.注解

1.Annotation(注解)概述

  • 从JDK5.0开始, java增加了对元数据(MetaData)的支持, 也就是Annotation(注释)
  • Annotation其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。
  • Annotation 可以向修饰符一样被使, 可用于修饰包, 类, 构造器, 方法, 成员变量, 参数, 局部变量的声明, 这些信息被保存在Annotation的"name=value"对中。
  • Annotation能被用来为程序元素(类, 方法, 成员变量等)设置元数据。

2.基本的Annotation

  • 使用Annotation时要在其前面增加@符号, 并把该Annotation档后才能一个修饰符使用。用于修饰它支持的程序元素。
  • 三个基本的Annotation:
    @OVerride: 限定重写父类方法, 该注释只能用于方法
    @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
    @SuppressWarnings: 抑制编译器警告。
public class TestAnno {
	public static void main(String[] args) {
//		new TestB().test1();//弃用过时的方法
		new TestB().test2();
		
		@SuppressWarnings("unused")//抑制警告的注解
		TestA a = new TestA();
	}
}

class TestA{
	public void test() {
		
	}
}

class TestB extends TestA{
	@Override  //重写的注解
	public void test() {
		// TODO Auto-generated method stub
		super.test();
	}
	
	@Deprecated	//方法已过时的注解,原来的方法被弃用定义一个新的方法的时候
	public void test1() {}
	public void test2() {}
}

3.自定义Annotation

  • 定义新的Annotation类型使用 @interface 关键字
  • **定义 Annotation 的成员变量, 以无参数方法的形式来声明。**其方法名和返回值定义了该成员的名字和类型。
  • 可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用default关键字
  • 没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据Annotation
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

class TestB extends TestA{
	@TestAnno1(id = 100, desc = "帅气的")//采用自定义的注解对属性进行注解
	String name;
}

/**
 * 自定义注解
 * @author chenyao
 */
@Target(ElementType.FIELD)			//表示: 这个注解类是给其他类的属性做注解(不能给方法做注解)
@Retention(RetentionPolicy.RUNTIME)	//定义注解的生命周期
@Documented							//表示注解会被抽取到doc文档中
@interface TestAnno1{					//自定义注解TestAnno1
										//没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据Annotation
	public int id() default 0 ;			//成员变量在 Annotation 定义中以无参方法的形式id()来声明
	public String desc() default "" ;	//自定义注解的成员变量desc,类型为String,初始值为""
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code tea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值