java面向对象进阶进阶篇--《包和final》

news2024/11/14 14:47:08

一、前言

今天还是面向对象相关知识点的分享,包是写小型项目时不可或缺的存在,final关键字用的地方不算太多。idea会提示我们导包,有时会自动导包,确实十分方便。但是我们也不能不会自己去导包。

面向对象篇不出意外的话本周就要结束了。希望大家多多支持。

 

二、包

在Java中,包(Package)是一种组织和管理类及其他资源的机制。

1. 组织类和资源

包提供了一种层次化的结构,用于组织Java类和其他资源文件。通过包,可以将相关联的类和接口组织在一起,形成一个逻辑上的单元。

2. 命名空间管理

包在Java中还用于管理命名空间(Namespace)。每个包中的类都具有唯一的全限定名(Fully Qualified Name),这包括包名和类名。这种命名空间的分隔避免了不同包中类名冲突的问题。

3. 访问控制

Java中的包也与访问控制密切相关。类可以通过publicprotectedprivate和默认访问(不使用关键字修饰)来定义其可见性。包访问权限(default)指的是同一个包中的其他类可以访问该类的包级私有成员。

4. 包路径

包在文件系统中以文件夹的形式存在。例如,包com.example.util通常对应于文件系统中的路径com/example/util/。这种结构使得Java编译器和虚拟机可以找到并加载正确的类文件。

5. 包的声明

在Java源文件的开头,通过package语句来声明类所属的包。例如:

package com.example.util;

public class StringUtil {
    // 类定义
}

6. 导入其他包

Java中使用import语句来导入其他包中的类,以便在当前文件中使用这些类而不必使用其全限定名。例如:

package com.example.app;

import com.example.util.StringUtil;

public class MyApp {
    public static void main(String[] args) {
        String message = "Hello, World!";
        String reversed = StringUtil.reverse(message);
        System.out.println(reversed);
    }
}

7. 标准库和第三方库

Java标准库(Java Standard Library)和第三方库通常也通过包的形式来组织。这使得开发人员可以轻松地使用和管理大量的类和资源。

注:使用其他类的规则

  • 使用同一个包中的类时,不需要导包。
  • 使用java.lang包中的类时,不需要导包。(例如:String)
  • 其他情况都需要导包
  • 如果同时使用两个包中的同名类,需要用全类名

示例: 

 使用其他包中的类,千万别忘了导包!!!

 

三、final

在Java中,final关键字可以用来修饰类、方法和变量,具有不同的作用和语义,final 关键字在Java中用于限制类、方法和变量的修改或继承,是Java语言中的重要保护和优化机制之一。

1. final 修饰类

当用 final 修饰一个类时,表示这个类是最终类,即不能被继承。这样的类不能有子类。示例:

final class FinalClass {
    // 类定义
}

2. final 修饰方法

当用 final 修饰一个方法时,表示这个方法是最终方法,不能被子类重写(override)。这在设计模式中有时用于确保方法的实现不被修改或覆盖。示例:

class Parent {
    public final void finalMethod() {
        // 方法定义
    }
}

class Child extends Parent {
    // 编译错误:finalMethod() 在 Parent 中已经是 final,不能被重写
}

3. final 修饰变量

在Java中,final 可以修饰变量,有以下几种情况:

  • 修饰成员变量(字段):如果用 final 修饰一个成员变量,表示这个变量是一个常量,只能被赋值一次。如果是基本数据类型,一旦被赋值后就不能再改变其值;如果是引用类型,则表示该引用不能再指向另一个对象,但对象本身是可以修改的。示例:

    class MyClass {
        final int constantVar = 10; // 常量成员变量
    
        public void changeVar() {
            // 编译错误:不能修改 final 变量的值
            constantVar = 20;
        }
    }
    
  • 修饰局部变量:在方法或者代码块内部使用 final 修饰局部变量,表示该变量只能赋值一次。这在多线程环境或者匿名内部类中比较有用。示例:

    public void method() {
        final int localVar = 100; // 常量局部变量
    
        // 编译错误:不能再次赋值
        localVar = 200;
    }
    

 

其他注意事项:

  • final 修饰的类不能被继承,这种类的设计主要用于安全或性能考虑,避免被修改或者继承后破坏其设计。

  • final 修饰的方法不能被重写,这可以确保方法的行为在子类中不会被修改。

  • final 修饰的变量在赋值后不能再次修改其值,确保其值的不可变性。

示例:

方法

变量

四、常量

在Java中,常量指的是在程序运行期间值不会发生改变的变量。常量是程序中一种重要的编程元素,它们提供了一种稳定的、不可变的值,有助于代码的健壮性和可维护性。

使用 final 关键字

通过 final 关键字可以定义常量,可以是类常量(静态常量)或实例常量(成员变量)。final 常量必须在声明时进行初始化,并且不能再次赋值。示例:

  • 类常量示例:

    public class Constants {
        public static final int MAX_SIZE = 100;
        public static final String APP_NAME = "MyApp";
    }
    

    在其他类中可以直接通过 Constants.MAX_SIZEConstants.APP_NAME 来访问这些常量。

  • 实例常量示例:

    public class MyClass {
        public final int MAX_CONNECTIONS = 10;
        public final String DEFAULT_NAME = "John Doe";
    }
    

    这些实例常量在每个实例化的对象中都有自己的副本,但值是不可变的。

2. 使用 static final 定义常量

在类级别定义常量时,通常使用 static final 关键字组合。这种方式定义的常量在整个类的生命周期内只有一个副本,所有实例共享。示例:

public class Config {
    public static final String DATABASE_URL = "jdbc:mysql://localhost:3306/mydatabase";
    public static final int MAX_THREADS = 50;
}

这样定义的常量可以通过 Config.DATABASE_URLConfig.MAX_THREADS 访问。

3. 枚举类型

Java中的枚举类型也可以用来定义常量,每个枚举常量都是一个实例对象,它们是不可修改的。示例:

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

在代码中使用枚举常量时,例如 Day.MONDAY,它表示一个固定的、不可变的值。

4. 字面值常量

Java中的字面值常量指的是直接写在代码中的数值或字符串,它们在编译时就已经确定了其值,不会发生改变。例如:

int num = 42; // 42 是一个字面值常量
String name = "Alice"; // "Alice" 是一个字面值常量

这些常量的值在程序运行期间是不可修改的。

使用常量的好处:

  • 代码可读性和维护性:通过命名常量,可以提高代码的可读性和可维护性,减少了魔法数值或字符串的使用。

  • 安全性和稳定性:常量一旦定义后不能被修改,可以在一定程度上保证程序的安全性和稳定性。

注:记录的地址值不能发生改变,内部属性可以改变。

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

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

相关文章

【线性代数】矩阵变换

一些特殊的矩阵 一,对角矩阵 1,什么是对角矩阵 表示将矩阵进行伸缩(反射)变换,仅沿坐标轴方向伸缩(反射)变换。 2,对角矩阵可分解为多个F1矩阵,如下: 二&a…

python打包exe文件-实现记录

1、使用pyinstaller库 安装库: pip install pyinstaller打包命令标注主入库程序: pyinstaller -F.\程序入口文件.py 出现了一个问题就是我在打包运行之后会出现有一些插件没有被打包。 解决问题: 通过添加--hidden-importcomtypes.strea…

“微软蓝屏”事件引发的深度思考:网络安全与系统稳定性的挑战与应对

“微软蓝屏”事件暴露了网络安全哪些问题? 近日,一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件,不仅成为科技领域的热点新闻,更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件,源于美国电脑安全…

【Vue3】工程创建及目录说明

【Vue3】工程创建及目录说明 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…

全网最全最详细的C++23 标准详解:核心语言改进与新特性

1. 简介 C23 是由 C 标准委员会最新发布的标准,旨在进一步提升 C 语言的功能和开发效率。作为一项重要的编程语言标准更新,C23 引入了多个关键的新特性和改进,使开发者能够编写更高效、简洁和安全的代码。 与 C20 相比,C23 的变…

3112.力扣每日一题7/18 Java 迪杰斯特拉(Dijkstra)算法

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 迪杰斯特拉(Dijkstra)算法 解题思路 解题过…

C++学习指南(三)——模板

欢迎来到繁星的CSDN。本期内容主要包括模板template。 目录 一、什么是模板? 二、函数模板 模板的定义方式 模板的实例化(确定参数的类型) 隐式实例化 显式实例化 实例化顺序 三、类模板和模板类 类模板的实例化 一、什么是模板&#xff1…

智慧职校就业管理:开启校园招聘会新模式

在智慧职校的就业管理系统中,校园招聘会的出现,为学生们提供了一个展示自我、探寻职业道路的舞台,同时也为企业搭建了一座直面未来之星的桥梁。这一功能,凭借其独特的优势与前沿的技术,正在重新定义校园与职场之间的过…

2024中国大学生算法设计超级联赛(1)

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,彩笔ACMer一枚。 🏀所属专栏:杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 📢📢📢传送门 A - 循环位移解…

python-爬虫实例(5):将进酒,杯莫停!

目录 前言 将进酒,杯莫停! 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批,当然要尝试爬取王者荣耀的东西啦。 将进…

萝卜快跑突然就火了,背后发生了什么?

近日,百度旗下的自动驾驶出行平台“萝卜快跑”突然在网络上火了起来,成为热门话题。那么,这背后到底发生了什么? 1. 数字误传引发热议 首先,一些误传的数字在传播中起到了推波助澜的作用。例如,百度在2023…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

PCL 批量处理点云文件

系列文章目录 文章目录 系列文章目录前言一、PCL是什么?二、配置PCL环境三、使用步骤1.引入库2.主函数 总结 前言 点云处理时往往会需要对多个点云进行处理,比如在预处理,保存点云时。下面提供一个简单的点云批量转换例子,PCD文件…

MongoDB 文档存储

安装 下载: Download MongoDB Community Server | MongoDB 说明: 现在基本都安装的是4.4以后的版本。安装完成后使用 mongod 来查看是否安装成功 会输出一堆内容 而如果想要操作数据库,则需要安装一个工具,mongosh-2.2.12-x64.m…

JavaSE从零开始到精通(七) - Stream流

1. 概述 Java 8引入了Stream API,它提供了一种高效且易于使用的处理集合数据的方式。Stream流可以被认为是一种高级的迭代器,允许我们在集合上进行复杂的操作,例如过滤、映射、排序、归约等,而这些操作可以链式调用,形…

C# 开发监控方法执行耗时

MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。 这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入计时逻辑,从而在方法调…

Python内存管理:引用计数与垃圾回收

✨ 内容: 在Python中,内存管理是一个重要且常常被忽视的话题。了解Python如何管理内存,不仅能帮助我们编写高效的代码,还能避免潜在的内存泄漏问题。今天,我们将通过一个实际案例,深入探讨Python的内存管理…

MIT6.824(6.5840) Lab1笔记+源码

文章目录 其他人的内容,笔记写的更好,思路可以去看他们的MapReduceworkermapreduce coordinatorrpc纠错 源码worker.gocoordinator.gorpc.go 原本有可借鉴的部分 mrsequential.go,多看几遍源码 其他人的内容,笔记写的更好&#xf…

如何实现ORACLE19c 安装包DIY

最近一直忙,本想每周有更新的,但老板一句话,就得去干活,想实现这个愿望,看来真的很难,做一天好人容易,要一辈子做好人,难。所以,看到德哥,尹总监,…

言语理解与表达

** 言语理解与表达 1.逻辑填空 2.语句表达 3.阅读理解