JDK5.0枚举 泛型 注释

技术总结:

  1. 枚举类
  2. 枚举类的使用
    枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类。
    当需要定义一组常量时,强烈建议使用枚举类。
    如果枚举类中只有一个对象,则可以作为单例模式的实现方式。
    1.2 如何定义枚举类
    方式一:JDK1.5之前,自定义枚举类;
    方式二:JDK1.5之后,可以使用enum关键词定义枚举类。
    自定义枚举类的三个原则:

私有化类的构造器,保证不能再类的外部创建其对象;
在类的内部创建类枚举类的实例。声明为:public static final
对象如果有实例变量,应该声明为private final,并在构造器中初始化。
自定义枚举类举例:SeasonTest类

`package com.atguigi.java;

public class SeasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring); // Season{seasonName='春天', seasonDesc='春暖花开'}
}
}

// 自定义枚举类
class Season{
// 1. 声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;

// 2. 私有化类的构造器,并给对象属性赋值
private Season(String seasonName, String seasonDesc){
    this.seasonName = seasonName;
    this.seasonDesc = seasonDesc;
}

// 3. 提供当前枚举类的多个对象:public static final修饰的
public static final Season SPRING = new Season("春天", "春暖花开");
public static final Season SUMMER = new Season("夏天", "夏日炎炎");
public static final Season AUTUMN = new Season("秋天", "秋高气爽");
public static final Season WINTER = new Season("冬天", "冰天雪地");

// 4. 其他诉求:获取枚举类对象的属性
public String getSeasonName() {
    return seasonName;
}

public String getSeasonDesc() {
    return seasonDesc;
}
// 5. 其他诉求:提供toString
@Override
public String toString() {
    return "Season{" +
            "seasonName='" + seasonName + '\'' +
            ", seasonDesc='" + seasonDesc + '\'' +
            '}';
}

}`
1.3 使用enum关键字定义枚举类
package com.atguigi.java;

/**

  • 使用enum关键字定义枚举类

  • 说明:定义的枚举类默认继承于java.lang.Enum类
    */
    `public class SeasonTest1 {
    public static void main(String[] args) {
    Season1 summer = Season1.SUMMER;
    System.out.println(summer); // Season1

     System.out.println(Season1.class.getSuperclass()); // class java.lang.Enum
    

    }
    }`

//使用enum关键字枚举类
`enum Season1{
// 1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
SPRING ("春天", "春暖花开"),
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冰天雪地");

// 2. 声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;


// 3. 私有化类的构造器,并给对象属性赋值
private Season1(String seasonName, String seasonDesc){
    this.seasonName = seasonName;
    this.seasonDesc = seasonDesc;
}

// 4. 其他诉求:获取枚举类对象的属性
public String getSeasonName() {
    return seasonName;
}

public String getSeasonDesc() {
    return seasonDesc;
}
// 5. 其他诉求:提供toString

@Override
public String toString() {
    return "Season1{" +
            "seasonName='" + seasonName + '\'' +
            ", seasonDesc='" + seasonDesc + '\'' +
            '}';
}

}`
使用enum关键字定义枚举类时,如果没有重写toString(),那么下面的代码执行的是结果是SUMMER。

`Season1 summer = Season1.SUMMER;
System.out.println(summer);
1.4 Enum类的常用方法
Season1 summer = Season1.SUMMER;

//toString():返回枚举类对象的名称
System.out.println(summer.toString());

System.out.println("****************");

//values():返回所有的枚举类对象构成的数组
Season1[] values = Season1.values();
for(int i = 0;i < values.length;i++){
System.out.println(values[i]);
//values[i].show();
}
System.out.println("****************");

//valueOf(String objName):返回枚举类中对象名是objName的对象。
Season1 winter = Season1.valueOf("WINTER"); // Season1{seasonName='冬天', seasonDesc='冰天雪地'}
//如果没有objName的枚举类对象,则抛异常:IllegalArgumentException
// Season1 winter = Season1.valueOf("WINTER1");
System.out.println(winter);
1.5 枚举类实现接口
情况一:实现接口,在enum类中实现抽象方法,跟普通的实现接口方式一样。
情况二:实现接口后,每个对象重写方法,从而实现每个对象调用同一方法产生不同结果。
定义接口Info,接口中定义方法show()。枚举类中的每个对象实现重写show()方法。实现的结果是不同的枚举类对象电泳同一个方法得到不同结果。

package com.atguigi.java;

/**

  • 使用enum关键字定义枚举类
  • 说明:定义的枚举类默认继承于java.lang.Enum类
    */
    public class SeasonTest1 {
    public static void main(String[] args) {
    Season1 summer = Season1.SUMMER;
    summer.show(); // 宁夏
    Season1 winter = Season1.valueOf("WINTER");
    winter.show(); // 大约在冬季
    }
    }

interface Info{
void show();
}`

//使用enum关键字枚举类
`enum Season1 implements Info{
// 1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
SPRING ("春天", "春暖花开"){
@Override
public void show() {
System.out.println("春天在哪里?");
}
},
SUMMER("夏天", "夏日炎炎"){
@Override
public void show() {
System.out.println("宁夏");
}
},
AUTUMN("秋天", "秋高气爽"){
@Override
public void show() {
System.out.println("秋天不回来");
}
},
WINTER("冬天", "冰天雪地"){
@Override
public void show() {
System.out.println("大约在冬季");
}
};

// 2. 声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;


// 3. 私有化类的构造器,并给对象属性赋值
private Season1(String seasonName, String seasonDesc){
    this.seasonName = seasonName;
    this.seasonDesc = seasonDesc;
}

// 4. 其他诉求:获取枚举类对象的属性
public String getSeasonName() {
    return seasonName;
}

public String getSeasonDesc() {
    return seasonDesc;
}
// 5. 其他诉求:提供toString

@Override
public String toString() {
    return "Season1{" +
            "seasonName='" + seasonName + '\'' +
            ", seasonDesc='" + seasonDesc + '\'' +
            '}';
}

}`
2. 注解
2.1 注解的理解
从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。

Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。

Annotation可以想修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的name = value对中。

在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE中旧版中所遗留的繁冗代码和XML配置等。

框架 = 注解 + 反射 + 设计模式

三,泛型(重点)
什么是泛型?
对数据类型进行一个限定.
应用最多的地方是集合。
为什么要使用泛型?
1.提高我们程序安全性.
2.将运行阶段的问题在编译阶段解决.
3.不用进行类型强制转换

我们学习泛型的目的:会使用集合上定义的泛型。

1.集合上泛型的基本使用.
//Collection
//List
//Set
//它们的作用是限定集合中元素的类型.

我们可不可以自己在类上或接口上定义泛型?
可以。怎样定义?

class 类名{

}
在类上声明的泛型怎样使用?
类的成员:成员属性---成员方法.
成员属性:类属性(static) 实例属性(非static)---我们管实例属性就叫成员属性.
成员方法:类方法 实例方法(成员方法)

类上声明的泛型 可以应用于成员方法或成员属性上。

在类上声明的泛型不能在类的静态成员上使用?
原因:是类上声明的泛型,只有在创建对象进才能进行类型传递。
而静态成员是不需要对象就可以调用。

我们可不可以在静态的方法上声明泛型?

可以
格式
修饰符 <泛型> 返回值 方法名(){}

泛型是应用于设计阶段.


在集合上应用泛型高级
通配符. ?

关于?在集合中的应用.

  1. ? extends E
    代表的是E类型或E的子类类型.

应用:在Collection接口中的addAll 方法
2. ? super E
代表的是E类型或E的父类类型.

应用:在TreeSet的构造方法上。

TreeSet集合:
它是一个可以排序的Set集合.

TreeSet集合怎样排序?
1.自然顺序
只要实现这个接口Comparable,就代表这个类型的元素具有自然顺序
2.比较器.
实现这个接口Comparator的类,可以根据指定条件进行比较。

指定比较器时,如果集合中的元素是按照父类中的属性进行比较,这时可以使用父类的比较顺.


泛型擦除机制

心得:软件编程是个处理细节的行业,学习的过程是个螺旋上升的过程,在学习过程中不可能迅速地把所有的东西都掌握,需要反复回头看,查缺补漏。
学习必须抓住细节 才不会报错啥的 学习细节非常重要!

posted @ 2020-08-30 19:51  向忘羡  阅读(113)  评论(0编辑  收藏  举报