方法覆盖:在扩展类中

时间:2019-01-15 19:55:51

标签: java inheritance override

在给出的以下代码中,我了解第一部分,当我调用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()

Concrete1.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()

1 个答案:

答案 0 :(得分:0)

好吧,我们走吧。

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

Concrete2与Base(P1)处于同一软件包中,这说明了为什么它可以覆盖pac()以及这两种情况的输出差异。