一、枚举
(一)枚举概念
枚举:enum(由JDK1.5版本引入),是一种特殊的数据结构,具有Java类的特点,但比Java类有更多约束。
创建一个枚举:
public enum TypeEnum {
VIDEO,AUDIO,TEXT,IMAGE;
}
枚举可以有变量和方法,并且可实现接口,但枚举继承自java.lang.Enum类,因此不能再继承其他类。
如果为枚举值添加参数,则必须为枚举增加构造函数,相当于自我调用构造函数进行传参。
public enum TypeEnum {
VIDEO(1, "视频"), AUDIO(2, "音频"), TEXT(3, "文本"), IMAGE(4, "图像");
int value;
String name;
TypeEnum(int value, String name) {
this.value = value;
this.name = name;
}
public int getValue() {return value;}
public String getName() {return name;}
}
(二)枚举的常用方法
- int compareTo(E o) :内置比较方法
- Class getDeclaringClass():返回枚举类型的Class对象
- String name() :返回枚举常量名
- int ordinal() :返回枚举常量序号,首位为0
- String toString():返回枚举常量名(JDK推荐方法!)
- static <T extends Enum> T valueOf(Class enumType, String - name) :返回enumType枚举中"name"名称的常量
- static T[] values():返回枚举的所有值
二、注解
(一)注解概念
注解:Annotation(由JDK1.5版本引入),元数据,代码级别的解释说明,与接口、类处于同一级别,注解首字符为@,类似于生活中的标签,对代码作出解析(检查)。
(二)常见的注解
- @Override:继承
- @Deprecated:过时
- @SuppressWarnings:抑制(传参通常为"all")
- @SafeVarargs:忽略泛型告警
- @FunctionalInterface:标识匿名函数
- @Repeatable:注解可重复(例如一级注解为二级注解的数组,二级注解通过“Repeatable一级注解的反射”,存储末端传入的变量)
(三)自定义注解
public @interface 注解名称{
属性列表;
}
注解本质上是接口,继承自Annotation接口。
属性的返回值要求:基本数据类型、String、枚举、注解、前面几种的数组
属性赋值的特性:
1.如果使用default关键字给属性赋值,则使用注解时可以不赋值;
2.如果只有一个属性需要赋值且属性名为value,则赋值时可以省略value;
3.数组赋值时使用{“值1”,“值2”},如果输入中仅有一个值,则{}可以省略。
(四)元注解
元注解的含义:用于描述注解的注解。
1.@Target:描述注解的作用点
- ElementType.TYPE :注解只能修饰类和接口
- ElementType.FIELD :注解只能修饰属性
- ElementType.METHOD :注解只能修饰方法
- ElementType.PARAMETER :注解只能修饰参数
- ElementType.CONSTRUCTOR :注解只能修饰构造方法
- ElementType.LOCAL_VARIABLE :注解只能修饰局部变量
- ElementType.TYPE_USE :注解可以修饰所有内容(JDK1.8)
2.@Retention:描述注解的持续阶段
- RetentionPolicy.SOURCE:注解保留至源文件
- RetentionPolicy.CLASS:注解保留至编译文件“.class"
- RetentionPolicy.RUNTIME:注解保留至运行时(内存)
3.@Documented:描述注解是否被提取至API文档
4.@Inherited:描述注解是否被子类继承
(五)解析注解
1.获取注解定义位置的对象(Class、Method、Field)
2.判断是否存在注解:isAnnotationPresent(对象);
3.获取注解:getAnnotation(对象)
4.调用注解对象的方法:注解.属性值名称;
三、内部类
将一个类的定义放在里另一个类的内部,称为内部类,使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。但是内部类不建议嵌套,会破坏代码结构。
public class Outer{
//外部类区域
class Inner{
//内部类区域
}
}
(一)成员内部类
1.可以是任何的访问修饰符。
2.外部类如何访问内部类信息,必须new之后通过(.)操作符访问。
3.内部类可以直接使用外部类的任何信息,如果属性或者方法发生冲突,调用外部类.this.属性或者方法。
4.其它类访问内部类的方式:
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
inner.inner_show();//访问成员内部类的普通方法
(二)静态内部类
1.作为静态成员属性存在,可以被任意的权限修饰符修饰。
2.静态内部类的方法只能访问外部类的static关联的信息。
3.利用 外部类.内部类 引用=new 外部类.内部类(); 然后利用引用.成员信息(属性、方法)调用。
Outer.Inner oi = new Outer.Inner();
oi.innerShow();//访问静态内部类的普通方法
4.访问内部类的静态信息,直接外部类.内部类.静态信息。
Outer.Inner.innerStaticShow();//此时,外部类未加载,内部类加载
5.静态内部类可以独立存在,不依赖于其他外围类。
(三)局部(方法)内部类(很少遇到)
1.不能使用任何的访问修饰符。
2.会生成两个.class文件,一个是Outer.class ,另一个是Outer$LocalInner.class。
3.局部内部类只能访问方法中声明的final类型的变量。
(四)匿名内部类
- 匿名内部类没有访问修饰符。
- 使用匿名内部类时,这个new之后的类首先要存在,其次要重写new后的类的某个或某些方法。