从超类调用重写的方法

时间:2011-10-19 17:45:24

标签: java inheritance overrides

我有一个关于覆盖方法的问题。 如果我有一个类a有一个方法可以被子类覆盖但是在超类中调用

public class a {
  //this is the main class
  public a() {
       //etc code
       callMethod();
   }
   void callMethod() {
       //do nothing here. will be overriden in subclas
  }

  public class b extends a {
      void callMethod() {
           //actually impliment here
  }
  }

如何从类a

调用类b对方法的实现

5 个答案:

答案 0 :(得分:1)

可能你的意思是:

public class b extends a

在这种情况下代码:

a aa = new b();

将致电b.callMethod()。请注意,从构造函数中调用overriden(非私有)方法是个坏主意。

答案 1 :(得分:0)

如果您将callMethod方法的可见性更改为protected,那么b.callMethod()就会被调用,即使是来自超类。

protected关键字告诉Java该方法对子类是可见的;并通过扩展使其成为虚拟的。

答案 2 :(得分:0)

以下结果导致编译器错误:“需要包含Demo.A.B的封闭实例。”这在下面讨论:An enclosing instance that contains <my reference> is required。所以,答案是:你做不到。将它写入自己的类文件而不是嵌套类。

package Demo;

import Demo.A.B;

public class Demo {
    public static void main(String[] args) {
        A test = new B();
    }
}

Package Demo;

public class A {

    public A() {
        callMethod();
    }

    void callMethod() {
        System.out.println("Called from A");
    }

    public class B extends A {
        @Override
        void callMethod() {
            System.out.println("Called from B");
        }
    }
}

工作

(A.java)

Package Demo;

public class A {

    public A() {
        callMethod();
    }

    void callMethod() {
        System.out.println("Called from A");
    }
}

(B.Java)

package Demo;

public class B extends A {
    @Override
    void callMethod() {
        System.out.println("Called from B");
    }
}

答案 3 :(得分:0)

你不能但是你可以为b类创建构造函数,调用工作流将是下一个fileds a - > constructor a - > method from a-> constructor b - > method from b

答案 4 :(得分:0)

public abstract class a {
  //this is the main class
  public a() {
       //etc code
       callMethod(); 
   }
   abstract void callMethod();
}

  public class b extends a {
      void callMethod() {
           //actually impliment here
  }
}

但不要这样做。这个调用方法来自超类中的构造函数维护噩梦和糟糕的设计。