Java跨文件导入类时报package does not exist包不存在错误
报错核心原因
- import语句语法完全错误
import关键字后必须跟随包名.类名的全限定类名格式,你写的import firstclass.dep;把类firstclass当成了包名、把类中的成员方法dep()当成了要导入的类,编译器自然会去查找名为firstclass的包,找不到就直接抛出包不存在的错误。 - 包声明不匹配,默认包类无法被引用
你的Main类声明在firstclass.dep命名包下,但firstclass类没有写任何package声明,属于默认无名包下的类。Java有硬性规则:默认包下的类无法被任何命名包下的代码导入、引用。 - 访问权限不符合要求
你定义的firstclass类没有加public修饰符,就算包路径配置正确,跨包场景下非public类也无法被访问。 - 未遵循Java包路径与磁盘目录绑定的规则
Java要求声明了package xxx.yyy;的类,必须存放在磁盘路径xxx/yyy/目录下,否则编译器和JVM都无法按路径找到对应的类文件。
Java跨文件/跨包引用类的正确实现
先明确几个基础规则:
- 所有正式代码不要使用默认无名包,所有类都要声明归属到明确的命名包下
- 类名必须遵循大驼峰命名规范(首字母大写),不要用小写开头的类名,避免和包名、变量名混淆
- 被跨包引用的类必须声明为
public - import语句仅支持两种格式:导入单个类
import 包名.类名;、导入指定包下所有类import 包名.*;,不支持导入方法、变量级别内容
可运行的实现示例
1. 搭建匹配包结构的目录
Java的包结构必须和磁盘目录一一对应,项目结构如下:
项目根目录 └── firstclass └── dep ├── Main.java └── FirstClass.java
2. 编写被引用类代码
给FirstClass(原firstclass,修正类名命名规范)加上对应包声明和public修饰:
// FirstClass.java 路径:firstclass/dep/FirstClass.java package firstclass.dep; public class FirstClass { public void dep(){ System.out.println("Hi"); } }
3. 编写主类代码
同包下的类不需要额外写import语句,直接实例化使用即可:
// Main.java 路径:firstclass/dep/Main.java package firstclass.dep; public class Main { public static void main(String[] args) { System.out.println("Hello world!"); final FirstClass abc = new FirstClass(); abc.dep(); } }
4. 编译运行
在项目根目录下执行编译命令:
javac firstclass/dep/*.java
编译完成后执行主类(用全限定类名启动):
java firstclass.dep.Main
就能正常输出:
Hello world! Hi
如果需要把类放在不同包下,只需要给被引用类配置对应包路径、加上public修饰,在主类顶部用正确的全限定类名写import语句即可,比如import firstclass.common.FirstClass;。
内容的提问来源于stack exchange,提问作者Shivi Singla
相关产品推荐
相关产品推荐

