学习Java39天

包 (Package)

一、包的基本概念

  • 定义 :包本质上是文件系统中的文件夹 ,用于对Java类进行分门别类的管理。

  • 作用:

    1. 组织与管理:将功能相似或相关的类组织在一起,结构清晰。

    2. 避免命名冲突:不同包中可以存在同名类。

    3. 访问控制 :与访问权限修饰符(public, protected, 默认, private)结合,提供不同级别的访问保护。

    4. 便于维护:项目规模扩大时,良好的包结构能使代码更易理解和维护。

二、包名的命名规范

遵循 "公司域名反写 + 项目/模块名 + 功能分类" 的原则。

  • 全部英文小写。

  • 见名知意。

  • 使用点 . 分隔层级,对应文件系统的目录结构。

  • 示例:

    • com.google.android.utils (Google公司的Android项目工具类包)

    • org.apache.commons.io (Apache Commons项目的IO工具包)

    • cn.itcast.student.manager (传智播客的学生管理模块)

三、导包 (Import) 规则

当在一个类中使用另一个包中的类时,需要明确类的来源。

情况 是否需要导包 (import) 示例
使用同一个包下的类 不需要 com.example.A 类中使用 com.example.B
使用 java.lang 包下的类 不需要 如 String, System, Math
使用不同包下的类 需要 在 com.test.Main 中使用 java.util.Date
使用同名类(来自不同包) 不能直接导包,必须使用全类名 同时用到 java.sql.Date 和 java.util.Date

全类名 (Fully Qualified Name) :包名 + 类名。例如:java.util.Scanner

示例:

java

复制代码
package com.example.ui;

// 导包:使用不同包下的类
import java.util.ArrayList;
import java.util.Scanner;

// 使用同名类:必须使用全类名
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());

public class Main {
    public static void main(String[] args) {
        // 同一包下的类,无需导包
        Helper helper = new Helper();
        
        // java.lang 包下的类,无需导包
        String str = "Hello";
        
        // 导包后使用
        Scanner sc = new Scanner(System.in);
        ArrayList<String> list = new ArrayList<>();
    }
}

final 关键字

final 意为"最终的",可以修饰类 、方法 和变量。

一、修饰类

  • 含义 :被 final 修饰的类称为 最终类。

  • 特点 :不能被继承(没有子类)。

  • 目的:防止类被修改或扩展,保证类的安全性和稳定性。

  • 常见示例 :String 类、System 类、Scanner 类等都是 final 类。

java

复制代码
final class MyFinalClass {
    // 类内容
}
// class SubClass extends MyFinalClass {} // 编译错误!不能继承final类

二、修饰方法

  • 含义 :被 final 修饰的方法称为 最终方法。

  • 特点 :不能被重写 (Override)。

  • 目的:防止子类修改该方法的实现,锁定方法行为。

  • 注意 :一个类如果是 final 的,那么它的所有方法都隐式地是 final 的(因为无法被继承)。

java

复制代码
class Parent {
    public final void show() {
        System.out.println("这是最终方法,不能被子类改变");
    }
}
class Child extends Parent {
    // @Override
    // public void show() {} // 编译错误!不能重写final方法
}

三、修饰变量(常量)

  • 含义 :被 final 修饰的变量称为 常量 (Constant)。

  • 核心规则 :只能被赋值一次,之后值不能再改变。

1. 常量的命名规范
  • 单个单词 :全部大写,如 MAX_VALUE, PI

  • 多个单词 :全部大写,单词间用下划线 _ 连接,如 MAX_SPEED, FILE_PATH

  • 目的:提高代码可读性,一眼就能识别出是常量。

2. 常量在开发中的应用

常量的值通常在程序运行期间不会改变,常用作:

  • 系统配置信息:数据库连接字符串、文件路径、默认配置等。

  • 数学或物理常量:π、光速等。

  • 状态码或标志位:成功/失败代码。

  • 好处:集中管理,一处修改,全局生效;避免魔法数字,提高代码可维护性。

java

复制代码
public class AppConfig {
    // 系统配置常量
    public static final String DB_URL = "jdbc:mysql://localhost:3306/mydb";
    public static final int MAX_CONNECTIONS = 100;
    
    // 业务常量
    public static final int ORDER_STATUS_PENDING = 0;
    public static final int ORDER_STATUS_PAID = 1;
}
3. final修饰变量的细节(非常重要)
变量类型 final的作用 示例与说明
基本数据类型变量 存储的数据值不能改变 final int x = 10; x = 20; // 编译错误!
引用数据类型变量 存储的地址值(引用)不能改变 ,但对象内部的状态可以改变 final Student s = new Student("张三"); s = new Student("李四"); // 错误!不能改变引用 s.setName("王五"); // 正确!可以修改对象属性

引用类型final的示例:

java

复制代码
class Person {
    private String name;
    public Person(String name) { this.name = name; }
    public void setName(String name) { this.name = name; }
    public String getName() { return name; }
}

public class Test {
    public static void main(String[] args) {
        final Person p = new Person("Alice");
        
        // p = new Person("Bob"); // 编译错误!不能改变p指向的地址
        
        // 但可以修改p所指向对象的内部状态
        p.setName("Cathy"); // 这是允许的!
        System.out.println(p.getName()); // 输出:Cathy
        
        final int[] arr = {1, 2, 3};
        // arr = new int[]{4,5,6}; // 错误!不能改变引用
        arr[0] = 100; // 正确!可以修改数组元素
        System.out.println(arr[0]); // 输出:100
    }
}

四、final 使用总结

  1. final 类:安全、稳定、无需考虑继承的类。

  2. final 方法:锁定方法实现,防止被意外修改。

  3. final 变量:

    • 局部常量:在方法内部使用。

    • 成员常量 :必须在声明时初始化 或在所有构造方法中初始化。

    • 静态常量 :通常与 static 结合使用,如 public static final。

  4. 设计思想 :final 体现了"不变性"的设计,能增强代码的安全性、可预测性和性能(便于JVM优化)。

相关推荐
懂点Tech8 小时前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
comedate8 小时前
SMLib 的 Examples 导读:PyAPI / SM_API / SMLib 三组示例怎么读
python·cad·smlib·examples·sm_api
云和数据.ChenGuang8 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
小向是个Der8 小时前
嵌入式进阶——MCU上电后的动作
c语言·单片机·mcu·学习·链接脚本
川石课堂软件测试9 小时前
学习软件测试需掌握的一些知识
数据库·python·sql·功能测试·网络协议·mysql·http
美狐美颜SDK开放平台9 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
dtq04249 小时前
C++小案例 - 日志实战
开发语言·c++
万化冥合9 小时前
PyBox屏幕键盘如何辅助演示键盘操作?
python·计算机外设
星夜离尘569 小时前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
车软学堂9 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化