繁体   English   中英

如何调用被覆盖的方法的超版本?

[英]How to call super-version of a method that is overridden?

我知道如何从父类的子类中调用父类中的方法super. 即使该方法被覆盖。 但是,如何在超类中调用该方法?

不可能吗

public class Test extends Super{

    public static void main (String[] args){
        Test t = new Test();
        t.print();
    }

    void print1(){
        System.out.println("Hello");
    }
}


class Super{

    void print1(){
        System.out.println("hi");
    }

    void print(){
        print1();
        // What can I do when I want to print "hi"
    }
}

只需为您的超类print1()方法提供私有可见性即可

class Super{
    private void print1(){
       System.out.println("hi");
    }
    void print(){
        print1();
        // What can I do when I want to print "hi"
    }
}

重写函数后,该函数的超级版本将不再对父类或子类都可用。 称为“隐藏”。 唯一的例外是在覆盖的函数中通过super调用它:

public class Test extends Super{
    void print1(){
        System.out.println("Hello");
        super.print1();                   //Here
    }
}
class Super{
    void print1(){
        System.out.println("hi");
    }   
}

(这正是构造函数绝对不能直接调用可能重写的函数的原因。)您还可以将Super.print1()私有,这意味着,即使有Test.print1() ,它也不会覆盖任何内容,因为就其而言,超级版本不存在(不可见)。

所以这:

public class Test extends Super{
   public static void main (String[] args){
      Test t = new Test();
      t.print();
   }
   void print1(){
      System.out.println("Hello");
   }
}
class Super{
   private void print1(){
      System.out.println("hi");
   }
   void print(){
      print1();
      this.print1();
   }
}

输出此:

hi
hi
super.method_name(); 

这就是您调用超类的方法的方式。 如果您想做不同的事情,请解释。

当您从超类重写方法时,这意味着您不需要使用超类的实现。 所以你不能那样做。 您可以阅读有关多态的更多信息。 这可能会有所帮助。

实际上,如果您想从父类中调用该方法,则不应覆盖它。

您确实覆盖了它的事实,这意味着对于Test的每个实例,您都希望它打印“ hello”。

如果要打印“ hi”,则必须通过父类的实例调用print方法。

创建Super对象并调用print方法

 Super s = new Super();
 s.print();

输出:

hi

如果您确实想从Super.print调用Super.print1(),则可以将其设为私有。 然后Test.print1()将不会覆盖它。

只需在您的方法中使用: super.method_name()

暂无
暂无

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

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