0%

java-Day6——枚举类

枚举类

枚举类本质上也是一种类,只不过这个类的对象是有限的、固定的几个,不能让用户随意创建。

  • 星期

  • 性别

  • 月份

  • 积极

  • 三原色

  • 支付方式

  • 线程状态

  • 就职状态

  • 订单状态

开发建议:如果针对于某个类,其实例是确定个数的。则推荐将此类声明为枚举类

若枚举只有一个对象,则可以作为一种单例模式的实现方式

实现方法:

java支持enum关键字类快速定义枚举类型

JDK5.0之前:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class SeasonTest {
public static void main(String[] args) {
System.out.println(Season.SPRING);
}
}

//jdk5.0
class Season{
//2.声明当前类的对象的实例变量
private final String seasonName;
private final String seasonDesc;

//1.私有化构造器
private Season(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}


//3.提供实例变量的get
public String getSeasonName() {
return seasonName;
}

public String getSeasonDesc() {
return seasonDesc;
}

//4.创建当前类的实例
public static final Season SPRING = new Season("Spring", "Flowers");
public static final Season SUMMER = new Season("Summer", "Sunshine");
public static final Season AUTUMN = new Season("Autumn", "Wind");
public static final Season WINTER = new Season("Winter", "Snow");

}
}

5.0之后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
enum Season1{
//创建当前类的实例
SPRING("Spring", "Flowers"),
SUMMER("Summer", "Sunshine"),
AUTUMN("Autumn", "Wind"),
WINTER("Winter", "Snow");

//2.声明当前类的对象的实例变量
private final String seasonName;
private final String seasonDesc;

//1.私有化构造器
private Season1(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}


//3.提供实例变量的get
public String getSeasonName() {
return seasonName;
}

public String getSeasonDesc() {
return seasonDesc;
}

}

Enum常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//1. toString() 返回的是常量名,可以重写该方法
System.out.println(Season1.SPRING);
//2.name():得到当前枚举常量的名称,toString()优先
System.out.println(Season1.SPRING.name());
//3.values() 返回枚举类型的对象数组。便于遍历所有枚举值是一个静态方法
Season1[] values = Season1.values();
for (int i= 0; i<values.length;i++){
System.out.println(values[i]);
}
//4.valueOf(String objName):返回当前枚举类型中名称为objName的枚举类对象
//如果枚举类中不存objName则报错
String objName = "WINT1";
Season1 season1 = Season1.valueOf(objName);
System.out.println(season1);
//5.oridnal():返回当前枚举常量的次序号
System.out.println(Season1.AUTUMN.ordinal());

枚举类实现接口的操作:

  • Case1:枚举类实现接口,在枚举类中重写接口的抽象方法。当通过不同的枚举类对象调用此方法时,执行的是同一个方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    enum Season1 implements Info{
    SPRING("Spring", "Flowers"),
    SUMMER("Summer", "Sunshine"),
    AUTUMN("Autumn", "Wind"),
    WINTER("Winter", "Snow");

    //2.声明当前类的对象的实例变量
    private final String seasonName;
    private final String seasonDesc;

    //1.私有化构造器
    private Season1(String seasonName,String seasonDesc){
    this.seasonName = seasonName;
    this.seasonDesc = seasonDesc;
    }


    //3.提供实例变量的get
    public String getSeasonName() {
    return seasonName;
    }

    public String getSeasonDesc() {
    return seasonDesc;
    }

    @Override
    public void show() {

    }
    }
  • Case2:让枚举类的每一个对象来重写接口的抽象方法。这样枚举的每一个对象都可以有不同的重写方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    interface Info{
    void show();
    }
    enum Season1 implements Info{
    SPRING("Spring", "Flowers"){
    @Override
    public void show() {

    }
    },
    SUMMER("Summer", "Sunshine"){
    @Override
    public void show() {

    }
    },
    AUTUMN("Autumn", "Wind"){
    @Override
    public void show() {

    }
    },
    WINTER("Winter", "Snow"){
    @Override
    public void show() {

    }
    };

    //2.声明当前类的对象的实例变量
    private final String seasonName;
    private final String seasonDesc;

    //1.私有化构造器
    private Season1(String seasonName,String seasonDesc){
    this.seasonName = seasonName;
    this.seasonDesc = seasonDesc;
    }


    //3.提供实例变量的get
    public String getSeasonName() {
    return seasonName;
    }

    public String getSeasonDesc() {
    return seasonDesc;
    }

    }

实现一个单例模式

1
2
3
4
5
6
7
8
enum GirlFriend{
yuanyuan(20);
private final int age;
private GirlFriend(int age){
this.age = age;
}

}

Ex

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class ColorTest {
public static void main(String[] args) {
System.out.println(Color.RED);
}

}

enum Color{
RED(255,0,0,"红色"),
ORDANGE(255,128,0,"橙色"),
GREEN(0,255,0,"绿色");

private final int red;
private final int green;
private final int blue;
private final String desc;

Color(int red, int green, int blue, String desc) {
this.red = red;
this.green = green;
this.blue = blue;
this.desc = desc;
}

public int getRed() {
return red;
}

public int getGreen() {
return green;
}

public int getBlue() {
return blue;
}

public String getDesc() {
return desc;
}

@Override
public String toString() {
return name()+"("+red+","+green+","+blue+")"+desc;
}
}

注解

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

注解与注释区别:

注解也可以看做是一种注释。通过使用注解,程序员可以在不改变原有逻辑的情况相爱,在源文件嵌入一些补充信息。但是,注解不同于单行注释和多行注释

  • 单行注释和多行注释是给程序员看的。
  • 而注解是可以被编译器或其他程序读取的。程序还可以根据注解的不同,做出相应的处理

应用场景

  • 生成文档注释

  • 在编译时进行格式检查(JDK内置的三个基本注解)

  • 跟踪代码依耐性,实现替换配置文件功能

三个常用注解

  • @Override:限定重写父类方法,该注解只能用于方法
  • @Deprecated:用于表示所修饰的(类、方法)已过时。通常是因为所修饰的结构危险或存在更好的选择。
  • @SuppressWarnings:抑制编译器警告

自定义注解

以@SuppressWarnings为参照,进行定义极客。

单元测试

测试分类

黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望值。

白盒测试:需要写代码。关于程序具体的执行流程。

利用JUnit进行测试

说明

正确编写单元测试方法,需要满足

  • 所在的类必须是Public的,非抽象的,包含唯一的无参构造器

  • @Test标记的方法本身必须是public,非抽象的,非静态的,void无返回值,()无参数的。

包装类

为了让基本数据类型具备引用数据类型变量的相关特征(封装性、继承性、多态性)

基本数据类型

Java针对于八种基本数据类型定义了相应的引用类型:包装类。

L2DmW.png

基本数据类型转包装类(装箱)

手动装箱

1
2
3
4
5
6
7
8
9
10
11
12
public class WrapperTest {
public void test1(){
int i1 = 10;
Integer ii1 = Integer.valueOf(i1);
System.out.println(ii1.toString());

Float f1 = 12.3F;
Float ff1 = Float.valueOf(f1);
System.out.println(ff1.toString());

}
}

自动装箱

1
2
3
4
5
public void test2(){
int i1 = 10;
Integer ii1 = i1;
Float f1 = 12.3F;
}

包装类转基本数据类型(拆箱)

1
2
3
4
5
6
7
8
9
10
11
12
public class WrapperTest {
@Test
public void test1(){
Integer ii1 = Integer.valueOf(i1);
int i1 = ii1.intValue();
i1 = i1+1;

Float ff1 = Float.valueOf(12.3F);
float f1 = ff1.floatValue();

}
}

自动拆箱

1
2
3
4
5
public void test(){
Integer ii2 = 15;
int i2 = ii2;

}

String与基本数据类型、包装类之间的转换

基本数据类型、包装类 转 String

1
2
3
4
5
6
7
8
9
public void test4(){
int i5 =10;
String s1 = String.valueOf(i5);
System.out.println(s1);

Integer ii5 = 10;
String s2 = String.valueOf(ii5);
System.out.println(s2);
}

String转基本数据类型

1
2
3
4
public void test6(){
String s5 = "123";
int i1 = Integer.parseInt(s5);
}

自动装箱时,若数值在缓存对象区间,两个包装类相等。若超出Integer m=128, Integer n=128,此时m不等于n

LFLm5.png

-------------本文结束感谢您的阅读-------------