Java包(package)全解:从定义、使用到避坑,新手零基础入门到实战


🌸你好呀!我是断弦承露
🌟感谢陪伴~ 小白博主在线求友
🌿 跟着小白学/Java/软件设计/鸿蒙开发/芯片开发
📖专栏汇总:
《软件设计师》专栏 | 《Java》专栏 | 《 RISC-V 处理器实战》专栏 | 《Flutter鸿蒙实战》专栏 | 《React Native开发》专栏 ------|CSDN|------

文章目录

  • 🔥Java包(package)全解:从定义、使用到避坑,新手零基础入门到实战![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2ecd9ad5444049d1b42677eb09e7f96f.png#pic_center))
    • [📄 摘要](#📄 摘要)
    • [📊 本文核心内容思维导图](#📊 本文核心内容思维导图)
    • [📦 Java包的核心概念与设计作用](#📦 Java包的核心概念与设计作用)
    • [📝 Java包的定义语法与强制规范](#📝 Java包的定义语法与强制规范)
      • [1. package语句核心语法模板📌](#1. package语句核心语法模板📌)
      • [2. 编译器强制规范(违反直接编译失败)⚠️](#2. 编译器强制规范(违反直接编译失败)⚠️)
      • [3. 行业通用命名规范(企业开发强制遵循)📋](#3. 行业通用命名规范(企业开发强制遵循)📋)
      • [4. package-info.java文件详解📑](#4. package-info.java文件详解📑)
    • [🔌 包成员访问与import全量用法](#🔌 包成员访问与import全量用法)
    • [💻 企业级可运行实战案例](#💻 企业级可运行实战案例)
      • 需求说明📋
      • [1. 工程目录结构搭建](#1. 工程目录结构搭建)
      • [2. 核心类代码实现](#2. 核心类代码实现)
        • [(1)包说明文件 package-info.java(graphics包)](#(1)包说明文件 package-info.java(graphics包))
        • [(2)图形抽象父类 Graphic.java](#(2)图形抽象父类 Graphic.java)
        • [(3)二维坐标点类 Point.java(twod子包)](#(3)二维坐标点类 Point.java(twod子包))
        • [(4)矩形实现类 Rectangle.java](#(4)矩形实现类 Rectangle.java)
        • [(5)圆形实现类 Circle.java](#(5)圆形实现类 Circle.java)
        • [(6)测试主类 TestPackage.java](#(6)测试主类 TestPackage.java)
      • [3. 编译与运行全流程](#3. 编译与运行全流程)
    • [🔄 包开发全流程流程图](#🔄 包开发全流程流程图)
    • [🚨 新手高频报错与解决方案](#🚨 新手高频报错与解决方案)
      • [1. 报错信息:`package XXXX does not exist`(包不存在)](#1. 报错信息:package XXXX does not exist(包不存在))
      • [2. 报错信息:`Could not find or load main class XXXX`(找不到或无法加载主类)](#2. 报错信息:Could not find or load main class XXXX(找不到或无法加载主类))
      • [3. 报错信息:`class XXXX is public, should be declared in a file named XXXX.java`](#3. 报错信息:class XXXX is public, should be declared in a file named XXXX.java)
      • [4. 报错信息:`cannot access XXXX, class XXXX in unnamed module of loader 'app'`](#4. 报错信息:cannot access XXXX, class XXXX in unnamed module of loader 'app')
      • [5. 导入`*`后仍提示找不到类](#5. 导入*后仍提示找不到类)
      • [6. 静态导入失效,提示`cannot find symbol`](#6. 静态导入失效,提示cannot find symbol)
    • [❓ 高频FAQ问答](#❓ 高频FAQ问答)
      • [1. 包名为什么要使用域名反写?有强制规范吗?](#1. 包名为什么要使用域名反写?有强制规范吗?)
      • [2. 为什么java.lang包下的类不用手动import?](#2. 为什么java.lang包下的类不用手动import?)
      • [3. 同一个包下的类互相访问,需要写import吗?](#3. 同一个包下的类互相访问,需要写import吗?)
      • [4. 使用import * 会影响程序的运行性能吗?](#4. 使用import * 会影响程序的运行性能吗?)
      • [5. 子包中的类可以访问父包中default权限的类吗?](#5. 子包中的类可以访问父包中default权限的类吗?)
      • [6. 一个Java文件中可以写多个package语句吗?](#6. 一个Java文件中可以写多个package语句吗?)
    • [📚 官方参考文档](#📚 官方参考文档)

🔥Java包(package)全解:从定义、使用到避坑,新手零基础入门到实战

📄 摘要

本文基于JDK21最新长期支持版本,严格遵循Oracle官方Java语言规范与《阿里巴巴Java开发手册》,系统拆解Java中package包的核心设计思想、定义语法、行业命名规范、import全量用法,搭配可直接复制运行的企业级实战案例。同时整理新手开发中90%会遇到的高频报错与解决方案、高频FAQ问答,帮助零基础开发者从原理到实践,彻底掌握Java包的开发规范与使用技巧,一站式规避入门阶段的所有常见陷阱。


📊 本文核心内容思维导图

Java包package全解
核心概念与设计作用
包的定义语法与规范
包成员访问与import全用法
企业级可运行实战案例
新手高频报错解决方案
高频FAQ问答
解决类命名冲突
实现精细化权限控制
结构化管理工程代码
package语法模板
行业通用命名规范
编译器强制规则
package-info.java详解
包访问权限前提
单类精准导入
包全量导入
单静态导入
全量静态导入
全限定名直接使用
工程目录结构搭建
核心类代码实现
编译与运行全流程
包不存在报错
主类加载失败报错
权限访问拒绝报错
类名与文件名不匹配报错
静态导入失效报错
包名规范相关问题
import用法相关问题
权限与包边界相关问题


📦 Java包的核心概念与设计作用

Java是纯面向对象的编程语言,中大型项目往往会包含成百上千个类文件,包(package)本质上是Java提供的类命名空间与工程化代码组织结构,类比我们电脑操作系统中的文件夹------不同文件夹中可以存放同名文件,同一文件夹内不允许同名文件,完美解决了Java开发中的三大核心痛点:

  1. 彻底解决类命名冲突:不同开发者、不同业务模块可以定义同名类,只要归属不同的包,就不会产生任何命名冲突
  2. 实现精细化权限控制:通过包边界配合Java访问修饰符,精准控制类与类成员的访问范围,实现代码封装与安全管控
  3. 工程化结构化管理代码:按业务功能、模块层级划分包,让整个工程的目录结构清晰明了,便于团队协作、后期维护与扩展

该设计是Java模块化开发的核心基础,Oracle官方《Java Language Specification》SE 21版本与国内企业通用的《阿里巴巴Java开发手册》规范完全符合该设计。


📝 Java包的定义语法与强制规范

1. package语句核心语法模板📌

Java通过package关键字声明当前源文件中的类归属的包,语法格式如下,所有Java类的包声明必须严格遵循该模板

java 复制代码
package 一级包名[.二级包名[.三级包名...]];
语法字段逐行解释
语法字段 含义与规范
package Java固定关键字,用于包声明,必须全小写,不可修改
一级/二级/三级包名 包的层级结构,通过英文句号.分隔,严格对应操作系统中的多级目录结构 ,例如package com.example.graphics; 必须对应磁盘目录com/example/graphics
结尾分号; Java语句强制结束符,必须添加,否则会直接编译报错
基础可运行示例
java 复制代码
// 声明当前类归属com.example.graphics包,必须放在代码有效行的第一行
package com.example.graphics;

/**
 * 圆形类,归属graphics图形包
 * public修饰:允许不同包的类实例化与访问
 */
public class Circle {
    // 类的业务实现
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // 计算圆形面积
    public double area() {
        return Math.PI * radius * radius;
    }
}

上述代码中,Circle类会成为com.example.graphics包的public成员,编译后会自动存放在classPath/com/example/graphics目录中。

⚠️ 特别注意 :若源文件未编写package语句,该类会被自动归入无名包(默认包) 。默认包无固定路径,类仅能在当前目录访问,正式企业项目中严禁使用默认包,会导致代码无法被其他有名包导入、无法扩展,且不符合工程化规范。

2. 编译器强制规范(违反直接编译失败)⚠️

以下规则为Java编译器强制校验,来自Oracle官方JLS规范,任何JDK版本都必须严格遵循:

  1. 每个Java源文件中,package语句有且仅有一条,一个类只能归属一个包
  2. package语句必须放在源文件有效代码的第一行,该行之前仅允许出现空格、单行/多行注释,不能有其他任何业务代码
  3. 包名必须符合Java标识符规范:全小写,禁止数字开头、禁止使用Java关键字、禁止使用下划线与特殊符号

3. 行业通用命名规范(企业开发强制遵循)📋

以下规范来自《阿里巴巴Java开发手册》黄山版,是国内Java开发的行业通用标准:

  • 包名必须采用域名反写格式 ,例如com.github.你的用户名.项目名com.公司名.业务线.模块名,利用域名的全球唯一性,从根源彻底避免包名冲突
  • 包名统一使用小写英文单词,单词之间直接通过.分隔,禁止使用驼峰命名、下划线、中划线
  • 应用包名统一使用应用名.模块名的层级结构,例如com.baidu.search.corecom.tencent.im.service,按业务功能划分子包
  • 禁止使用java.xxxjavax.xxx作为包名前缀,该前缀为Oracle官方保留,使用会导致安全异常与权限拒绝

4. package-info.java文件详解📑

Oracle官方JLS规范中明确了package-info.java的作用,是企业开发中包管理的必备文件,新手极易忽略:

  • 作用:专门用于存放包级别的文档注释、包级别的注解,是整个包的说明文档入口
  • 规范:必须放在对应包的目录下,文件内仅包含package声明,不能包含任何类定义
  • 示例:
java 复制代码
/**
 * 图形计算核心包,包含所有图形的抽象定义与基础实现
 * @author 开发者名称
 * @date 2026-04-10
 * @version 1.0.0
 */
package com.example.graphics;

🔌 包成员访问与import全量用法

1. 包成员访问的权限前提🔒

包中的类、接口、类成员方法与属性,统称为包成员 。只有被public修饰的成员,才能被不同包的类访问。Java的4种访问修饰符与包的边界关系如下表,新手必须牢记:

访问修饰符 同包同类 同包不同类 不同包子类 不同包非子类
public
protected
default(无修饰符)
private

📌 核心避坑提示 :default(包私有)权限的成员,仅允许同包内的类访问,不同包的类即使通过import导入,也完全无法访问,这是新手最容易踩的权限陷阱。

2. import导入的全量用法

要在包外访问其他包的public成员 ,Java提供了两种核心方式:通过import语句导入后使用短名访问、直接使用全限定名访问。

import语句用于引入其他包中的类/接口、静态成员,让代码中可以直接使用类名/静态成员名(短名),无需写完整包路径,Oracle官方JLS规范中定义了4种import用法,全覆盖讲解如下:

(1)单类型精准导入(企业开发首选✅)

语法模板:

java 复制代码
import 完整包名.类名;
  • 核心优势:明确导入需要的类,避免同名类冲突,编译效率更高,代码可读性更强,是企业开发的强制规范
  • 示例:导入com.example.graphics包中的Circle
java 复制代码
// 精准导入指定类
import com.example.graphics.Circle;

// 导入后可直接使用类名创建对象,无需写完整包名
public class Test {
    public static void main(String[] args) {
        Circle myCircle = new Circle(5.0);
        System.out.println("圆形面积:" + myCircle.area());
    }
}
(2)按需类型全量导入

语法模板:

java 复制代码
import 完整包名.*;
  • 语法说明:*为通配符,代表匹配该包下的所有public类,重点:不包含子包中的类
  • 适用场景:同一个包下需要导入多个类时,简化代码
  • 示例:导入com.example.graphics包下的所有类
java 复制代码
// 全量导入包下所有public类
import com.example.graphics.*;

// 可直接使用该包下的任意public类
public class Test {
    public static void main(String[] args) {
        Circle myCircle = new Circle(5.0);
        Rectangle myRect = new Rectangle(10, 20);
    }
}
(3)单静态成员导入

语法模板:

java 复制代码
import static 完整包名.类名.静态成员名;
  • 作用:导入指定类的单个静态成员(静态常量、静态方法),导入后可直接使用成员名,无需写类名
  • 适用场景:频繁使用某个类的单个静态方法/常量时,简化代码
  • 示例:导入Math类的PI常量与sqrt方法
java 复制代码
// 单静态成员导入
import static java.lang.Math.PI;
import static java.lang.Math.sqrt;

public class Test {
    public static void main(String[] args) {
        // 直接使用静态成员名,无需写Math.前缀
        System.out.println("圆周率:" + PI);
        System.out.println("16的平方根:" + sqrt(16));
    }
}
(4)按需静态全量导入

语法模板:

java 复制代码
import static 完整包名.类名.*;
  • 作用:导入指定类的所有public静态成员,导入后可直接使用所有静态成员名,无需写类名
  • 示例:导入Math类的所有静态成员
java 复制代码
// 全量静态导入
import static java.lang.Math.*;

public class Test {
    public static void main(String[] args) {
        // 直接使用Math类的所有静态方法与常量
        System.out.println("圆周率:" + PI);
        System.out.println("最大值:" + max(10, 20));
        System.out.println("绝对值:" + abs(-100));
    }
}

3. import语句强制规范⚠️

以下规则为Java编译器强制校验,违反会直接编译失败:

  1. import语句必须放在package语句之后,类声明之前,顺序不可颠倒
  2. 同一个源文件中可编写多条import语句,导入多个不同包的类/静态成员
  3. java.lang包下的所有核心类(String、System、Math等),编译器会自动隐式导入,无需手动编写import java.lang.*;
  4. 同一个包内的类互相访问,无需编写import语句,直接使用类名即可
  5. 若两个不同包中有同名类,不能同时使用单类型导入,必须使用全限定名区分

4. 全限定名(长名)的使用场景📌

全限定名格式为完整包名.类名,无需import语句,可直接在代码中使用,核心适用场景:

  1. 不同包中存在同名类,必须通过全限定名区分,避免冲突
  2. 代码中仅使用一次该类,无需单独导入,简化代码
示例:区分同名的Date类
java 复制代码
public class Test {
    public static void main(String[] args) {
        // 无需import,直接通过全限定名创建不同包的同名类对象
        java.util.Date utilDate = new java.util.Date();
        java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
    }
}

💻 企业级可运行实战案例

需求说明📋

实现一个图形工具包,按功能划分子包,包含二维坐标点类、图形抽象父类、矩形实现类、圆形实现类,完成图形面积计算功能,通过包实现代码结构化管理,最终通过测试类验证功能,所有代码适配JDK21,可直接复制运行。

1. 工程目录结构搭建

包名严格对应目录结构,整体结构如下,新手必须严格按照该结构创建文件:

复制代码
java-package-demo/
└── com/
    └── example/
        ├── graphics/
        │   ├── package-info.java
        │   ├── Graphic.java
        │   ├── Rectangle.java
        │   └── Circle.java
        ├── graphics/twod/
        │   ├── package-info.java
        │   └── Point.java
        └── test/
            └── TestPackage.java
  • com.example.graphics:图形核心功能主包
  • com.example.graphics.twod:二维图形子包
  • com.example.test:测试功能包

2. 核心类代码实现

所有代码均适配JDK21,逐行附带注释说明

(1)包说明文件 package-info.java(graphics包)
java 复制代码
/**
 * 图形计算核心包,包含所有图形的抽象定义与基础实现类
 * @author 断弦承露
 * @date 2026-04-10
 * @version 1.0.0
 */
package com.example.graphics;
(2)图形抽象父类 Graphic.java
java 复制代码
// 声明当前类归属的包,必须放在代码第一行
package com.example.graphics;

/**
 * 图形抽象父类,定义所有图形的统一规范
 * public修饰:允许不同包的类继承与访问
 */
public abstract class Graphic {
    /**
     * 抽象方法:计算图形面积
     * 强制所有子类实现具体的面积计算逻辑
     * @return 图形面积的double类型结果
     */
    public abstract double area();
}
(3)二维坐标点类 Point.java(twod子包)
java 复制代码
// 声明当前类归属的二维图形子包
package com.example.graphics.twod;

/**
 * 二维坐标点类,存储平面内的x、y坐标
 * public修饰:允许不同包的类实例化与访问
 */
public class Point {
    // x:二维平面横轴坐标值,int类型,public修饰允许外部直接访问
    public int x;
    // y:二维平面纵轴坐标值,int类型,public修饰允许外部直接访问
    public int y;

    /**
     * 构造方法:初始化坐标点的x、y值
     * @param x 横轴输入坐标
     * @param y 纵轴输入坐标
     */
    public Point(int x, int y) {
        // this关键字区分成员变量与方法入参
        this.x = x;
        this.y = y;
    }
}
(4)矩形实现类 Rectangle.java
java 复制代码
// 声明当前类归属的图形主包
package com.example.graphics;

// 导入子包中的Point类,跨包访问必须先导入
import com.example.graphics.twod.Point;

/**
 * 矩形类,继承Graphic抽象父类,实现面积计算逻辑
 * public修饰:允许不同包的类实例化与访问
 */
public class Rectangle extends Graphic {
    // leftTopPoint:矩形左上角坐标点,Point类型,private修饰实现封装
    private Point leftTopPoint;
    // width:矩形宽度,int类型,代表水平方向长度
    private int width;
    // height:矩形高度,int类型,代表垂直方向长度
    private int height;

    /**
     * 构造方法:初始化矩形的坐标、宽度与高度
     * @param leftTopPoint 矩形左上角坐标点
     * @param width 矩形宽度,必须大于0
     * @param height 矩形高度,必须大于0
     */
    public Rectangle(Point leftTopPoint, int width, int height) {
        this.leftTopPoint = leftTopPoint;
        this.width = width;
        this.height = height;
    }

    /**
     * 重写父类的area方法,实现矩形面积计算
     * 面积公式:宽度 * 高度
     * @return 矩形面积计算结果
     */
    @Override
    public double area() {
        return width * height;
    }
}
(5)圆形实现类 Circle.java
java 复制代码
// 声明当前类归属的图形主包
package com.example.graphics;

// 静态导入Math类的PI常量,简化代码
import static java.lang.Math.PI;

/**
 * 圆形类,继承Graphic抽象父类,实现面积计算逻辑
 * public修饰:允许不同包的类实例化与访问
 */
public class Circle extends Graphic {
    // radius:圆形的半径,double类型,private修饰实现封装
    private double radius;

    /**
     * 构造方法:初始化圆形的半径
     * @param radius 圆形半径,必须大于0
     */
    public Circle(double radius) {
        this.radius = radius;
    }

    /**
     * 重写父类的area方法,实现圆形面积计算
     * 面积公式:π * 半径²
     * @return 圆形面积计算结果
     */
    @Override
    public double area() {
        return PI * radius * radius;
    }
}
(6)测试主类 TestPackage.java
java 复制代码
// 声明当前测试类归属的测试包
package com.example.test;

// 导入需要使用的类
import com.example.graphics.Circle;
import com.example.graphics.Rectangle;
import com.example.graphics.twod.Point;

/**
 * 包功能测试主类,包含程序入口main方法
 */
public class TestPackage {
    /**
     * main方法:Java程序固定入口,JVM会自动执行该方法
     * @param args 命令行传入的参数数组
     */
    public static void main(String[] args) {
        // 1. 测试矩形面积计算
        // 创建左上角坐标点(2,3)
        Point leftTop = new Point(2, 3);
        // 创建矩形对象,宽度10,高度10
        Rectangle rect = new Rectangle(leftTop, 10, 10);
        // 计算面积并打印结果
        System.out.println("矩形的面积是:" + rect.area());

        // 2. 测试圆形面积计算
        // 创建半径为5的圆形对象
        Circle circle = new Circle(5.0);
        // 计算面积并打印结果
        System.out.println("圆形的面积是:" + circle.area());
    }
}

3. 编译与运行全流程

(1)命令行方式(适配JDK21,Windows/Mac/Linux全平台通用)
  1. 准备工作:将所有Java文件按照上述目录结构存放,根目录为java-package-demo
  2. 打开终端/命令提示符,进入java-package-demo根目录
  3. 执行编译命令,自动生成包对应的目录结构:
bash 复制代码
javac -d . com/example/graphics/Graphic.java com/example/graphics/Rectangle.java com/example/graphics/Circle.java com/example/graphics/twod/Point.java com/example/test/TestPackage.java

📌 命令说明:-d . 指定编译生成的class文件根目录为当前目录,自动创建包对应的多级目录,解决新手最容易遇到的目录不匹配问题。

  1. 执行运行命令,必须使用全限定类名:
bash 复制代码
java com.example.test.TestPackage
  1. 运行结果:

    矩形的面积是:100.0
    圆形的面积是:78.53981633974483

(2)IDEA 2024.3 方式(企业开发主流)
  1. 打开IDEA,创建Java项目,JDK选择JDK21

  2. src目录下创建对应包,IDEA会自动生成匹配的目录结构

IDEA 的中文汉化版本里,把 Java 的Package统一翻译成了「软件包」

  1. 在对应包下创建Java类,粘贴上述代码

  2. 右键TestPackage类,点击Run 'TestPackage.main()',控制台即可输出运行结果


🔄 包开发全流程流程图





开始
按照包名规范创建多级目录
编写带package语句的业务类
编写带import语句的测试主类
使用javac -d参数编译所有Java文件
编译是否成功
对照报错解决方案排查问题
使用全限定名运行主类
运行是否成功
完成包的开发与验证


🚨 新手高频报错与解决方案

1. 报错信息:package XXXX does not exist(包不存在)

  • 核心原因:
    1. import语句中的包名拼写错误,和类文件中package声明的包名不一致
    2. 目录结构和包名不匹配,例如包名是com.example.graphics,目录却写成com/example/graphic
    3. 依赖的类未提前编译,class文件不存在
    4. 编译时未使用-d参数,未生成正确的包目录
  • 解决方案:
    1. 逐字核对import包名和类的package声明完全一致,包括大小写
    2. 严格按照包名创建目录,包名中的.对应目录的/
    3. 按照依赖顺序编译所有Java文件,先编译被依赖的父类、工具类
    4. 编译时必须添加-d .参数,让编译器自动生成正确的目录结构

2. 报错信息:Could not find or load main class XXXX(找不到或无法加载主类)

  • 核心原因:
    1. 运行时未使用全限定类名,直接执行java TestPackage,而非java com.example.test.TestPackage
    2. 编译生成的class文件目录结构和包名不匹配
    3. 运行时的当前目录错误,未在包根目录执行命令
  • 解决方案:
    1. 运行主类必须使用包名.类名的全限定格式
    2. 重新使用javac -d .命令编译,确保目录结构正确
    3. 终端必须进入com目录所在的根目录执行运行命令

3. 报错信息:class XXXX is public, should be declared in a file named XXXX.java

  • 核心原因:Java语法强制规定,一个.java文件中只能有一个public类,且public类的类名必须和文件名完全一致(包括大小写)
  • 解决方案:确保文件名和public类名完全一致,例如Rectangle类必须放在Rectangle.java文件中,一个文件只写一个public类

4. 报错信息:cannot access XXXX, class XXXX in unnamed module of loader 'app'

  • 核心原因:
    1. 要访问的类未添加public修饰符,为default权限,仅允许同包访问
    2. 一个类在默认包中,另一个类在有名包中,有名包无法导入默认包的类
  • 解决方案:
    1. 给需要跨包访问的类添加public修饰符
    2. 所有类必须声明package,严禁在正式项目中使用默认包

5. 导入*后仍提示找不到类

  • 核心原因:import语句中的*通配符仅能匹配当前包下的类,无法匹配子包中的类,子包必须单独导入
  • 解决方案:单独导入子包的类,例如要使用com.example.graphics.twod.Point,必须编写import com.example.graphics.twod.Point;,无法通过import com.example.graphics.*;替代

6. 静态导入失效,提示cannot find symbol

  • 核心原因:
    1. 静态导入的成员不是public static修饰的
    2. 静态导入的类名/成员名拼写错误
    3. 静态导入的成员是实例成员,非静态成员
  • 解决方案:
    1. 确保要导入的成员是public static修饰的
    2. 核对类名与成员名拼写完全正确
    3. 实例成员无法静态导入,只能通过类实例访问

❓ 高频FAQ问答

1. 包名为什么要使用域名反写?有强制规范吗?

答:域名在全球范围内是唯一的,使用域名反写作为包名,可以彻底避免不同开发者、不同厂商之间的包名冲突,从根源解决类命名冲突问题。

国内企业开发强制遵循《阿里巴巴Java开发手册》,核心规范为:包名全小写,使用域名反写作为前缀,单词之间通过.分隔,不使用驼峰与下划线,按业务模块划分子包。

2. 为什么java.lang包下的类不用手动import?

答:java.lang是Java的核心语言包,包含了String、System、Thread等基础核心类,Java编译器会为所有源文件隐式导入java.lang.*;,该规则来自Oracle官方Java语言规范,所有JDK版本均遵循该规则。

参考官方文档:https://docs.oracle.com/javase/specs/jls/se21/html/jls-7.html#jls-7.3

3. 同一个包下的类互相访问,需要写import吗?

答:不需要。同一个包下的类归属同一个命名空间,直接使用类名即可互相访问,仅当访问不同包的类时,才需要import语句或全限定名。

4. 使用import * 会影响程序的运行性能吗?

答:不会。import语句仅在编译阶段生效,编译器会根据import语句定位到对应的类,编译生成class文件后,import语句就会被消除,运行阶段无任何性能影响。

但不推荐滥用import *,会导致同名类冲突,降低代码可读性,企业开发推荐按需导入单个类,现代IDE会自动优化import语句。

5. 子包中的类可以访问父包中default权限的类吗?

答:不可以。Java中的包没有父子继承关系,com.example.graphicscom.example.graphics.twod是两个完全独立的包,没有任何继承关系,因此子包中的类无法访问父包中default权限的成员,仅能访问public和符合条件的protected成员。

6. 一个Java文件中可以写多个package语句吗?

答:不可以。Oracle官方JLS规范明确规定,每个Java源文件中,package语句有且仅有一条,一个类只能归属一个包,多个package语句会直接编译报错。


📚 官方参考文档

相关资源链接

Oracle官方Java SE 21 包规范文档

Oracle官方Java语言规范SE 21版

Oracle官方包与模块详细规范

阿里巴巴Java开发手册GitHub开源地址

如果本文对你有帮助,欢迎点赞👍、收藏⭐、评论💬、关注➕!

个人领域:C++/java/Al/软件开发/芯片开发
个人主页:「一名热衷协作的开发者,在构建中学习,期待与你交流技术、共同成长。」

座右铭:「与其完美地观望,不如踉跄地启程」

相关推荐
TE-茶叶蛋1 小时前
结合登录页-PHP基础知识点解析
android·开发语言·php
身如柳絮随风扬2 小时前
SpringMVC 异常处理?Spring 父子容器?
java·spring·mvc
WangJunXiang62 小时前
Python网络编程
开发语言·网络·python
guhy fighting2 小时前
new Map,Array.from,Object.entries的作用以及使用方法
开发语言·前端·javascript
lsx2024062 小时前
操作系统统计
开发语言
鬼先生_sir2 小时前
Spring AI Alibaba 用户使用手册
java·人工智能·springai
有梦想的小何2 小时前
从0到1搭建可靠消息链路:RocketMQ重试 + Redis幂等实战
java·redis·bootstrap·rocketmq
_下雨天.2 小时前
Python 网络编程
开发语言·网络·python
大数据新鸟2 小时前
HashMap、Hashtable、ConcurrentHashMap 核心对比
java