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

时间:2014-07-08 09:26:43

标签: java override

我知道如何通过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"
    }
}

8 个答案:

答案 0 :(得分:1)

只需提供超类print1()方法隐私可见性

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

答案 1 :(得分:1)

一旦你override一个函数,该函数的超级版本就不再可访问超类或子类了。它被称为隐藏"。唯一的例外是通过super:

从被覆盖的函数中调用它
public class Test extends Super{
    void print1(){
        System.out.println("Hello");
        super.print1();                   //Here
    }
}
class Super{
    void print1(){
        System.out.println("hi");
    }   
}

(这正是constructors must never directly call functions that are potentially overridable的原因。) 您也可以将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

答案 2 :(得分:0)

super.method_name(); 

这就是你如何调用超类的方法。如果你想做些不同的事情,请解释一下。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

你确实覆盖它的事实意味着对于每个Test实例,你希望它打印“你好”。

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

答案 5 :(得分:0)

创建Super的对象并调用print方法

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

输出:

hi

答案 6 :(得分:0)

如果您肯定想从Super.print调用Super.print1(),那么您可以将其设为私有。 Test.print1()将不会覆盖它。

答案 7 :(得分:0)

只需使用您方法中的super.method_name()即可。