【发布时间】:2019-03-04 19:34:17
【问题描述】:
注意:在您错误地将其标记为重复之前,请阅读全文。
所以我不确定这是不是写的,我找不到一个简单的图表来回答它: - 如果您在超类中有一个 PUBLIC、PROTECTED 或 PACKAGE PRIVATE 方法或字段,并且子类在同一个包中,那么包外部或内部的类是否可以通过新的子类对象访问这些方法或字段如果字段或方法是私有的,那么它不能? - 如果您在超类中有一个 PUBLIC 或 PROTECTED 方法或字段,并且子类位于不同的包中,那么包外部或内部的类是否可以通过新的子类对象访问这些方法或字段,如果字段或方法是 PACKAGE PRIVATE,或 PRIVATE 则不能?
换句话说,所有访问组合(32 种组合):public、protected、package private,以及 private 用于方法、字段,用于相同或不同包中的子类,由在一个类中创建子类对象的类访问相同或不同包中的类。 请注意,此问题与“重复”之间的主要区别在于,我想知道在包内/包外使用非子类进行访问。不仅仅是子类中的东西。重复项不够具体,因为有些小规则不像 4 x 2 表那么简单。例如,对于受保护的,包外的子类不能在超类对象上运行超类方法,只能在子类对象上运行。 “重复”中没有回答类似的小问题。
在将其标记为重复之前,你们可以阅读整个该死的东西吗?我解释了为什么不是,但懒惰的人不会阅读全文,也不会回答问题。
【问题讨论】:
-
为清楚说明它不是重复的部分,最后部分进行了编辑
-
副本中的 4x5 表涵盖了使用访问修饰符可能发生的所有场景。
-
“例如,对于protected,包外的子类不能对超类对象运行超类方法,只能对子类对象运行。”包可以调用父受保护的方法。你混淆了“受保护”和“默认”吗?
-
@Tom 我不会混淆“受保护”和“默认”你在包 A 中类 Foo。你在包 B 中有类 Bar 扩展了 Foo。你在类 bar 中创建新的 Foo。 Foo f = new Foo();您不能使用 f 对象从类 Foo 运行受保护的方法。
-
@Tom 您可以在 Bar 类中创建一个 Bar 对象 b 并从中运行 Foo 方法。
标签: java inheritance subclass