Java 基础进阶篇(四)—— 权限修饰符、final 关键字与枚举

news2024/12/23 5:31:04

文章目录

  • 一、权限修饰符
  • 二、final 关键字
    • 2.1 final 作用
    • 2.2 final 修饰变量举例
    • 2.3 常量
  • 三、枚举
    • 3.1 枚举的格式
    • 3.2 枚举的特征
    • 3.3 枚举的应用


一、权限修饰符

权限修饰符 用于约束成员变量、构造器、方法等的访问范围。

权限修饰符: 有四种作用范围由小到大 (private -> 缺省 ->protected - > public)

在这里插入图片描述
注: 不同包下的子类指的是,不同包下的子类对象能访问,当前类创建父类对象访问不了。

// 模拟不同包下的子类
public class Zi extends Fu {
    public static void main(String[] args) {
        Fu fu = new Fu();
        // fu.privateMethod(); 访问不了
        // fu.method(); 访问不了
        // fu.protectedMethod(); 访问不了
        fu.publicMethod();

        Zi zi = new Zi();
        zi.protectedMethod(); // 可以访问 protected
    }
}

定义成员变量、构造器、方法等一般需满足如下要求:

① 成员变量一般私有。
② 方法一般公开。
③ 如果该成员只希望本类访问,使用 private 修饰。
④ 如果该成员只希望本类,同一个包下的其他类和子类访问,使用 protected 修饰。


二、final 关键字

2.1 final 作用

final 关键字是最终的意思,可以修饰类、方法与变量。

  • 修饰类: 类不能被继承。工具类可以用 final 修饰。
  • 修饰方法: 方法不能被重写。 模板方法可以用 final。
  • 修饰变量: 有且仅能被赋值一次。

2.2 final 修饰变量举例

final 修饰 基本数据类型 的变量,其存储的数据不能改变
final 修饰 引用类型 的变量,其存储的地址不能改变,但是指向的对象内容可以改变

举例:final 修饰变量

public class Test {
    // 修饰静态成员变量( public static final 修饰的也称为常量,必须一次赋完值 )
    public static final String name = "idea"; // 引用类型

    // 修饰实例成员变量( 必须一次赋完值,几乎不用 )
    public final String novelName = "孙悟空";

    public static void main(String[] args) {
        // final 修饰变量,总规则:变量有且仅能赋值一次
        // 变量有两种:局部变量;成员变量(实例成员变量、静态成员变量)

        // 局部变量
        final double rate = 3.14; // 基本数据类型
        // rate = 4.23; 报错,第二次赋值

        // 成员变量
        // name = "dev"; // 报错,第二次赋值

        // new Test().novelName = "唐僧"; // 报错,第二次赋值
    }
}

new Test().novelName = “唐僧”; 报错是由于引用地址发生了变化,内存原理是在堆内存的常量池中存储了一个“唐僧”的变量,并将引用地址赋给 novelName。

参考:Java 基础入门篇(六)—— String 类详解

举例:final 修饰引用类型的变量

class Teacher{
    private String hobby;
    public Teacher(String s) {
        hobby = s;
    }
    public String getHobby() {
        return hobby;
    }
    public void setHobby(String hobby) {
        this.hobby = hobby;
    }
}

public class Test {
    public static void main(String[] args) {
        // 注意: final修饰引用类型的变量,其地址值不能改变,但是指向的对象的内容可以改变的。
        final Teacher teacher = new Teacher("学习,授课");
        teacher.setHobby("打篮球");
        System.out.println(teacher.getHobby()); // 打篮球
    }
}

没有报错的原因:虽然 teacher 对象内部的引用数据的地址发生了变化,但是 teacher 对象的引用地址没有发生变化。


2.3 常量

常量是 public static final 修饰的成员变量,有且仅能赋值一次。

作用:做系统的配置信息,方便程序维护,提高可读性。
规范:名称全部大写,多个单词用下划线连接
常量会出现宏替换:所以常量名的地方在编译后都是变成真实的数据。

接口中的常量,默认加上 public static final 修饰,不写也有。如我们一般在项目中定义的常量接口:

在这里插入图片描述


三、枚举

枚举是一种特殊类型,其用来做信息的标志和信息的分类。

3.1 枚举的格式

在这里插入图片描述


3.2 枚举的特征

反编译后观察枚举的特征:

使用 javap 命令反编译 class 文件得到如下结果:
在这里插入图片描述

特征如下:

① 枚举类都是继承了枚举类型 java.lang.Enum。
② 枚举都是最终类,不可以被继承。
构造器的构造器都是私有的,枚举对外不能创建对象。(看不到)
④ 枚举类的第一行默认都是罗列枚举对象的名称的。
⑤ 枚举类相当于是多例模式,如上文只有四个对象。


3.3 枚举的应用

应用 1:业务枚举类与业务结果包装类

/**
 * 业务消息枚举
 */
public enum CodeMsg {

    SUCCESS(200, "操作成功"),
    ERROR(110, "程序员送外卖去了"),
    
    USERNAME_PASSWORD_ERROR(4001001, "用户名或者密码错误!"),
    USER_LOGIN_NAME_EXIST_ERROR(4001002, "用户登陆名已经存在!"),
    USER_PHONE_EXIST_ERROR(4001003, "用户手机号已被使用!");

    public Integer code; // 业务码
    public String msg; // 业务消息

    CodeMsg(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }
}
/**
 * 业务结果包装类
 * 前端需要: code msg data 这样的数据格式
 * 因此后端对数据进行包装
 */
@Data
public class Result {

    private Integer code; //业务码
    private String msg; // 业务消息
    private Object data; // 业务数据

     /*
    所有的业务分为两种情况:
        1. 成功:
            1. 成功了没数据  如:删除
            2. 成功了有返回数据  如:查询
        2. 失败:
            失败时没有数据,返回失败原因
     */

    /**
     * 成功没有数据
     */
    public Result(){
        this.code = CodeMsg.SUCCESS.code;
        this.msg = CodeMsg.SUCCESS.msg;
    }

    /**
     * 成功有数据
     */
    public Result(Object data){
        this();
        this.data = data;
    }

    /**
     * 失败时没有数据,返回失败原因
     */
    public Result(CodeMsg codeMsg){
        this.code = codeMsg.code;
        this.msg = codeMsg.msg;
    }

    /**
     * 兼容异常信息
     *      因为异常中 code 和 msg
     * @param businessException
     */
    public Result(BusinessException businessException){
        this.code = businessException.getCode();
        this.msg = businessException.getMessage();
    }
}

应用 2:switch 兼容枚举类

public void showSeason(Season s){
	switch (s){
	    case SPRING: // 不用写成 s.SPRING, switch 兼容枚举
	        break;
	    case SUMMER:
	        break;
	    case AUTUMN:
	        break;
	    case WINTER:
	        break;
	    default:
	        break;
	}
}

文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/484136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 基础进阶篇(三)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后:成员变量和方法的访问特点五、继承后:方法重写六、继承后:子类构造器的特点七、继承后:子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

机器学习之利用SMO算法求解支持向量机—基于python

大家好,我是带我去滑雪! 本期将讨论支持向量机的实现问题,我们知道支持向量机的学习问题可以化为求解凸二次规划问题。这样的凸二次规划问题具有全局最优解,并且有许多最优化算法可以用于这一问题的求解。但是当训练样本容量很大…

【C++】 探索程序 详细解读程序在运行过程中都发生了什么

目录 头文件-源代码 头文件重复包含 问题 解决方案 程序生成过程 预处理Preprocessi 编译Compilation 汇编Assembly 链接Linking 编译期-运行期 编译期确定 运行期确定 编译期错误 运行期错误 类和对象 宏 宏的其他用法 inline内联 头文件-源代码 头文件&…

Vue简介和常用指令

概述: MVVM思想:视图层数据和数据模型里面的数据发生变化都会影响到另一边的数据,通过ViewModel自动实现。 Vue入门案例 步骤: 上面提到了数据模型和试图层的数据是关联的,此处数据模型里面el的值就是选择了哪一个视…

jQuery引入----练习

jQuery引入----练习 html <!DOCTYPE html> <html><head><title>jQuery引入</title><!-- css样式引入 --><link rel"stylesheet" href"../css/a.css"><!-- jquery函数库引入 --><script type"tex…

Linux基础IO【深入理解文件系统】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、磁盘文件2、磁盘概念2.1、基本结构2.2、数据存储 3、磁盘信息3.1、分区意义…

【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

一.拷贝构造函数 A.概念 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。 B.特性 1. 拷贝构造函数是构造函数的一个重载形式&#xff1b; 2. 拷贝构造函…

shell的基础学习二

文章目录 一、Shell 数组二、Shell 基本运算符三、Shell echo命令四、Shell printf 命令五、Shell test 命令总结 一、Shell 数组 数组中可以存放多个值。Bash Shell 只支持一维数组&#xff08;不支持多维数组&#xff09;&#xff0c;初始化时不需要定义数组大小&#xff08…

【五一创作】【Simulink】基于FCS-MPC的三相并网逆变器控制(Stateflow)

上次写了一篇【Simulink】基于FCS-MPC的三相并网逆变器控制&#xff08;Matlab Function&#xff09;&#xff0c;控制部分用 Matlab Function 写的&#xff0c;因实验室一般用 Stateflow&#xff0c;所以这篇把 Matlab Function 改成 Stateflow. 原理 电路原理图&#xff1a;…

如何批量查询快递的签收状态?

如果一次性网购大量快递&#xff0c;我们就得经常进入快递或网购平台查询物流&#xff0c;随时查看快递单号的物流状态。如果快递公司少&#xff0c;查询起来比较容易&#xff0c;但是如果快递公司很多&#xff0c;每次都要人工查询就是一件很麻烦的事情了。今天&#xff0c;小…

数据库相关知识

一.1 数据库 与Sybase不同&#xff0c;一个用户就对应于一个数据库。 create user CBMAIN identified by "sunline" default tablespace CBMAIN_DATA  -- 表空间 temporary tablespace CBMAIN_TEMP; -- 临时表空间 一.2 表空间 表空间由一个或多个物理文件组成&…

js使用splice方法删除数组元素可能导致的问题

splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组&#xff0c;并以数组形式返回被修改的内容。此方法会改变原数组。 JavaScript 遍历数组并通过 splice 方法删除该数组符合某些条件的元素将会导致哪些问题&#xff1f; 导致的问题 当使用 splice 方法从 …

QT 中的多线程之继承 Thread

文章目录 1. 概述2. UML 类的关系图3. 代码&#xff1a;4. 运行结果及说明5. 结语 1. 概述 任何继承于QThread的线程都是通过继承 QThread 的run函数来实现多线程的&#xff0c;因此&#xff0c;必须重写QThread的run函数&#xff0c;把复杂逻辑写在QThread的run函数中。然后在…

effective c++ item40-44

item40:谨慎的使用多重继承 多重继承带来的符号的歧义性 #include <iostream> #include <vector> using namespace std; class A { public:void f() { cout << "A" << endl; } }; class B { private:void f(); }; class C : public A, publ…

5.5.1哈夫曼树

知识总览&#xff1a; 概念&#xff1a; 结点的权&#xff1a;有某种现实含义的数值&#xff08;如&#xff1a;表示结点的重要性&#xff09; 结点的带权路径长度&#xff1a;从树的根到该结点的路径长度&#xff08;经过的边数&#xff09;与该结点上权值的乘积。 就比如说要…

ETL工具 - Kettle 案例,拉取网络列表数据

一、Kettle 实战案例 上篇文章对 Kettle 的查询、连接、统计、脚本算子进行了介绍&#xff0c;对 Kettle 的大部分算子都应该有了相应的了解&#xff0c;下面我们基于 Kettle 实战案例&#xff0c;拉取 CSDN 博客列表的全部数据&#xff0c;存放至 Excel 文件中。 实验之前先…

NECCS|全国大学生英语竞赛C类|词汇和语法|词汇题|21:03~21:53

词汇题 语法题 情景对话题 目录 一、词汇题 1. 基本词义辨析题 2. 同义词或近义词辨析题 3. 固定搭配 二、常见词组 一、词汇题 1. 基本词义辨析题 appropriate funds 拨款 slum- clearance programme 贫民窟清理计划 reject 拒绝接受&…

DAY 49 tomcat服务配置优化

什么是Tomcat Tomcat是Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的Web应用服务器&#xff0c;是Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及人共同开发而成。 Tomcat属于轻量级应用服务器&#xff0…

外卖项目优化-02-

文章目录 瑞吉外卖项目优化-Day02课程内容前言1. MySQL主从复制1.1 介绍1.2 搭建1.2.1 准备工作1.2.2 主库配置1.2.3 从库配置 1.3 测试 2. 读写分离案例2.1 背景介绍2.2 ShardingJDBC介绍2.3 数据库环境2.4 初始工程导入2.5 读写分离配置2.6 测试 3. 项目实现读写分离3.1 数据…

深入解析PyTorch中的基本数据结构:张量的维度、形状和数据类型

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…