-1

抽象类父 { int i = 9;

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

}

类子扩展父{ 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

}

}

4

5 回答 5

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 来引用隐藏字段(尽管不鼓励隐藏字段)。

于 2013-08-13T06:08:42.467 回答
1

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

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

知道这一点,因为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将取决于为变量声明的实际类类型。既然您已声明a1Parent,那么a1.i将采用 的值Parent#i

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

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

或者更好的解决方案:永远不要尝试覆盖一个字段,更糟糕的是,不要尝试直接从其他类访问类字段,而是使用各自的gettersetter

更多信息:


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

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

于 2013-08-13T06:09:02.717 回答
0

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

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

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

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

如果是方法,则在运行时决定将调用哪个版本的方法。该方法被调用,其对象被创建,这里 Child 类的对象是 crated 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
于 2013-08-13T06:40:12.300 回答
0

如果我正确理解您的问题,您正在尝试使用 CHILD 实例调用 PARENTS 显示方法。

只有派生类对象没有办法指示编译器对基类版本进行非虚拟调用。

于 2013-08-13T06:09:41.340 回答
0

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

public void display() {
        super.display();
        System.out.println("derived");
    }
于 2013-08-13T06:13:02.827 回答