10.package、修饰符、final、常量、枚举、抽象类

一.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. 模板方法不能确定的部分定义成了抽象方法,交给子类实现,使用者只需要关心自己需要实现的功能即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

真滴book理喻

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值