我正在学习类和实例变量的访问修饰符。我知道可以在包中访问默认访问修饰符。
但我无法理解为什么这段代码不起作用:
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
被同一个包中的其他类扩展,则可以访问它。
答案 0 :(得分:3)
看起来你已经将这两个类转储到当前目录(或类似的)中。他们需要使用正确的文件名(foo
)进行调用A.java
。并且您的编译器类路径(或源路径)设置为包含foo
目录的目录。
一条线索是您有两条错误消息。通常最好先排序第一个,因为后续消息可能会变成奇数。
答案 1 :(得分:1)
你的第一个问题是编译器找不到类A.一旦它可以做到,它也可以找到成员a
。您的问题可能与您运行java编译器的方式有关。我相信你是从命令行编译的,不是吗?
在这种情况下,您必须是源根所在的位置。然后运行javac foo/B.java
。这应该没有问题。
继续关注命令行选项-classpath
和-sourcepath
。然后我建议你开始使用IDE。