一.package
1.1 什么是包
包是用来分门别类的管理各种不同类的,类似于文件夹,建包利于程序的管理和维护。
1.2 建包的语法格式
package 公司域名倒写.技术名称。包名建议全部小写,且具备意义。例如:
1.3 导包
1.什么时候导包
相同包下的类可以直接访问,不同包下的类必须导包才能使用。此外,如果一个类中需要用到的类,这个类的类名在不同的包中存在二个,那么默认只能导入一个类,另一个类要带全包名访问。
2.导包格式
import.包名.类名
二.权限修饰符
2.1 什么是权限修饰符
是用来控制一个成员能够被访问的范围。成员可以是类、成员变量、成员方法、构造器、内部类。
2.2 权限修饰符的分类
三.final
3.1 什么是final
final 是最终的意思,可以用来修饰类、变量、方法
3.2 final的作用
-
修饰类:表明该类是最终类,不能被继承
-
修饰方法:表明该方法是最终方法,不能被重写
-
修饰变量:表明该变量第一次赋值后,不能再次被赋值
3.3 final修饰变量时的注意事项
-
final 修饰的变量是基本数据类型,那么变量存储的数据值不能改变
-
final 修饰的变量是引用数据类型,那么变量存储的地址值不能改变,但地址指向的对象内容可以改变。
四.常量
4.1 什么是常量
常量是使用了 public static final 修饰的成员变量,必须有初始值,而且执行的过程中其值不能发生改变。
4.2 命名规范
英文单词全部大写,多个单词下划线连接起来。
4.2 常量的作用
-
通常用来记录系统的配置数据。
-
常量可以用来做信息标志和分类。
4.3 常量的优点
-
在编译阶段会使用宏替换,把使用常量的地方全部替换成真实的字面量。
-
维护系统容易,可读性更好。
-
实现了软编码形式。
五.枚举
5.1 枚举概述
Java 枚举(Enum)是一种特殊的数据类型,它是一组预定义的常量。枚举类型在 Java 中被广泛使用,它可以用来代替常量、标志位、状态码等,使代码更加清晰、易读和易维护。枚举类的常用方法如下,这些方法是由 Java 编译器自动为所有枚举类生成的方法。
-
values():返回枚举常量的数组。
-
valueOf(String str):根据枚举常量的字符串名字得到对应的枚举类中的常量。要求字符串必须是枚举常量的“名字”。如不是,会有运行时异常:IllegalArgumentException。
-
toString():返回枚举常量的字符串类型的名字。
5.2 定义枚举类的格式
普通枚举类
最简单的枚举类,枚举常量不具有任何的枚举属性,通过 枚举名.枚举常量 访问
修饰符 enum 枚举名称{
//枚举常量必须定义在首行
VALUE1, // 枚举常量1
VALUE2, // 枚举常量2
VALUE3; // 枚举常量3
}
带有属性的枚举类
枚举构造器是在使用枚举常量时才会自动调用的,并将指定的参数传递给它。枚举属性会和枚举构造器、枚举方法搭配使用。
enum Weekday {
//枚举常量
Monday("星期一"), Tuesday("星期二"), Wednesday("星期三"),
Thursday("星期四"), Friday("星期五"), Saturday("星期六"),
Sunday("星期日");
//枚举属性
private String value;
//枚举构造器
private Weekday(String value) {
this.value = value;
}
//枚举方法,一般用来获取枚举常量中的属性
public String getValue() {
return value;
}
}
5.3 枚举类的底层原理
实际上,枚举是 Java 提供的语法糖,我们定义的枚举在经过 Java 编译器编译之后,会转换成一个继承了 Enum 类的子类。例如:
源代码:
enum Season{
SPRING, SUMMER, AUTUMN, WINTER;
}
将源代码编译后生成 .class 文件,再将 class 文件反编译得如下代码:
5.4 枚举的作用
1.作为常量使用
可以通过枚举类来定义常量,以达到和 public static final ... 相同的效果。
//定义枚举类
enum EnumName {
Constant1,
Constant2,
Constant3,
...
}
//访问枚举常量
public class Main {
public static void main(String[] args) {
System.out.println("枚举常量:" + EnumName.Constant1);
}
}
2.在 switch 中使用
将枚举用在 switch 判断中,使得代码可读性更高了,实现代码如下:
//枚举类
enum ColorEnum {
GREEN, YELLOW, RED
}
public class ColorTest {
public void change() {
switch (ColorEnum.RED) {
case RED:
color = ColorEnum.GREEN;
break;
case YELLOW:
color = ColorEnum.RED;
break;
case GREEN:
color = ColorEnum.YELLOW;
break;
}
}
}
3.枚举方法
public class EnumTest {
public static void main(String[] args) {
ErrorCodeEnum errorCode = ErrorCodeEnum.SUCCESS;
//以下程序的执行结果为:状态码:1000 状态信息:success
System.out.println("状态码:" + errorCode.code() +
" 状态信息:" + errorCode.msg());
}
}
enum ErrorCodeEnum {
SUCCESS(1000, "success"),
PARAM_ERROR(1001, "parameter error"),
SYS_ERROR(1003, "system error"),
NAMESPACE_NOT_FOUND(2001, "namespace not found"),
NODE_NOT_EXIST(3002, "node not exist"),
NODE_ALREADY_EXIST(3003, "node already exist"),
UNKNOWN_ERROR(9999, "unknown error");
private int code;
private String msg;
ErrorCodeEnum(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int code() {
return code;
}
public String msg() {
return msg;
}
public static ErrorCodeEnum getErrorCode(int code) {
for (ErrorCodeEnum it : ErrorCodeEnum.values()) {
if (it.code() == code) {
return it;
}
}
return UNKNOWN_ERROR;
}
}
4.枚举实现接口
枚举类型也可以实现接口,这样每个枚举常量都会自动实现接口中的方法。例如,可以定义一个接口,并让枚举类型实现这个接口。在下面的例子中,通过让 Weekday 枚举类型实现 Printable 接口,使得每个枚举常量都自动实现了 print 方法。例如,可以通过 Weekday.Monday.print() 来输出当前是星期几。
interface Printable {
void print();
}
enum Weekday implements Printable {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday;
@Override
public void print() {
System.out.println("Today is " + this.name());
}
}
六.抽象类
6.1 什么是抽象类
使用abstract关键字修饰的类称为抽象类,修饰的方法称为抽象方法。
6.2 抽象类的特点
1. 类有的成员(成员变量、成员方法、构造器、代码块、内部类),抽象类都具备。
2. 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
3. 一个类如果继承了抽象类,那么这个类必须重写完抽象类的所有抽象方法,否则这个类也必须定义成抽象类。
4. 抽象方法只有方法签名,没有方法体。
5. 不能用abstract关键字修饰成员变量、构造器、代码块。
6. 最重要的特征:得到了抽象方法,失去了创造对象的能力。
6.3 抽象类的使用场景
1. 抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承。
2. 当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。
6.4 final和abstract的关系
final和abstract是互斥关系,
1. abstract修饰的类作为模板让子类继承,final定义的类不能被继承。
2. 抽象方法定义抽象功能让子类重写,final定义的方法子类不能重写。
6.5 模板方法模式
6.5.1 使用场景
当系统中出现一个功能多处在开发,而该功能大部分代码是一样的,只有其中部分代码不同的时候。
6.5.2 模板方法模式实现步骤
1. 定义一个抽象类。
2. 在抽象类中定义二个方法,一个是模板方法用于装相同代码,另一个是抽象方法。
3. 子类继承抽象类,重写抽象方法。
6.5.3 模板方法模式的优点
1. 提高了代码的复用性。
2. 模板方法不能确定的部分定义成了抽象方法,交给子类实现,使用者只需要关心自己需要实现的功能即可。