You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

原因分析与解决方法

这个问题和通配符导入本身没毛病,核心是你源文件放错位置了,触发了编译器的校验报错:

  1. 你现在运行编译命令的根目录下,同时有两个和javatesting1相关的东西:
    • 之前编译生成的test1文件夹,里面放着正常的javatesting1.class
    • 直接扔在根目录的javatesting1.java源文件——但这个文件里写了package test1;,按照Java的规矩,这种声明了包的源文件必须放在叫test1的子文件夹里,不能直接放根目录
  2. 你用全限定名import test1.javatesting1的时候,编译器会直接去test1文件夹里找对应的class文件,根本不会管根目录下放错位置的源文件,所以能正常跑。
  3. 你换成通配符import test1.*的时候,编译器会多做一步校验:扫描当前目录下有没有同名的Java源文件做一致性检查,这时候就逮住了根目录下放错的javatesting1.java,直接报bad source file的错,后面继承父类、访问变量的报错都是这个错带出来的连锁反应。

具体解决步骤

  • 把根目录下那个放错的javatesting1.java要么移到test1文件夹里,要么直接删掉——你已经编译生成了正确的class文件,不需要这个根目录下的源文件
  • 重新执行编译命令:javac javatesting2.java
  • 这时候不管你用全限定名导入还是通配符导入,都能正常运行

新手踩坑提醒:Java有强制规则,源文件的存放目录必须和文件里写的包声明完全对应。只要你写了package xxx;,这个Java文件就必须放在和xxx同名的文件夹里,不然很容易出这类莫名其妙的编译错误。


内容的提问来源于stack exchange,提问作者firstuser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 02:06:00