所以我对过去的测验有疑问。只要C和D在同一个包中,以下代码就会编译
class C {
int i;
}
class D extends C {
void m() {
this.i = 3;
}
}
有人可以解释为什么这是真的还是假的概念?
答案 0 :(得分:5)
它有一个默认 访问修饰符。
访问修饰符:
public
世界级知名度(所有课程,无处不在),protected
就像默认一样,但对扩展类也是可见的,default
(您实际上不会写上面三个中的任何一个) - 包级别可见性。private
班级知名度。由于您的字段i
没有明确写入访问修饰符,因此暗示它具有默认访问模式。并且在包装内可见。
有关详情,请参阅Controlling Access to Members of a Class。
关于this
关键字 - 它只是对当前对象的重新声明。
由于当前对象的类扩展了C
,因此它有方法和字段。由于i
在整个包中都可见,因此D
的实例可以使用this
访问它。
答案 1 :(得分:1)
因为类具有默认值,所以意味着包可见性。 有关可见性的更多信息,请参阅here。
答案 2 :(得分:0)
阅读本文:它清楚地解释了您的目标:
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
答案 3 :(得分:-1)
这是因为默认的可见性是包。所以包中的所有其他类都可以看到变量。因为你正在扩展C,所以D继承了变量i。
答案 4 :(得分:-2)
确实如此。
由于您未明确指定C#i
可见性,因此这意味着它具有default
可见性,这意味着仅包可见性。与protected
不同的是,这些字段(或方法或类或其他)不会被继承,因此default
可见性比protected
更具限制性。
只要this.i
和D
位于同一个包中,C
中的D
就有效。否则,即使D extends C
,C#i
不可见,因为它具有default
可见性(不会被继承)。
有关所有可见性修饰符及其工作原理,请参阅documentation。