【问题标题】:Why instance variable with default access modifier can't be found in subclass?为什么在子类中找不到具有默认访问修饰符的实例变量?
【发布时间】:2013-06-05 17:32:10
【问题描述】:

我正在学习类和实例变量的访问修饰符。我知道可以在包中访问默认访问修饰符。

但我不明白为什么这段代码不起作用:

A.java :

这是一个超类文件,只有一个具有default 访问权限的实例变量。

package foo;
public class A {
    int a = 10;
}

B.java :

同一包foo中的子类文件,它尝试使用超类class A的实例变量a

package foo;
class B extends A {
    public static void main(String[] args) {
        B b = new B();
        b.test();
    }
    public void test(){
        System.out.println("Variable is : " + a);
    }
}

这个程序应该可以工作,但我收到了cannot find symbol 错误。

B.java:2: error: cannot find symbol
class B extends A {
                ^
    symbol: class A
B.java:8: error: cannot find symbol
                System.out.println("Variable is : " + a);
                                                      ^
    symbol:     variable a
    location:   class B
2 errors

这个错误的原因是什么,因为根据带有default访问修饰符的规则实例变量可以在包中访问。在这里,class A 是公开的,因此对class B 可见。 class A 的实例变量a 具有default 访问权限,因此如果class A 被同一包内的其他类扩展,则可以访问它。

【问题讨论】:

  • 似乎你有一个编译器告诉你的更严重的问题:“找不到符号”,“A类”
  • @greedybuddha:不,这根本不是问题。问题是编译器甚至不知道 A 是什么......
  • @greedybuddha 我认为如果子类和超类共享同一个包,则子类可以看到默认访问修饰符。通过超类的引用和继承的两种方法!!!
  • 我的评论是因为我没有看到它们在同一个包中。我也错过了cannot find symbol。我的评论已被删除
  • 它可以正常工作,我的输出是Variable is : 10。您有错误,因为编译器找不到 A 类。显然,如果没有 A 类,您将无法读取它的字段。

标签: java


【解决方案1】:

看起来您已将两个类都转储到当前目录(或类似目录)中。他们需要以正确的文件名 (A.java) 命名为 foo。并且您的编译器类路径(或源路径)设置为包含foo 目录的目录。

提示您有两条错误消息。通常最好先对第一个进行排序,因为后续消息可能会变得奇怪。

【讨论】:

  • 谢谢!以及为什么我必须从foo 目录编译?
  • @parth javac 需要能够通过路径名找到类。如果你有很多文件,你不一定要编译它们只是为了找到正确的类。
【解决方案2】:

您的第一个问题是编译器找不到类 A。一旦它可以找到它,它也可以找到成员 a。您的问题可能在于您运行 java 编译器的方式。我相信你是从命令行编译的,不是吗?

在这种情况下,您必须位于源根目录的位置。然后运行javac foo/B.java。这应该没有问题。

当您继续注意命令行选项-classpath-sourcepath。然后我建议你开始使用 IDE。

【讨论】:

  • 是的,我正在从命令行编译。是的,你是对的,问题是我编译程序的方式。我试过javac foo/B.java 并且它有效。嘿!我是 Java 新手,你能告诉我为什么我也必须上foo 进行编译。谢谢!!
  • @parth,恭喜。很高兴知道你能做到这一点。原因是当你在 root 时你总是必须编译。但是编译器找不到依赖项。你必须指定foo,因为这是你的包名,否则编译器找不到你的类。
  • 知道了!!我正在从包目录内部编译。但是我必须始终从包目录外部进行编译,以便编译器可以访问每个文件,对吗?现在,我必须选择一个 IDE,因为它变成了一个愚蠢的问题。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2011-02-01
  • 1970-01-01
  • 2016-10-11
  • 2011-01-04
相关资源
最近更新 更多