如何在中间父类覆盖它时访问祖先类的方法?

时间:2013-08-13 05:56:05

标签: java

抽象类Parent {     int i = 9;

void display() {
    System.out.println("base");
}

}

class Child extends Parent {     int i = 8;

public void display() {

    System.out.println("derived");
}

}

公共类A {

public static void main(String args[]) {
    Parent a1 = new Child();
    a1.display(); // calls child class method
    System.out.println(a1.i);// calls parent class member

}

}

5 个答案:

答案 0 :(得分:1)

您无法直接访问Parentdisplay()方法而无需创建对象。 但是你可以从你的子类中访问它。比如这个

 class Child extends Parent {
   int i = 8;
   public void display() {
      super.display();
      System.out.println("derived");
   }
 }

根据java docs Accessing Superclass Members

  

如果您的方法覆盖了其超类的方法之一,则可以通过使用关键字super来调用重写方法。您也可以使用super来引用隐藏字段(尽管不鼓励隐藏字段)。

答案 1 :(得分:1)

  

当我运行此代码时,正在调用派生类的显示方法

看起来您已使用其他编程语言(如C ++或C#)进行编程,您必须将方法指定为virtual才能使用子类方法。在Java中,除privatefinalstatic之外的所有方法都是虚拟的。

知道这一点,因为Child类已经覆盖display类的Parent方法,当你这样做时:

Parent a1 = new Child();
a1.display();

a1.display将执行实际对象引用类的display方法,在本例中为Child#display

修复代码,请将a1的初始化更改为新的Parent

Parent a1 = new Parent();
a1.display();

更多信息:


编辑完成后,现在您在控制台中打印a1时遇到问题,可能是打印9而不是8。你在这里做的是隐藏字段。字段被覆盖,因此i变量的值将取决于为变量声明的实际类类型。由于您已将a1声明为Parent,因此a1.i将采用Parent#i的值。

修复此代码,请将a1变量类型更改为Child

Child a1 = new Child();
System.out.println(a1.i);
a1.display();

或者更好的解决方案:从不尝试覆盖字段,更糟糕的是,不要尝试直接从其他类访问类字段,而是使用相应的 getters setters

更多信息:


  

如果在中级父类重写它时如何访问祖先类的方法?

假设这是你真正的问题,那么答案很简单:你做不到。

答案 2 :(得分:0)

如果我理解你的问题,你试图使用CHILD实例调用PARENTS显示方法。

使用派生类对象,有 NO 方式指示编译器对基类版本进行非虚拟调用。

答案 3 :(得分:0)

你不能。如果您希望执行父类中的代码,那么您必须创建父类(注意:Parent不是抽象类)或者您必须在其中一个方法中调用super.someMethod()孩子例如:

public void display() {
        super.display();
        System.out.println("derived");
    }

答案 4 :(得分:0)

我认为你要问的是为什么要显示父类的变量和子类的方法。

首先,覆盖不应用于变量,它应用于方法。无论引用属于哪个类,该变量都将立即显示。在您的代码中,

    Parent a1 = new Child();  
    System.out.println(a1.i);

这里a1是对Parent类的引用,因此显示了Parent类的变量。

在方法的情况下,在运行时决定调用哪种方法。调用该方法创建其对象,此处Child类的对象为c Parent a1 =new Child();。请参阅 new Child()部分,从而查看Child类方法。但请记住,此方法应存在于引用所属的类中。例如

   Class Parent
    {
    }

   Class Child extends Parent
    { 
      public void display() 
        {
          System.out.println("derived");
        }
      public static void main (String []args)
        {
         Parent a1 = new Child();
         a1.display();    //Error  
        }  
      }

要在原始示例中调用基类方法,请使用super,如其他人所提到的那样。或者只是创建父类的对象

Parent o = new Parent();
o.display();              //prints base