包 (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优化)。