【问题标题】:Java instance vs Abstract Classes and methodsJava 实例与抽象类和方法
【发布时间】:2014-02-16 11:02:36
【问题描述】:

我是 Java 新手,一直在阅读它的主要主题。我最近介绍了抽象类和实例。我已经阅读了他们的定义,所以这不是我要寻找的定义。

我需要帮助来理解为什么我需要使用界面。我在网上看到的所有关于 java 教程的接口示例似乎都可以使用抽象类/方法组合来实现。

是否存在只使用接口来解决问题而抽象类/方法的组合不能解决问题的常见场景?

【问题讨论】:

    标签: java oop interface polymorphism abstract-class


    【解决方案1】:

    Java API 的一个很好的例子是LinkedList 类。

    正如您从链接中看到的那样,它实现了ListDeque 接口(以及其他一些接口),允许在需要其中一个或另一个时使用它。仅使用抽象类是不可能的。

    【讨论】:

    • 感谢我在阅读中还没有进入 LinkedList。这样就更清楚了。
    【解决方案2】:

    接口定义了一个新的辅助 Java中的数据类型。 它(接口)是一组最终变量抽象方法

    接口的成员“公开的” 默认。事实上私有和受保护 接口中不允许有修饰符。

    接口只是引用类型 无法创建其对象。

    一个接口可以继承另一个接口 但不能继承任何类。

    一个类不能继承任何接口,但是 它(一个类)可以实现零到多 接口。

    如果一个类实现接口,那么 1)它必须覆盖所有的摘要 所有实现接口的方法。

    2) 类型兼容性在 接口和类。它允许一个 接口引用可以引用对象 的实现类。

    interface Iface
    {
      int x = 3;//final and public by default
      void f();//abstract and public by default
    }
    
    interface AnotherI extends Iface
    { 
      //more declarations possible here
    }
    
    class InterfaceDemo implements Iface
    {
     public void f()
     {
       int i;
       for(i =0 ; i< x; i++)
         System.out.println("Interfaces are widely used");
     }
    
     public static void main(String args[])
     {
       Iface ref = new InterfaceDemo();
       ref.f();//allowed
       //ref.newMethodsOfClass();//not allowed
     }
    }
    

    【讨论】:

    • +1 另外,一个接口可以继承多个接口(与类不同)。
    • 非常感谢您的解释和示例。我可以使用抽象类来获得与本示例相同的输出。我正在寻找一个只有实例才能达到预期结果的示例。
    • @MichelMichaelMeyer 因为我看到的大多数示例都没有使用多个接口,所以我没有看到。我想我现在明白了,谢谢。
    【解决方案3】:

    主要区别在于只能扩展一个类,但可以实现多个接口。

    如果您想(例如)在扩展另一个类的同时实现一个侦听器,这可能很重要。请注意,在许多情况下,最好使用匿名内部类进行监听。

    【讨论】:

      【解决方案4】:

      Java 不支持polymorphic 继承——其中一个类可以extend 多个类。做出这一选择是为了避免与分层冲突解决相关的问题(其中一个方法存在于两个父类中——您使用哪一个?)。简单来说,在java中只能有一个“is a”关系。

      但是,为了允许某种形式的多态性,引入了接口。这些是空心模板,类必须为其提供实现,并提供一种创建“看起来像”关系的方法。虽然只允许一个对象“成为”一个(父)类的实例,但它可能“看起来像”任意数量的接口。

      通过从接口中取出继承,它允许处理横切概念 - 即完全不同继承结构的类可能仍然共享一些抽象相似性。 JDK 中的一个很好的例子是Serializable,它是一个标记接口(一个没有方法的接口)。几乎任何类都有可序列化的可能性,但几乎所有可序列化的类都不共享它们的任何继承层次结构。这个概念不能用抽象类来处理——你必须跳出类层次来实现它——即接口是实现它的唯一方法。

      【讨论】:

      • 谢谢。这正是我正在寻找的例子。我会更多地阅读它
      猜你喜欢
      • 2016-11-15
      • 2015-10-06
      • 2017-02-05
      • 2011-11-20
      • 2019-02-11
      • 2022-11-20
      • 2015-12-16
      • 2011-12-01
      相关资源
      最近更新 更多