Java使用*通配符导入类失败,全限定名导入正常的编译问题求解
问题描述
本人是Java新手,遇到导入相关问题求帮助:
- 编写import语句使用*通配符时出现异常
- 已执行
javac -d . javatesting1.java命令编译javatesting1类,成功在test1包下生成对应.class文件 - 文件夹结构:当前执行目录下存放有javatesting2.java源文件、编译生成的test1包目录(内含javatesting1.class),同时根目录下还保留有原始的javatesting1.java源文件
- 编译使用通配符导入的
javatesting2时,出现如下报错:
javac javatesting2.java javatesting2.java:2: error: cannot access javatesting1 class testingclass extends javatesting1 ^ bad source file: .\javatesting1.java file does not contain class javatesting1 Please remove or make sure it appears in the correct subdirectory of the sourcepath. javatesting2.java:6: error: cannot find symbol System.out.println(a); ^ symbol: variable a location: class testingclass 2 errors
相关代码
javatesting1.java(原父类代码,声明在test1包下)
package test1; public class javatesting1 { protected int a=45; int b=78; }
javatesting2.java(同目录下的调用类代码)
// 当把import test1.javatesting1改成import test1.*时,无法访问javatesting1类 import test1.javatesting1; class testingclass extends javatesting1 { public void meth1() { System.out.println(a); // System.out.println(b); } } public class javatesting2 { public static void main(String [] args) { testingclass obj=new testingclass(); obj.meth1(); } }
原因分析与解决方法
这个问题和通配符导入本身没毛病,核心是你源文件放错位置了,触发了编译器的校验报错:
- 你现在运行编译命令的根目录下,同时有两个和
javatesting1相关的东西:- 之前编译生成的
test1文件夹,里面放着正常的javatesting1.class - 直接扔在根目录的
javatesting1.java源文件——但这个文件里写了package test1;,按照Java的规矩,这种声明了包的源文件必须放在叫test1的子文件夹里,不能直接放根目录
- 之前编译生成的
- 你用全限定名
import test1.javatesting1的时候,编译器会直接去test1文件夹里找对应的class文件,根本不会管根目录下放错位置的源文件,所以能正常跑。 - 你换成通配符
import test1.*的时候,编译器会多做一步校验:扫描当前目录下有没有同名的Java源文件做一致性检查,这时候就逮住了根目录下放错的javatesting1.java,直接报bad source file的错,后面继承父类、访问变量的报错都是这个错带出来的连锁反应。
具体解决步骤
- 把根目录下那个放错的
javatesting1.java要么移到test1文件夹里,要么直接删掉——你已经编译生成了正确的class文件,不需要这个根目录下的源文件 - 重新执行编译命令:
javac javatesting2.java - 这时候不管你用全限定名导入还是通配符导入,都能正常运行
新手踩坑提醒:Java有强制规则,源文件的存放目录必须和文件里写的包声明完全对应。只要你写了
package xxx;,这个Java文件就必须放在和xxx同名的文件夹里,不然很容易出这类莫名其妙的编译错误。
内容的提问来源于stack exchange,提问作者firstuser
相关产品推荐
相关产品推荐

