-8

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

class C {
   int i;
}

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

有人可以解释为什么这是对还是错的概念吗?

4

5 回答 5

5

它有一个默认的 访问修饰符

访问修饰符:

  • public世界级的可见性(所有类,无处不在),
  • protected像默认值一样,但对扩展类也可见,
  • default(实际上你没有写以上三个中的任何一个) -包级别的可见性。
  • private类级别的可见性。

由于您的字段i没有明确写入访问修饰符,因此暗示它具有默认访问修饰符。并且在包装内可见。

有关更多信息,请阅读控制对类成员的访问


关于this关键字 - 它只是对当前对象的参考。

由于当前对象的类扩展了C,它有它的方法和字段。并且由于i在整个包中可见,实例D可以使用this.

于 2013-06-17T13:51:50.657 回答
1

因为类具有默认值,意味着包可见性。有关可见性的更多信息,请参见此处

于 2013-06-17T13:50:30.663 回答
0

阅读此内容:它清楚地解释了您要寻找的内容:

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2013-06-17T13:52:04.677 回答
-1

这是因为默认可见性是包。因此包中的所有其他类都可以看到该变量。并且由于您正在扩展 C ,因此 D 继承了变量 i。

于 2013-06-17T13:51:13.837 回答
-2

是真的。

由于您没有明确指定C#i可见性,这意味着它具有default可见性,这意味着只有包可见性。它与protected不继承此类字段(或方法或类或其他任何东西)的方式不同,因此default可见性比protected.

所以只要和在同一个包中,做this.iin是有效的。否则,即使,也是不可见的,因为它具有可见性(不被继承)。DCDD extends CC#idefault

请参阅所有可见性修饰符及其工作原理的文档

于 2013-06-17T13:54:17.007 回答