Java继承 - 调用超类方法

roz*_*roz 53 java methods inheritance superclass

让我们假设我有以下两个类

public class alpha {

    public alpha(){
        //some logic
    }

    public void alphaMethod1(){
        //some logic
    }
}

public class beta extends alpha {

    public beta(){
        //some logic
    }

    public void alphaMethod1(){
        //some logic
    }
}

public class Test extends beta
{
     public static void main(String[] args)
      {
        beta obj = new beta();
        obj.alphaMethod1();// Here I want to call the method from class alpha.
       }
}
Run Code Online (Sandbox Code Playgroud)

如果我发起一个beta类型的新对象,我怎样才能执行alphamethod1类alpha而不是beta中的逻辑?我可以使用super().alphaMethod1()< - 我想知道这是否可行.

Eclipse IDE中的Autotype允许我alphamethod1从类alpha或类中选择beta.

Mic*_*jer 82

你可以做:

super.alphaMethod1();
Run Code Online (Sandbox Code Playgroud)

注意,这super是对父级的引用,但是super()是它的构造函数.

  • 在构造函数中,您需要调用super()作为第一条语句(如果您显式调用它)。在常规方法上,您可以根据应用程序逻辑需求随时随地调用它。例如,如果要在调用后添加额外的步骤,请在开始时添加;如果要添加额外的检查,请在结束时添加。 (2认同)
  • @MichałŠrajer使用`super`,您无法将方法从“ alpha”类调用到“ Test”类中​​,该类扩展了“ beta”类 (2认同)
  • 附加信息:“super.alphaMethod1();”无法从“main”方法调用。这个答案没有说明这一点,但是这个调用需要从子类“beta”的非静态上下文*内的某个地方进行。 (2认同)

San*_*hak 20

简单地使用 super.alphaMethod1();

请参阅java中的super关键字


CKR*_*666 12

你不能通过使用beta的对象来调用alpha的alphaMethod1()但你有两个解决方案:

解决方案1:alphaMethod1()从beta中调用alphaalphaMethod1()

class Beta extends Alpha
{
  public void alphaMethod1()
  {
    super.alphaMethod1();
  }
}
Run Code Online (Sandbox Code Playgroud)

或者来自Beta的任何其他方法:

class Beta extends Alpha
{
  public void foo()
  {
     super.alphaMethod1();
  }
}

class Test extends Beta 
{
   public static void main(String[] args)
   {
      Beta beta = new Beta();
      beta.foo();
   }
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:创建alpha对象并调用alphaalphaMethod1()

class Test extends Beta
{
   public static void main(String[] args)
   {
      Alpha alpha = new Alpha();
      alpha.alphaMethod1();
   }
}
Run Code Online (Sandbox Code Playgroud)


Dal*_*him 5

可以使用 super 从母类调用该方法,但这意味着您可能有设计问题。也许B.alphaMethod1()不应该覆盖 A 的方法并被调用B.betaMethod1()

如果视情况而定,您可以放置​​一些代码逻辑,例如:

public void alphaMethod1(){
    if (something) {
        super.alphaMethod1();
        return;
    }
    // Rest of the code for other situations
}
Run Code Online (Sandbox Code Playgroud)

这样它只会在需要时调用 A 的方法,并且对类用户保持不可见。