【问题标题】:Method Overriding: In Extended classes方法覆盖:在扩展类中
【发布时间】:2019-01-15 19:55:51
【问题描述】:

在下面给出的代码中,我理解第一部分,当我调用 c1.show() 时,它只会覆盖公共和受保护的部分。但是我不明白当我调用 c2.show() 时,为什么它也覆盖了 pac()。

  package P1;

  public class Base {
  private void pri( ) { System.out.println(“Base.pri()”); }
          void pac( ) { System.out.println(“Base.pac()”); }
  protected void pro( ) { System.out.println(“Base.pro()”); }
  public void pub( ) { System.out.println(“Base.pub()”); }

       public final void show( ) {
         pri();  pac();  pro();  pub(); }   
       } 

  package P2;

  import P1.Base;

  public class Concrete1 extends Base {
   public void pri( ) { System.out.println(“Concrete1.pri()”); }
   public void pac( ) { System.out.println(“Concrete1.pac()”); }
   public void pro( ) { System.out.println(“Concrete1.pro()”); }
   public void pub( ) { System.out.println(“Concrete1.pub()”); }

    Concrete1 c1 = new Concrete1();
    c1.show( );

输出:

Base.pri()

Base.pac()

Concrete1.pro()

具体1.pub()

package P1;

 import P2.Concrete1;

  public class Concrete2 extends Concrete1 {
   public void pri( ) { System.out.println(“Concrete2.pri()”); }
   public void pac( ) { System.out.println(“Concrete2.pac()”); }
   public void pro( ) { System.out.println(“Concrete2.pro()”); }
   public void pub( ) { System.out.println(“Concrete2.pub()”); }
  } 


   Concrete2 c2 = new Concrete2();
   c2.show( );

输出:

Base.pri()

Concrete2.pac()

Concrete2.pro()

Concrete2.pub()

【问题讨论】:

  • 是的,它是 Concrete2,我已经编辑了帖子。

标签: java inheritance overriding


【解决方案1】:

好吧,我们走吧。

在类 Base 的定义中,方法 pac() 具有包私有可见性,也就是说,它只能被同一个包中的类访问。由于 Concrete1 不在同一个包上,它只能覆盖具有公共/受保护可见性的方法。

Concrete2 在 Base (P1) 的同一个包中,这解释了为什么它可以覆盖 pac() 以及两种情况的输出差异。

【讨论】:

  • 抱歉,我是编程新手。但我想知道为什么 pac() 被覆盖了。我不确定访问修饰符。不是私人的吗?如果它是关于同一个包,那么为什么 pri() 没有被覆盖。
  • pri() 之所以没有被覆盖,是因为它在超类 Base 上具有私有访问权限,即它只属于 Base 类。由于您没有覆盖方法 show(),因此当您在子类上调用它时,您正在调用超类实现。 Java 为在这种情况下不能被覆盖的超类方法提供优先执行权。我建议你这个docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
  • 在 Concrete2 案例中,pac() 被覆盖,因为 Concrete2 与 Base 在同一个包中。在 Base 中,方法 pac() 没有访问修饰符,因此它是默认访问或包私有的。在这种情况下,由于访问修饰符,只有同一个包中的类可以覆盖它。由于 Concrete1 不在同一个包上,它不能覆盖它。