【问题标题】:If a class is implementing two interfaces ,which one is actual the parent interface for that class in java如果一个类实现了两个接口,那么哪一个实际上是该类在java中的父接口
【发布时间】:2015-09-02 08:47:41
【问题描述】:

如果一个类实现了两个接口,那么哪个接口实际上是该类在 Java 中的父接口

interface A  { 
    void m1(); 
}

interface B {
    void  m1(); 
}


public class C implements A,B {

    public void m1() {
        System.out.println("m1 method !!!");
    }


    public static void main(String[] args) {
         C obj = new  C();
         obj.m1();                     
         ((A)obj).m1();            
         ((B)obj).m1();           

         A objAsA = (A)obj;
         objAsA.m1();               

         B objAsB = (B) obj ;
         objAsB.m1();              
     }

}

【问题讨论】:

  • 这就是有接口的全部目的,解决我们需要从多个来源继承的情况,所以接口中没有父,

标签: java interface multiple-inheritance


【解决方案1】:

Java 中没有“实际父接口”这样的概念。所有接口都与类的超类型处于同等地位。即使在两个接口声明相同的方法签名的情况下,这也不会改变:C 中的相同方法同时实现了AB

顺便说一句,您不需要转换运算符来完成向上转换:

A objAsA = obj;
objAsA.m1();               

B objAsB = obj;
objAsB.m1();              

【讨论】:

  • 所有接口都与类的超类型平等,你能详细说明一下你所说的吗?
  • C 有两个超类型:A 和 B。“the”都不是超类型。
【解决方案2】:

parent 是一个与 extension 相关的概念,而不是 implementation

【讨论】:

  • 你能证明吗?举个例子,父是与扩展相关的概念而不是实现
  • 因为你只能extend一个类,那个类就是parent
【解决方案3】:

来自 Java Java Specification

interface Fish  { int getNumberOfScales(); }
interface Piano { int getNumberOfScales(); }
class Tuna implements Fish, Piano {
    // You can tune a piano, but can you tuna fish?
    public int getNumberOfScales() { return 91; }
}

类 Tuna 中的方法 getNumberOfScales 的名称、签名和返回类型与接口 Fish 中声明的方法相匹配,也与接口 Piano 中声明的方法相匹配;它被认为是实现两者。

所以它认为你实现了BOTH

【讨论】:

  • 我们可以说这两个接口都是金枪鱼的父接口吗?ferdinand-neman
  • 你实现了每个接口指定的两个合约。您可以将其投射到任一界面。
  • 我同意,但是这个程序中是否有“父界面”的概念??Ferdinanad neman
  • 如果您考虑inheritance,Tuna 正在从FishPiano 继承行为契约。 Tuna 是两个接口指定的蓝图实现。如果您考虑polymorphism,则实现的Tuna 可以视为Fish,也可以视为Piano。在这种情况下,没有父母和孩子这样的东西。它只是规范实现行为的关系。
【解决方案4】:

你的问题没有意义。您在 java 中没有“父”接口。 接口就像一个合同,你“承诺”提供接口中列出的方法。您将继承与接口混合在一起。

继承是一个类继承另一个类的部分。 喜欢狗 -> 哈士奇,狗 -> 贵宾犬

接口是每个 Animal 都承诺拥有一个名为 public String getSpecies() 的方法,例如。

如果您想查找某个类的所有接口,请查看此问题。 Determining the extended interfaces of a Class


虽然接口可以扩展其他接口,但“普通”类没有父接口的概念。 感谢 akhil 发现这一点。

您可以将子班级视为其父母的专业,每个级别都更加具体。 动物 -> 狗 -> 哈士奇。然而,每个较低级别都有一些与其兄弟姐妹相同的功能。所有的狗都可以吠叫(),所有的动物都可以移动()。

现在尝试将此逻辑应用于接口,您会发现它并没有真正的意义。接口的存在只是为了确保每个类都具有特定的能力。所有动物都需要呼吸,无论是什么物种,您都可以让 Animals 实现 Breathable。这确保了每个动物都有一个方法 Breath()。

【讨论】:

  • 我们在 Java 中确实有父接口的概念。检查docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
  • 上述程序中A、B都是C??akhil_mittal的父接口
  • @akhil_mittal 你是对的,尽管这适用于扩展其他接口而不是“普通类”的接口。我会更新我的答案谢谢。 Ramesh,你可以这样想,但它并不完全正确。类没有父接口。
  • 我没有完全理解你在说什么,你能详细说明一下吗..提前谢谢RainyCats
  • @RameshRaj 你到底没有得到什么?向我解释继承和接口之间的区别。那你就告诉我你不明白的地方。
【解决方案5】:

这里的类C 实现了接口以及C is AC is B

【讨论】:

    【解决方案6】:

    实现意味着您需要在您的类中使用该方法。所以没有它的父母。可以使用扩展,但是不能有 2 个父母到 1 个班级。例如:

    public static void main(String[] args){
        C c = new C();
        c.m1();
    }
    
    class A {
        public void m1() {
            System.out.println("A printing");
        }
    }
    
    class B {
        public void m1() {
            System.out.println("B printing");
        }
    }
    
    class C extends A {
        public void m1() {
            System.out.println("C print");
        }
    }
    

    打印:“C 打印”

    C 不能同时扩展 B。但它确实覆盖了 A 类的方法。如果 C 不包含方法“m1()”,则使用 A 类的方法,控制台将打印:“A printing”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2013-12-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多