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

文章目录
- 🔥Java包(package)全解:从定义、使用到避坑,新手零基础入门到实战)
-
- [📄 摘要](#📄 摘要)
- [📊 本文核心内容思维导图](#📊 本文核心内容思维导图)
- [📦 Java包的核心概念与设计作用](#📦 Java包的核心概念与设计作用)
- [📝 Java包的定义语法与强制规范](#📝 Java包的定义语法与强制规范)
- [🔌 包成员访问与import全量用法](#🔌 包成员访问与import全量用法)
-
- [1. 包成员访问的权限前提🔒](#1. 包成员访问的权限前提🔒)
- [2. import导入的全量用法](#2. import导入的全量用法)
- [3. import语句强制规范⚠️](#3. import语句强制规范⚠️)
- [4. 全限定名(长名)的使用场景📌](#4. 全限定名(长名)的使用场景📌)
- [💻 企业级可运行实战案例](#💻 企业级可运行实战案例)
-
- 需求说明📋
- [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)命令行方式(适配JDK21,Windows/Mac/Linux全平台通用)
- [(2)IDEA 2024.3 方式(企业开发主流)](#(2)IDEA 2024.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)
- [1. 报错信息:`package XXXX does not exist`(包不存在)](#1. 报错信息:
- [❓ 高频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开发中的三大核心痛点:
- ✅ 彻底解决类命名冲突:不同开发者、不同业务模块可以定义同名类,只要归属不同的包,就不会产生任何命名冲突
- ✅ 实现精细化权限控制:通过包边界配合Java访问修饰符,精准控制类与类成员的访问范围,实现代码封装与安全管控
- ✅ 工程化结构化管理代码:按业务功能、模块层级划分包,让整个工程的目录结构清晰明了,便于团队协作、后期维护与扩展
该设计是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版本都必须严格遵循:
- 每个Java源文件中,
package语句有且仅有一条,一个类只能归属一个包 package语句必须放在源文件有效代码的第一行,该行之前仅允许出现空格、单行/多行注释,不能有其他任何业务代码- 包名必须符合Java标识符规范:全小写,禁止数字开头、禁止使用Java关键字、禁止使用下划线与特殊符号
3. 行业通用命名规范(企业开发强制遵循)📋
以下规范来自《阿里巴巴Java开发手册》黄山版,是国内Java开发的行业通用标准:
- 包名必须采用域名反写格式 ,例如
com.github.你的用户名.项目名、com.公司名.业务线.模块名,利用域名的全球唯一性,从根源彻底避免包名冲突 - 包名统一使用小写英文单词,单词之间直接通过
.分隔,禁止使用驼峰命名、下划线、中划线 - 应用包名统一使用
应用名.模块名的层级结构,例如com.baidu.search.core、com.tencent.im.service,按业务功能划分子包 - 禁止使用
java.xxx、javax.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编译器强制校验,违反会直接编译失败:
import语句必须放在package语句之后,类声明之前,顺序不可颠倒- 同一个源文件中可编写多条
import语句,导入多个不同包的类/静态成员 java.lang包下的所有核心类(String、System、Math等),编译器会自动隐式导入,无需手动编写import java.lang.*;- 同一个包内的类互相访问,无需编写
import语句,直接使用类名即可 - 若两个不同包中有同名类,不能同时使用单类型导入,必须使用全限定名区分
4. 全限定名(长名)的使用场景📌
全限定名格式为完整包名.类名,无需import语句,可直接在代码中使用,核心适用场景:
- 不同包中存在同名类,必须通过全限定名区分,避免冲突
- 代码中仅使用一次该类,无需单独导入,简化代码
示例:区分同名的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全平台通用)
- 准备工作:将所有Java文件按照上述目录结构存放,根目录为
java-package-demo - 打开终端/命令提示符,进入
java-package-demo根目录 - 执行编译命令,自动生成包对应的目录结构:
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文件根目录为当前目录,自动创建包对应的多级目录,解决新手最容易遇到的目录不匹配问题。
- 执行运行命令,必须使用全限定类名:
bash
java com.example.test.TestPackage
-
运行结果:
矩形的面积是:100.0
圆形的面积是:78.53981633974483
(2)IDEA 2024.3 方式(企业开发主流)
-
打开IDEA,创建Java项目,JDK选择JDK21
-
在
src目录下创建对应包,IDEA会自动生成匹配的目录结构
IDEA 的中文汉化版本里,把 Java 的Package统一翻译成了「软件包」
-
在对应包下创建Java类,粘贴上述代码

-
右键
TestPackage类,点击Run 'TestPackage.main()',控制台即可输出运行结果
🔄 包开发全流程流程图
否
是
否
是
开始
按照包名规范创建多级目录
编写带package语句的业务类
编写带import语句的测试主类
使用javac -d参数编译所有Java文件
编译是否成功
对照报错解决方案排查问题
使用全限定名运行主类
运行是否成功
完成包的开发与验证
🚨 新手高频报错与解决方案
1. 报错信息:package XXXX does not exist(包不存在)
- 核心原因:
- import语句中的包名拼写错误,和类文件中package声明的包名不一致
- 目录结构和包名不匹配,例如包名是
com.example.graphics,目录却写成com/example/graphic - 依赖的类未提前编译,class文件不存在
- 编译时未使用
-d参数,未生成正确的包目录
- 解决方案:
- 逐字核对import包名和类的package声明完全一致,包括大小写
- 严格按照包名创建目录,包名中的
.对应目录的/ - 按照依赖顺序编译所有Java文件,先编译被依赖的父类、工具类
- 编译时必须添加
-d .参数,让编译器自动生成正确的目录结构
2. 报错信息:Could not find or load main class XXXX(找不到或无法加载主类)
- 核心原因:
- 运行时未使用全限定类名,直接执行
java TestPackage,而非java com.example.test.TestPackage - 编译生成的class文件目录结构和包名不匹配
- 运行时的当前目录错误,未在包根目录执行命令
- 运行时未使用全限定类名,直接执行
- 解决方案:
- 运行主类必须使用
包名.类名的全限定格式 - 重新使用
javac -d .命令编译,确保目录结构正确 - 终端必须进入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'
- 核心原因:
- 要访问的类未添加public修饰符,为default权限,仅允许同包访问
- 一个类在默认包中,另一个类在有名包中,有名包无法导入默认包的类
- 解决方案:
- 给需要跨包访问的类添加public修饰符
- 所有类必须声明package,严禁在正式项目中使用默认包
5. 导入*后仍提示找不到类
- 核心原因:import语句中的
*通配符仅能匹配当前包下的类,无法匹配子包中的类,子包必须单独导入 - 解决方案:单独导入子包的类,例如要使用
com.example.graphics.twod.Point,必须编写import com.example.graphics.twod.Point;,无法通过import com.example.graphics.*;替代
6. 静态导入失效,提示cannot find symbol
- 核心原因:
- 静态导入的成员不是public static修饰的
- 静态导入的类名/成员名拼写错误
- 静态导入的成员是实例成员,非静态成员
- 解决方案:
- 确保要导入的成员是
public static修饰的 - 核对类名与成员名拼写完全正确
- 实例成员无法静态导入,只能通过类实例访问
- 确保要导入的成员是
❓ 高频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.graphics和com.example.graphics.twod是两个完全独立的包,没有任何继承关系,因此子包中的类无法访问父包中default权限的成员,仅能访问public和符合条件的protected成员。
6. 一个Java文件中可以写多个package语句吗?
答:不可以。Oracle官方JLS规范明确规定,每个Java源文件中,package语句有且仅有一条,一个类只能归属一个包,多个package语句会直接编译报错。
📚 官方参考文档
相关资源链接
如果本文对你有帮助,欢迎点赞👍、收藏⭐、评论💬、关注➕!
个人领域:C++/java/Al/软件开发/芯片开发
个人主页:「一名热衷协作的开发者,在构建中学习,期待与你交流技术、共同成长。」座右铭:「与其完美地观望,不如踉跄地启程」


