如何在Java中覆盖方法,但仍具有父方法的部分功能

时间:2012-01-30 12:30:48

标签: java oop inheritance

这个问题在求职面试,Java开发,学生职位时被问到。

interface SomeInterface {
    public void execute();
}

class A implements SomeInterface {
    public void execute() {...}   
}

问题是:

新开发人员被要求创建一个扩展A类的类,并创建名为Execute的方法,这个方法会做一些事情。我们应该如何重写上面的代码,以便在调用方法Execute时获得输出“启动过程” (当然不应该在B类中进行打印)。

class B extends A {
   public void execute() {
      //some code goes here 
   }
}

我知道它可以用两个函数完成,其中一个是抽象的。 请指教......

3 个答案:

答案 0 :(得分:10)

这是template pattern的一个例子。抽象超类A通过执行“标准”部分(在这种情况下打印某些内容)将结构强加到处理中,然后调用子类的具体实现来进行实际/特定处理:

abstract class A implements someIterface {
   public void Execute() {
      System.out.println("start process"):
      doExecute();
   }

   protected abstract void doExecute();
}

class B extends A {
    protected void doExecute() {
        // some code goes here
    }
}

更常见的是:

  • 要调用execute而不是Execute
  • 的方法
  • 要调用SomeInterface而不是someInterface
  • 的界面
  • 具有方法execute
  • 的界面

答案 1 :(得分:2)

super调用父类的功能。

public class Test
{
    public static void main(String[] args)
    {
        B b = new B();
        b.execute();
    }
}

interface Foo
{
    public void execute();
}

class A implements Foo
{
    public void execute()
    {
        System.out.println("from class A");
    }
}

class B extends A
{
    public void execute()
    {
        super.execute();
        System.out.println("from class B");
    }
}

此代码的输出是

from class A
from class B

答案 2 :(得分:0)

赦免。

我主要是一名.NET开发人员,所以不要对我过于严格,但我实际上在C#尝试了一个小节,并做了类似的事情:

我们输入数据

 interface SomeInterface
 {
   void execute();
 }

public class A : SomeInterface
{
   public  void execute() {
      Console.WriteLine("Start process"); 
   }
}


public class B : A {

    public void  execute() {
        Console.WriteLine("Execute B");
    }
}

事情是(并且 也应该在Java中工作),如果我编写代码,就像这样:

SomeInterface inter = new B(); 
inter.execute(); 

它将按要求打印并预期“启动过程”,因为inter.exexute将调用它的已实现版本(因此存在于A中),即使实际类型为{{ 1}}。

希望这有帮助。