包 (Package)
一、包的基本概念
-
定义 :包本质上是文件系统中的文件夹 ,用于对Java类进行分门别类的管理。
-
作用:
-
组织与管理:将功能相似或相关的类组织在一起,结构清晰。
-
避免命名冲突:不同包中可以存在同名类。
-
访问控制 :与访问权限修饰符(
public,protected, 默认,private)结合,提供不同级别的访问保护。 -
便于维护:项目规模扩大时,良好的包结构能使代码更易理解和维护。
-
二、包名的命名规范
遵循 "公司域名反写 + 项目/模块名 + 功能分类" 的原则。
-
全部英文小写。
-
见名知意。
-
使用点
.分隔层级,对应文件系统的目录结构。 -
示例:
-
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 使用总结
-
final 类:安全、稳定、无需考虑继承的类。
-
final 方法:锁定方法实现,防止被意外修改。
-
final 变量:
-
局部常量:在方法内部使用。
-
成员常量 :必须在声明时初始化 或在所有构造方法中初始化。
-
静态常量 :通常与
static结合使用,如public static final。
-
-
设计思想 :
final体现了"不变性"的设计,能增强代码的安全性、可预测性和性能(便于JVM优化)。