Java的包、final关键字以及代码块

Java的包、final关键字以及代码块

一、包

包的作用

​ 包就是文件夹,用来管理各种不同功能的Java类

包名的书写规则

​ 公司域名反写 + 包的作用,需要全部英文小写,见名知意

什么是全类名

​ 包名 + 类名

使用其他类的规则

  • 使用同一个包中的类时,不需要导包(import + 包名)
  • 使用java.lang包(java的核心包)中的类时,不需要导包
  • 其他情况都需要导包
  • 如果同时使用两个包中的同名类,需要用全类名

二、final关键字

final 关键字在 Java 中具有多种用途,具体来说:

  • final修饰方法:最终方法,不能被重写
  • final修饰类:最终类,不能被继承
  • final修饰变量:是常量,不能被修改
    • 基本数据类型:变量的值不能修改
    • 引用数据类型:地址值不能修改,内部的属性值可以修改

1.修饰变量

  • 当一个变量被声明为 final,它的值一旦被赋值后就不能再更改。对于基本数据类型,这意味着它的值不可变;对于引用数据类型,它的引用不可变,但可以修改引用的对象的内容。
public class test {private final static int P = 5;// 相当于c语言中的宏定义public static void main(String[] args) {// 基本数据类型:变量的值不能修改final double PI = 3.145926;// PI = 3.14;  报错,final修饰则无法更改// 引用数据类型:地址值不能修改,内部的属性值可以修改final int[] arr = {1, 3, 6, 4, 9, 10};arr[2] = 100;arr[4] = 200;for (int i : arr) {System.out.println(i);}final Student s = new Student("小明", 20);System.out.println(s.getName() + ", " + s.getAge());s.setName("王五");System.out.println(s.getName() + ", " + s.getAge());}
}

2.修饰方法

  • final 修饰的方法不能被子类重写。这样可以保护方法的实现,确保其行为不会被改变。
class Base {final void show() {System.out.println("Final method in Base");}
}class Derived extends Base {// void show() { // 编译错误,不能重写 final 方法//     System.out.println("Trying to override");// }
}

3.修饰类

  • final 修饰的类不能被继承。这确保了类的实现不被改变,适用于某些设计模式或需要严格控制类的场合。
final class FinalClass {// 类的实现
}// class AnotherClass extends FinalClass { // 编译错误,不能继承 final 类
// }

final修饰出的常量:

​ 在实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性

常量的命名规范

  • 单个单词:全部大写
  • 多个单词:全部大写,单词之间用下划线隔开

细节

  • final修饰的变量是基本数据类型:那么变量存储的数据值不能发生改变
  • final修饰的变量是引用数据类型:那么变量存储的地址值不能发生改变,对象内部的可以改变

三、代码块

  • 局部代码块
  • 构造代码块
  • 静态代码块

局部代码块:

​ 写在方法里面的代码块,提前结束变量的生命周期,且局部代码块里面的变量也就只能在局部代码块里面使用(用于节约内存,目前不怎么使用)

public static void main(String[] args) {{int a = 10;System.out.println(a);}// System.out.println(a); 会报错
}

构造代码块:

​ 是在一个类中写在成员位置的代码块,当要创建本类对象时,它则会 优先于构造方法执行,因此可以把多个构造方法重复的代码写在构造代码块

public class Student {private String name;private int age;// 构造代码块:// 1.写在成员位置的代码块// 2.作用:可以把多个构造方法中重复的代码抽取出来// 3.执行时间:我们再创建本类对象时会先执行构造代码块再执行构造方法{System.out.println("准备创建类了");}public Student() {System.out.println("空参构造");}public Student(String name, int age) {this.name = name;this.age = age;System.out.println("全参构造");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}class Test {public static void main(String[] args) {// 创建对象Student s = new Student();Student s2 = new Student("张三", 20);}
}

输出为结果

在这里插入图片描述

目前构造代码块也不怎么使用了,面对构造方法中重复的代码则可以用以下两个方法取代它:

  • 使用this关键字
public class Student {private String name;private int age;public Student() {this(null, 0);System.out.println("空参构造");}public Student(String name, int age) {System.out.println("开始创建对象了");this.name = name;this.age = age;System.out.println("全参构造");}
}
  • 调用外部的方法
public class Student {private String name;private int age;public Student() {调用方法();System.out.println("空参构造");}public Student(String name, int age) {调用方法();this.name = name;this.age = age;System.out.println("全参构造");}
}

静态代码块:

格式static{}

特点:需要通过 static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次

使用场景:在类加载的时候,做一些数据初始化的时候使用(例:在一个平台登录时刚开始只执行一次登录或注册操作,之后的一些功能可以重复出现)

定义与执行时机

  • 静态代码块在类被加载到 JVM 时执行,并且只会执行一次。它在所有的构造函数和实例初始化块之前运行。

示例

class Example {static {// 静态代码块System.out.println("Static block executed.");}public Example() {System.out.println("Constructor executed.");}public static void main(String[] args) {new Example();new Example();}
}

在这个例子中,静态代码块会在 main 方法之前执行,只会输出一次 “Static block executed.”,而构造函数会在每次创建对象时执行。

用途

  • 初始化静态变量:可以用来初始化类的静态变量。
  • 执行一些逻辑:可以用来执行一些需要在类加载时运行的逻辑,比如读取配置文件、注册驱动等。

可以有多个静态代码块

  • 如果类中有多个静态代码块,它们的执行顺序是从上到下的。
class Example {static {System.out.println("First static block.");}static {System.out.println("Second static block.");}public static void main(String[] args) {// 输出顺序将是:// First static block.// Second static block.}
}

与实例代码块的区别

  • 实例代码块在创建对象时执行,每次创建对象都会执行,而静态代码块只在类加载时执行一次。

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

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

相关文章

使用 Java 实现从搜索引擎批量下载图片

在进行一些数据收集、图像处理或研究工作时,我们可能需要从网络上批量下载高质量的图片。本文将介绍如何使用 Java 和 Jsoup 库,从搜索引擎中抓取图片,解析详情页并过滤出高质量图片。通过以下几个步骤,您可以自动化这个图片收集的…

【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单

在数字技术迅猛发展的今天,人工智能(AI)的应用已经渗透到了我们生活的方方面面,从日常的语音助手到复杂的图像处理,无不体现着AI技术的魅力。特别是在娱乐和创意领域,AI技术更是展现出了惊人的潜力。其中&a…

Ubuntu下安装和配置MySQL5.7教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 在ubuntu下安装MySQL数据库 查看操作系统版本 ​编辑 添加 MySQL APT 源 访问下载页面并下载发布包 安装发布包 安装MySQL 查看MySQL状态 开启自启动 登…

Java中常见的异常类型

1、Exception和Error有什么区别? 首先Exception和Error都是继承于Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。 Except…

Unity的gRPC使用之实现客户端

应用背景:本想Unity调用C的dll库获取一些数据资源,但是由于自己调用的C库模块化处理的不太理想,众多dll之间相互依赖,使得在调用dll的时候,会忽略一些dll的缺失,使Unity项目报错,故想到了使用gR…

GPU-主板-内存-硬盘-CPU-电源分类及区别总结大全

一、背景 用了7年的笔记本,现在感觉它实在是扛不住了,中间自己缝缝补补坚持到现在,把机械硬盘换成了固态,加装了内存条。换过2次还是3次风扇(不知道为啥坏的,高转速时哧哧响),换过一…

【JavaSE练习题】数组的创建和使用

数组的创建和使用 奇数位于偶数之前冒泡排序两数之和只出现一次的数字多数元素存在连续三个奇数的数组 奇数位于偶数之前 调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。 如数组:[1,2,3,4,5,6] 调整后可能是:[1, 5, 3, 4, 2,…

使用Vue.js和Vuex构建可维护的前端应用

使用Vue.js和Vuex构建可维护的前端应用 Vue.js简介 安装Vue.js 使用npm安装 使用CDN引入 创建Vue项目 安装Vuex 初始化Vuex Store 在Vue组件中使用Store Vuex模块化 Vuex命名空间 Vuex插件 Vuex热重载 Vuex持久化状态 Vuex调试工具 Vuex的高级用法 异步Actions 中间件 Vuex的…

代码随想录 -- 动态规划 -- 01背包理论基础(滚动数组)

46. 携带研究材料(第六期模拟笔试) 思路: dp[j]含义:容量为j的背包的最大价值。 递推公式: 如果放不下第i个物品:dp[j]dp[j];如果能放得下第i个物品:dp[j]max(dp[j],dp[j-weight…

小新学习k8s第四天之发布管理

一、金丝雀发布(灰度发布) Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。 ①比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的…

自然语言生成揭秘:AI 如何创作文本内容

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 AI工具集1:大厂AI工具【共23款…

机器人领域中的scaling law:通过复现斯坦福机器人UMI——探讨数据规模化定律(含UMI的复现关键)

前言 在24年10.26/10.27两天,我司七月在线举办的七月大模型机器人线下营时,我们带着大家一步步复现UMI「关于什么是UMI,详见此文:UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)」&…

Flink + Kafka 实现通用流式数据处理详解

Flink Kafka 实现通用流式数据处理详解 在大数据时代,实时数据处理和分析成为企业快速响应市场变化、提高业务效率和优化决策的关键技术。Apache Flink和Apache Kafka作为两个重要的开源项目,在数据流处理领域具有广泛的应用。本文将深入探讨Flink和Ka…

项目模块1~12总结:服务器大模块梳理

一、思维导图 二、设计思路 1、各种回调函数梳理 服务器里面包含了监听套接字和监听到的通信套接字(新连接),我们要对这两种套接字进行设置回调函数,其中监听套接字里面只要设置读回调,通信套接字要设置5种回调&…

【django】Django REST Framework 序列化与反序列化详解

目录 1、什么是序列化和反序列化? 2、Django REST Framework中的序列化和反序列化 3、安装与配置(第10章是从零开始) 3.1 安装 3.2 配置 4、基本使用 4.1 创建序列化器 4.2 使用序列化器(将数据序列化返回给前端&#xff…

三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库

官网文档:https://fastapi.tiangolo.com/zh/tutorial/sql-databases/ SQL (关系型) 数据库 FastAPI不需要你使用SQL(关系型)数据库。 但是您可以使用任何您想要的关系型数据库。 这里我们将看到一个使用SQLModel的示例。 SQLModel是在SQLAlchemy和Pydantic的基础…

C++中使用seekg函数进行随机读写

seekg(off type offset, ios::seekdir origin ); //作用:设置输入流的位置 这个函数有俩个参数,第一个是表示偏移量,第二个是表示相对位置 infile.seekg(-50, infile.end);//表示从文件结尾开始,向文件开头方向读50个字节 参数 …

2-137 基于matlab的sigmoid函数的变步长自适应语音信号增强

基于matlab的sigmoid函数的变步长自适应语音信号增强,与传统LMS相对比,比较不同的变步长函数去噪效果,并基于较好的去噪算法分析不同变步长中参数变化对降噪的影响。程序已调通,可直接运行。 下载源程序请点链接:2-13…

GBDT 算法的原理推导

GBDT的全称为梯度提升决策树(gradient boosting decision tree),其基模型(弱分类器)为CART决策树,针对分类问题的基模型为二叉分类树,对应梯度提升模型就叫GBDT;针对回归问题的基模型…

有效利用关键词研究工具提升网站流量的策略

内容概要 在当前信息泛滥的时代,关键词研究工具的重要性愈发突出。它们不仅能帮助我们识别和分析用户搜索行为,还能够精准地为网站内容定位,确保我们能够吸引并留住目标受众。关键词研究工具通过提供大量的数据,帮助站长和营销策…