【发布时间】: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