繁体   English   中英

从超类调用重写的方法

[英]Call an overriden method from the super class

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

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
  }
  }

我怎么称呼b类对a类方法的暗示

可能您的意思是:

public class b extends a

在这种情况下,代码:

a aa = new b();

将调用b.callMethod() 请注意,从构造函数调用重写的(非私有)方法是一个坏主意。

如果将callMethod方法的可见性更改为protected则将b.callMethod() ,即使从超类也是如此。

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

以下将导致编译器错误:“需要包含Demo.AB的封闭实例。” 在以下内容中讨论:需要一个包含<my reference>的封闭实例 因此,答案是:您不能这样做。 将其写入自己的类文件中,而不是嵌套类中。

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");
    }
}

(Java)

package Demo;

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

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

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
  }
}

但是不要这样做。 从父类的构造函数调用此方法将导致维护噩梦和不良设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM