这和Java中的扩展

时间:2013-06-17 13:48:34

标签: java

所以我对过去的测验有疑问。只要C和D在同一个包中,以下代码就会编译

class C {
   int i;
}

class D extends C {
   void m() {
       this.i = 3;
   }
}

有人可以解释为什么这是真的还是假的概念?

5 个答案:

答案 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.iD位于同一个包中,C中的D就有效。否则,即使D extends CC#i不可见,因为它具有default可见性(不会被继承)。

有关所有可见性修饰符及其工作原理,请参阅documentation