欢迎光临
我们一直在努力

9.1【Java面向对象进阶】封装、包管理与static关键字:构建健壮程序的三大支柱

1. 包(Package):Java项目的组织艺术

1.1 包的核心概念与价值

包是Java中组织类的容器机制,类似于文件系统中的文件夹结构。它解决了大型项目中类名冲突的问题,同时提高了代码的可读性和可维护性。

包的主要作用:

  • 避免命名冲突:不同包中可以有相同类名的类

  • 提高可读性:按功能模块组织代码结构

  • 访问控制:配合访问修饰符实现权限管理

  • 便于维护:模块化组织便于团队协作

1.2 包的导入与使用实战

方式一:全限定名使用(不推荐)

public class Test {
public static void main(String[] args) {
java.util.Date date = new java.util.Date();
System.out.println(date.getTime());
}
}

方式二:import语句导入(推荐)

import java.util.Date;

public class Test {
public static void main(String[] args) {
Date date = new Date(); // 直接使用类名
System.out.println(date.getTime());
}
}

方式三:导入整个包(谨慎使用)

import java.util.*; // 导入util包下所有类

public class Test {
public static void main(String[] args) {
Date date = new Date();
ArrayList<String> list = new ArrayList<>();
}
}

1.3 自定义包与IDEA实战

包命名规范:

  • 使用公司域名的倒写形式:com.公司名.项目名.模块名

  • 全部小写,使用点号分隔

  • 要有明确的层次结构

在IDEA中创建包的步骤:

  • 右键src目录 → 新建 → 包

  • 输入包名:com.bit.demo1

  • 在包中创建类

  • 实际代码示例

    package com.bit.demo1;

    public class Computer {
    String brand; // 默认包访问权限

    public void start() {
    System.out.println(brand + "电脑开机");
    }
    }

    1.4 常见系统包详解

    包名

    主要功能

    重要类

    java.lang

    语言基础类

    String, Object, System

    java.util

    工具类

    ArrayList, Date, Scanner

    java.io

    输入输出

    File, InputStream

    java.net

    网络编程

    Socket, URL

    java.sql

    数据库操作

    Connection, Statement

    2. 封装(Encapsulation):面向对象的安全卫士

    2.1 封装的核心思想

    封装是面向对象三大特性之首,它像是一个"保护壳",将数据和行为包装在一起,并控制外部的访问权限。

    现实世界类比:

    • 电脑:用户只需操作开关、键盘,不需要了解内部电路

    • 汽车:驾驶员只需操作方向盘、油门,不需要懂发动机原理

    • ATM机:用户只需插卡输入密码,不需要知道资金流转细节

    2.2 封装的代码实现

    未封装的Person类(存在问题):

    public class Person {
    public String name;
    public int age;

    // 数据可以被任意修改,缺乏安全性
    }

    封装后的Person类(推荐):

    public class Person {
    private String name;
    private int age;

    // 公开的接口方法
    public String getName() {
    return name;
    }

    public void setName(String name) {
    if (name != null && !name.trim().isEmpty()) {
    this.name = name;
    }
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    if (age >= 0 && age <= 150) { // 数据验证
    this.age = age;
    }
    }
    }

    2.3 访问限定符深度解析

    Java提供四种访问权限控制:

    访问修饰符

    同一类

    同一包

    不同包子类

    不同包非子类

    private

    default

    protected

    public

    也就是:

    public:哪里都能用

    private:只在同一个类中能使用

    default:也称为“包访问权限修饰符”,也就是不写,能在同一个包中使用

    实际应用示例:

    package com.bit.demo1;

    public class BankAccount {
    private double balance; // 完全私有,最安全
    String accountNumber; // 包内可访问
    protected String owner; // 子类可访问
    public final String BANK_NAME = "BIT Bank"; // 完全公开
    }

    2.4 封装的三大优势

  • 安全性提升:防止数据被非法修改

  • 灵活性增强:内部实现变化不影响外部调用

  • 可维护性提高:代码模块化,易于调试和扩展

  • 3. static关键字:类的共享资源管理器

    3.1 static修饰成员变量

    问题场景:多个学生共享同一个教室

    public class Student {
    private String name;
    private int age;
    public String classRoom = "1-101"; // 每个对象都存储一份,浪费!
    }

    解决方案:使用static

    public class Student {
    private String name;
    private int age;
    public static String classRoom = "1-101"; // 所有对象共享一份
    }

    静态变量的正确访问方式:

    public class Test {
    public static void main(String[] args) {
    // 推荐:通过类名访问
    System.out.println(Student.classRoom);

    // 不推荐:通过对象访问(会产生误导)
    Student stu = new Student();
    System.out.println(stu.classRoom);
    }
    }

    3.2 static修饰成员方法

    静态方法的特点:

    • 属于类,不属于具体对象

    • 不能直接访问非静态成员

    • 不能使用this关键字

    实用示例:工具类

    public class MathUtils {
    // 静态常量
    public static final double PI = 3.14159;

    // 静态方法:计算圆面积
    public static double calculateCircleArea(double radius) {
    return PI * radius * radius;
    }

    // 静态方法:最大值比较
    public static int max(int a, int b) {
    return a > b ? a : b;
    }
    }

    // 使用示例
    double area = MathUtils.calculateCircleArea(5.0);
    int maxValue = MathUtils.max(10, 20);

    3.3 静态成员的生命周期

    特性

    实例变量

    静态变量

    存储位置

    堆内存

    方法区

    生命周期

    随对象创建/销毁

    随类加载/卸载

    访问方式

    对象名.变量名

    类名.变量名

    内存分配

    每个对象独立一份

    所有对象共享一份

    4. 代码块:精细化的初始化控制

    4.1 代码块的四种类型

    4.1.1 普通代码块

    public void someMethod() {
    // 普通代码块:限制变量作用域
    {
    int x = 10;
    System.out.println("x = " + x);
    }
    // System.out.println(x); // 编译错误:x超出作用域
    }

    4.1.2 构造代码块(实例代码块)

    public class Student {
    private String name;
    private int age;

    // 构造代码块:每次创建对象时执行
    {
    this.name = "默认姓名";
    this.age = 18;
    System.out.println("执行构造代码块");
    }

    public Student() {
    System.out.println("执行无参构造方法");
    }
    }

    4.1.3 静态代码块

    public class DatabaseUtil {
    private static String driver;
    private static String url;

    // 静态代码块:类加载时执行一次
    static {
    driver = "com.mysql.cj.jdbc.Driver";
    url = "jdbc:mysql://localhost:3306/test";
    System.out.println("静态代码块执行:数据库配置加载完成");
    }
    }

    4.2 代码块执行顺序实战

    public class ExecutionOrder {
    // 静态变量
    private static String staticField = "静态变量";

    // 实例变量
    private String instanceField = "实例变量";

    // 静态代码块
    static {
    System.out.println("1. 静态代码块: " + staticField);
    }

    // 构造代码块
    {
    System.out.println("3. 构造代码块: " + instanceField);
    }

    // 构造方法
    public ExecutionOrder() {
    System.out.println("4. 构造方法执行");
    }

    public static void main(String[] args) {
    System.out.println("2. main方法开始");
    new ExecutionOrder();
    }
    }

    执行结果:

    1. 静态代码块: 静态变量 2. main方法开始 3. 构造代码块: 实例变量 4. 构造方法执行

    赞(0)
    未经允许不得转载:171主机测评 » 9.1【Java面向对象进阶】封装、包管理与static关键字:构建健壮程序的三大支柱
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址