学习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.Datejava.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优化)。

相关推荐
智购科技无人售货机工厂4 分钟前
2026自动售货机防拆机物理安全设计:从安全螺丝到结构互锁的工程实践~YH
android·网络·驱动开发·python·单片机·安全·云原生
2401_8685347811 分钟前
校园网规划与设计
python·pygame
老当益壮梁奶奶11 分钟前
Linux软件编程学习笔记(九):消息队列、共享内存与信号灯详解
linux·c语言·笔记·学习
MartinYeung514 分钟前
[论文学习]激活差异揭示后门:SAE架构对比研究
人工智能·学习·架构
小猴子爱上树15 分钟前
跨境电商AI批量图片翻译工具,视频字幕翻译免费试用
人工智能·python·音视频
开开心心就好16 分钟前
电子教鞭工具支持画框写字插图片功能齐全
android·开发语言·前端·javascript·人工智能·pdf·html
小雪崩16 分钟前
嵌入式学习 day35:进程间通信-消息队列、共享空间及有名信号量
linux·c语言·学习
zx_7414848126 分钟前
【Python入门】爬虫实战:Requests + XPath 从基础到实战
开发语言·爬虫·python
高洁0127 分钟前
Teacher Forcing技术解析
人工智能·python·深度学习·transformer·知识图谱
2601_9620652536 分钟前
从零创建一个 Django 项目
后端·python·django