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 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- 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());
}
}
上述代码简单演示了枚举的成员该如何定义、声明与使用,输出结果如下:
Java包(package )的概念
为了更好地组织类并进行管理,Java 提供了包机制,用于区别类名的命名空间。为了防止命名冲突,访问控制,提供搜索和定位类(class)、接口(interface)、枚举(enumerations) 和 注释(annotation) 等。
那包有什么作用呢?总结以下几点:
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
一个包(package)可以定义为一组相互联系的类型(类、接口、枚举和注释),为这些类型提供访问保护和命名空间管理的功能。
以下是一些 Java 中的包:
- java.lang: 打包基础的类
- java.io: 包含输入输出功能的函数
上述示例简单的演示了 package 和 import 的使用,应该注意以下几点:
- 如果其他的一个源文件包含了这个包提供的类、接口、枚举或者注释类型的时候,都必须将这个包的声明放在这个源文件的开头。
- 包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
- 如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
- 通常使用小写的字母来命名避免与类、接口名字的冲突。
- 为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用 “import” 语句可完成此功能。
- 在 java 源文件中 import 语句应位于 package 语句之后,所有类的定义之前,可以没有,也可以有多条。
- 如果在一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略。
包(package )对应的目录结构
类放在包中会有两种主要的结果:
- 包名成为类名的一部分,正如我们前面讨论的一样。
- 包名必须与相应的字节码所在的目录结构相吻合。
上面的示例对应的实际目录:D:\JJFiles\java-test\test-demo-13\src\hero\Houyi.java
自学不易,点赞鼓励。
谢谢各位看官,如果有哪里写错的还望指出来哈,共同进步。