枚举是什么?怎么用?Java中包的概念以及目录结构(Java 从自学到就业 第13天)

Java 学习记录 第十三天

由于本渣渣是前端转行Java,所以编辑器的选择就直接用 webstorm 同公司的 idea
接下来的知识梳理有一部分会借鉴大佬 廖雪峰的博客

学习目标

掌握枚举的声明与使用,了解包(package )的概念以及目录结构


学习内容

  • 枚举的概念
  • 枚举的方法
  • 枚举类成员
  • Java包(package )的概念
  • 包(package )对应的目录结构

枚举的概念

Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

enum Hero {
    HY,LB,SSX;
}

public class Test1 {
    public static void main(String[] args) {
        Hero houyi = Hero.HY;
        System.out.println(houyi);
    }
}

这是简单的一个枚举声明和使用,当然枚举也可以声明在内部类中再使用,示例如下:

public class Test2 {
    enum Hero {
        HY,LB,SSX;
    }

    public static void main(String[] args) {
        Hero houyi = Hero.HY;
        System.out.println(houyi);
    }
}

枚举的方法

enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口。
values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:

  1. values() 返回枚举类中所有的值。
  2. ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
  3. valueOf()方法返回指定字符串值的枚举常量。
enum Hero {
    HY,LB,SSX;
}

public class Test1 {
    public static void main(String[] args) {

        Hero[] heroList = Hero.values();

        for (Hero hero : heroList) {
            String showValue = "";
            Integer showOrdinal = hero.ordinal();
            switch (hero) {
                case HY:
                    showValue = "后羿";
                    break;
                case LB:
                    showValue = "鲁班";
                    break;
                case SSX:
                    showValue = "孙尚香";
                    break;
            }
            System.out.println("枚举迭代输出值:" + showValue);
            System.out.println("枚举迭代输出索引:" + showOrdinal + "\n");
        }

        System.out.println("输出枚举的指定常量:" + Hero.valueOf("HY"));
    }
}

上述代码简单描述了枚举的三个方法该如何使用,输出结果如下:

枚举的迭代

枚举类成员

枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。
枚举既可以包含具体方法,也可以包含抽象方法。 如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。

public class Test2 {
    enum Hero {
        HY {
            public String getConst() {
                return "HY";
            }
        }, LB {
            public String getConst() {
                return "LB";
            }
        }, SSX {
            public String getConst() {
                return "SSX";
            }
        };

        @Override
        public String toString() {
            String value = "";
            switch (super.toString()) {
                case "HY":
                    value = "后羿";
                    break;
                case "LB":
                    value = "鲁班";
                    break;
                case "SSX":
                    value = "孙尚香";
                    break;
            }
            return value;
        }

        public Hero constStr(Hero constStr) {
            return constStr;
        }

        // 定义抽象方法
        public abstract String getConst();

        private Hero() {
            System.out.println("枚举的构造器输出重写的 toString() 方法:" + toString());
        }

    }

    public static void main(String[] args) {
        Hero houyi = Hero.HY;
        System.out.println("\n这里是指定声明的枚举常量:" + houyi);
        System.out.println("\n这里调用枚举的方法输出指定常量:" + houyi.constStr(Hero.valueOf("HY")));
        System.out.println("\n这里调用枚举的抽象方法输出指定常量:" + houyi.getConst());
    }
}

上述代码简单演示了枚举的成员该如何定义、声明与使用,输出结果如下:

Enum constant 'SSX' must implement abstract method 'getConst()' in 'Hero'

Java包(package )的概念

为了更好地组织类并进行管理,Java 提供了包机制,用于区别类名的命名空间。为了防止命名冲突访问控制提供搜索和定位类(class)接口(interface)枚举(enumerations)注释(annotation) 等。

那包有什么作用呢?总结以下几点:

  1. 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  2. 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
  3. 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

一个包(package)可以定义为一组相互联系的类型(类、接口、枚举和注释),为这些类型提供访问保护和命名空间管理的功能。
以下是一些 Java 中的包:

  1. java.lang: 打包基础的类
  2. java.io: 包含输入输出功能的函数

Cannot resolve symbol 'Houyi'
上述示例简单的演示了 packageimport 的使用,应该注意以下几点:

  1. 如果其他的一个源文件包含了这个包提供的类、接口、枚举或者注释类型的时候,都必须将这个包的声明放在这个源文件的开头。
  2. 包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
  3. 如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
  4. 通常使用小写的字母来命名避免与类、接口名字的冲突。
  5. 为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用 “import” 语句可完成此功能。
  6. 在 java 源文件中 import 语句应位于 package 语句之后,所有类的定义之前,可以没有,也可以有多条。
  7. 如果在一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略。

包(package )对应的目录结构

类放在包中会有两种主要的结果:

  1. 包名成为类名的一部分,正如我们前面讨论的一样。
  2. 包名必须与相应的字节码所在的目录结构相吻合。

上面的示例对应的实际目录:D:\JJFiles\java-test\test-demo-13\src\hero\Houyi.java



自学不易,点赞鼓励。

谢谢各位看官,如果有哪里写错的还望指出来哈,共同进步。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Only Double J

自学不易,希望鼓励。

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

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

打赏作者

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

抵扣说明:

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

余额充值