疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java高级特性之 枚举,注解,可变行参


 

   

  Java枚举

  java注解

  java 新特性 可变参数

  java枚举:

  在类的对象有限的情况下,可是使用枚举类的方式创建有限个类的对象。单例模式是一种特殊的枚举类。

  自定义枚举类:

  1,私有化构造器

  2,在类的内部创建若干个类的对象,public static final

  3,在类中的其他额外属性,定义为 private final, 可以额外的再声明getter()方法。

  枚举类的使用:

  2.使用enum关键字定义枚举类

  常用的两个方法:valueOf() values()

  枚举类实现接口:

  ①让类实现接口以后,重写接口中的抽象方法

  ②让类中的对象分别重写接口中的抽象方法

  必须在枚举类的第一行声明枚举类对象。枚举类和普通类的区别: 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类 枚举类的构造器只能使用 private 访问控制符 所有实例必须在枚举类中首行显式列出(,分隔 ;结尾). 列出的实例系统会自动添加 public static final 修饰 JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定实例:

  interface Info{

  public void show();

  }

  enum Person01 implements Info{

  MAN(“man”,true){

  public void show(){

  System.out.println(getType()+” has mustache “+isMustache());

  }

  },

  WOMAN(“woman”,false){

  @Override

  public void show(){

  System.out.println(getType()+” has mustache “+isMustache());

  }

  };

  private final String type;

  private final boolean isMustache;

  private Person01(String type,boolean isMustache){

  this.type = type;

  this.isMustache = isMustache;

  }

  }

  枚举类的实例对象MAN和WOMEN必须放在枚举类首行各式:

  instanceName1 (构造器参数),instanceName2(构造器参数)…;

  另外枚举类可以继承接口,并在枚举实例中实现接口中的抽象方法。

  枚举类的常用方法:

  values()返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

  valueOf(String str)可以把一个字符串转为对应的 枚举类对象。

  要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。否则,报java.lang.IllegalArgumentException异常

  枚举类的对象可以分别实现接口的抽象方法。

  java注解Annotation

  主要内容1 JDK内置的三个常用注解

  2 如何自定义一个注解

  3 元注解:对现有注解进行注解的一种注解

  4 通过反射机制或许类的注解信息(反射的时候深入)

  JDK内置的基本注解类型(3个)@Override , 限定重写父类方法, 该注释只能用于方法

  @Deprecated, 用于表示某个程序元素(类, 方法等)已过时

  @SuppressWarnings,抑制编译器警告,该注解需要参数

  自定义注解类型

  定义新的 Annotation 类型使用 @interface 关键字Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了该成员的名字和类型. 可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字

  public @interface MyAnnotation{

  String name() default “atguigu”;

  }

  没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据

  Annotation 对注解进行注解(4个)5.0提供了专门在注解上的注解类型,分别是:

  @Retention:指定该annotation保留的时间

  @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:

  RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释

  RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解。 这是默认值

  RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注释. 程序可以通过反射获取该注释

  @Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素或者结构@Target 也包含一个名为 value 的成员变量.

  @Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.定义为Documented的注解必须设置Retention值为RUNTIME。

  @Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解,实际应用中,使用较少

  利用反射获取注解信息(在反射部分涉及)

  总结:

  注解(annotation)的学习

  1.jdk内置的三个常用的注解

  @Override: 限定重写父类方法, 该注解只能用于方法

  @Deprecated: 用于表示某个程序元素(类, 方法等)已过时

  @SuppressWarnings: 抑制编译器警告

  2.如何自定义一个注解.以@SuppressWarnings为例

  *

  3.元注解:对现有的注解进行注解的注解

  @Retention:表明所修饰的注解的生命周期。 SOURCE / CLASS(默认) / RUNTIME

  @Target:表明所修饰的注解可以用来修饰的类的结构

  @Documented:表明所修饰的注解可以被javadoc解析

  @Inherited:表明所修饰的注解是否具有继承性

  可变个数形参

  /*

  可变个数形参的方法

  1.可变个数形参的格式:数据类型 … 形参名

  2.可变个数的形参的方法在调用时,参数从零个开始,到任意多个都可以

  3.可变个数的形参的方法与同名的方法间构成重载,若有相同类型的确定个数的形参方法,调用确定个数形参的方法。

  4.特别地,可变个数的形参的方法与同名的使用数组声明的参数的方法不能在类中共存

  5.若一个方法中有可变个数的形参,那么此形参必须声明在方法形参的最后

  6.一个方法中,最多只能声明一个可变个数的形参

  */

  public class ArgsTest {

  public static void main(String[] args) {

  Integer[] objs = new Integer[]{1,2,3,4};

  List list1 = Arrays.asList(objs);

  //与下面调用是有区别的

  Arrays.asList(1,2,3,4);

  List list2 = Arrays.asList(new Integer[]{1,2,3,4});

  System.out.println(list1.size());

  System.out.println(list2.size());

  ArgsTest a = new ArgsTest();

  a.method();

  a.method(1,2);

  a.method(10);

  a.method(new int[]{3,4});

  a.method(new int[]{11});

  }

  //如下的三个方法构成重载

  public void method(int num){

  System.out.println(num + “!”);

  }

  public void method(String str){

  System.out.println(str);

  }

  public void method(int … args){//int[] args

  for(int i = 0;i < args.length;i++){

  System.out.println(args[i]);

  }

  }

  // public void method(int[] args){

  //

  // }

  public void method(String str,int … args){

  }

  // public void method(int … args,String str){

  //

  // }

  }