为什么在子类中找不到具有默认访问修饰符的实例变量?

时间:2013-06-05 17:32:11

标签: java

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

但我无法理解为什么这段代码不起作用:

A.java :

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

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

B.java :

同一个包foo中的子类文件,它尝试使用超类a的实例变量class 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可见。 a的实例变量class A具有default访问权限,因此如果class A被同一个包中的其他类扩展,则可以访问它。

2 个答案:

答案 0 :(得分:3)

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

一条线索是您有两条错误消息。通常最好先排序第一个,因为后续消息可能会变成奇数。

答案 1 :(得分:1)

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

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

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