【问题标题】:Do i need to implement all the methods of interface again while inheriting abstract class in Java?在Java中继承抽象类时是否需要再次实现接口的所有方法?
【发布时间】:2018-10-20 06:26:39
【问题描述】:

我正在尝试扩展一个抽象类,它实现了一种接口方法,所以在我的子类中我试图实现接口中声明的其余方法,但是子类迫使我声明接口的所有方法,请帮助我为了解决这个问题,提前感谢我在下面添加了我的代码。非常感谢前辈。

我的代码

   interface xxx
    {
         int numbers();
         String names();
         Double salary();
    }
    abstract class GetNames implements xxx
    {
        public String names()
        {
            return "Ravi";
        }
    }
    class Check extends GetNames
//This class forcing me to implement names also
    {
        public int numbers()
        {
            return 3;
        }
        public double sal()
        {
            return 25000.00;
        }
    }

    public class AbsUsingInterface {

    }

【问题讨论】:

  • salary 缺少 Check 而不是 names

标签: java interface abstract-class


【解决方案1】:

您只需要实现接口中尚未在抽象类中实现的方法,抽象类是您尝试实现方法的类的超类。

但看起来我在您的 Check 课程中发现了一个问题。

你的接口声明了这个方法,

Double salary();

在检查类中,您正在实现此方法,

public double sal()

所以这真的没有从接口实现方法。您需要使其与界面中的相同。

像这样在你的 Check 类中创建方法,

public Double salary()
    {
        return 25000.00;
    }

在从超类/接口实现/覆盖方法时,您应该始终使用@Override 注解,因此如果您的任何方法签名不同,它会在此处提示您出错。是的,如果您在子类 Check 中再次声明 names() 方法,它将覆盖抽象类中的方法。您可以在您的类中执行类似的操作,

abstract class GetNames implements xxx
{
    @Override
    public String names()
    {
        return "Ravi";
    }
}

class Check extends GetNames
{
    @Override
    public int numbers()
    {
        return 3;
    }
    public double sal()
    {
        return 25000.00;
    }
    @Override
    public Double salary() {
        return sal();
    }

    @Override
    public String names() { // this overrides names() method in GetNames class
        return "Check";
    }


}

【讨论】:

  • 是的,Pushpesh 兄弟感谢您作为初学者进行纠正,有点困惑,我也试图弄清楚,我可以声明另一个具有相同原始类型的方法名称,就像我们如何获取和传递变量一样,我清除了两个疑问,一个是方法名称应该相同,我们可以将实现的方法保留为抽象类,如果我在子类中再次声明名称,希望也可以覆盖......?
  • 是的,您可以使用您想要的任何名称声明其他方法。另外,我建议始终使用 @Override 注释,当您无意中在声明名称时打错字时,它可以帮助您发现问题。让我更新我的答案以包括这一点。
【解决方案2】:

扩展abstract 类的具体类必须为超类中的所有抽象方法提供主体。

接口中的方法默认为abstract,除非您提供默认主体。

当一个抽象类实现一个接口时,接口的所有这些方法都照原样继承,即抽象

现在对于您的场景,您已经为接口的继承方法之一提供了主体,此方法在“抽象”类的范围内不再是抽象的。所以,如果一个类扩展了这个抽象类,那么它就不需要为上述方法提供一个主体,因为它不再是抽象的(他们当然可以覆盖它)。

您在为未继承 salary() 方法而不是已在 GetNames 抽象类中定义的 names() 方法而定义的 Check 子类中遇到错误

【讨论】:

  • 兄弟,是的,这是唯一的问题,我想用另一个名称声明 Double,但它应该与在接口中声明的名称相同,并且尝试有点混淆。谢谢兄弟
【解决方案3】:

您的 GetNames 类正在实现 xxx 接口,但您只是在实现 names() 你必须实现salary方法。

interface xxx
{
     int numbers();
     String names();
     Double salary();
}
abstract class GetNames implements xxx
{
    public String names()
    {
        return "Ravi";
    }
    public Double salary()
    {
        return null;//just return null;
    }
}
class Check extends GetNames
{
    public int numbers()
    {
        return 3;
    }
    public double sal()
    {
        return 25000.00;
    }
}

或者只是抛出 NotImplementedException;

【讨论】:

  • 是的,姐姐,我已经修好了,虽然我喜欢变量名,但它会接受不同类型的 Double 名称,这就是我犯错的地方,谢谢你的时间姐姐。
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2018-04-05
相关资源
最近更新 更多