所以我有一个过去测验的问题。只要 C 和 D 在同一个包中,下面的代码就可以编译
class C {
int i;
}
class D extends C {
void m() {
this.i = 3;
}
}
有人可以解释为什么这是对还是错的概念吗?
所以我有一个过去测验的问题。只要 C 和 D 在同一个包中,下面的代码就可以编译
class C {
int i;
}
class D extends C {
void m() {
this.i = 3;
}
}
有人可以解释为什么这是对还是错的概念吗?
它有一个默认的 访问修饰符。
访问修饰符:
public
世界级的可见性(所有类,无处不在),protected
像默认值一样,但对扩展类也可见,default
(实际上你没有写以上三个中的任何一个) -包级别的可见性。private
类级别的可见性。由于您的字段i
没有明确写入访问修饰符,因此暗示它具有默认访问修饰符。并且在包装内可见。
有关更多信息,请阅读控制对类成员的访问。
关于this
关键字 - 它只是对当前对象的参考。
由于当前对象的类扩展了C
,它有它的方法和字段。并且由于i
在整个包中可见,实例D
可以使用this
.
因为类具有默认值,意味着包可见性。有关可见性的更多信息,请参见此处。
阅读此内容:它清楚地解释了您要寻找的内容:
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
这是因为默认可见性是包。因此包中的所有其他类都可以看到该变量。并且由于您正在扩展 C ,因此 D 继承了变量 i。
是真的。
由于您没有明确指定C#i
可见性,这意味着它具有default
可见性,这意味着只有包可见性。它与protected
不继承此类字段(或方法或类或其他任何东西)的方式不同,因此default
可见性比protected
.
所以只要和在同一个包中,做this.i
in是有效的。否则,即使,也是不可见的,因为它具有可见性(不被继承)。D
C
D
D extends C
C#i
default
请参阅所有可见性修饰符及其工作原理的文档。