抽象类和接口之间的技术差异

时间:2014-05-15 05:05:25

标签: java

从概念上讲,我知道抽象类和接口之间的区别。但是想知道这两者之间的技术差异。为什么Sun制作了这个界面术语,即使我可以完全抽象化课程并完成我的工作。

6 个答案:

答案 0 :(得分:1)

请阅读http://javarevisited.blogspot.kr/2013/05/difference-between-abstract-class-vs-interface-java-when-prefer-over-design-oops.html

Java中抽象类和接口之间的区别

Java中的抽象类与接口以及何时使用它们决定何时使用接口和抽象类时,了解Java中抽象类和接口之间的区别非常重要。在我看来,它们之间存在两个不同之处,决定了在Java中何时使用抽象类或接口。

1)Java中的接口只能包含声明。您不能在接口内声明任何具体方法。另一方面,抽象类可以包含抽象和具体方法,这使得抽象类成为提供通用或默认功能的理想位置。我建议阅读我关于Java中的接口的10篇知识,以了解有关接口的更多信息,特别是在Java编程语言中。

2)Java接口可以扩展多个接口,Java类也可以实现多个接口,这意味着接口可以提供比抽象类更多的多态支持。通过扩展抽象类,类只能参与一个Type层次结构,但通过使用接口,它可以是多个类型层次结构的一部分。例如。一个类可以同时运行和显示。我记得的一个例子是在J2ME中编写GUI应用程序,其中类扩展了Canvas并实现了CommandListener以提供图形和事件处理功能。

3)为了在Java中实现接口,在你的类是抽象的之前,你需要提供所有方法的实现,这是非常痛苦的。另一方面,抽象类可以通过提供默认实现来帮助您。由于这个原因,我更喜欢在界面中使用最少的方法,从一个开始,我不喜欢标记接口的想法,一旦在Java 5中引入了注释。如果你看看JDK或任何类似Spring的框架,我确实更好地理解OOPS和设计模式,你会发现大多数接口只包含一两种方法,例如Runnable,Callable,ActionListener等。

我还没有在这里包含Java中抽象类和接口之间的所有语法差异,因为这里要集中精力学习何时使用抽象类和接口并选择其他类。不过,您可以看到接口和抽象类之间的区别,以找到所有这些语法上的差异。

了解详情:http://javarevisited.blogspot.com/2013/05/difference-between-abstract-class-vs-interface-java-when-prefer-over-design-oops.html#ixzz31l59K92Z

答案 1 :(得分:0)

您可以在上述方案

中自由选择interfaceabstract class

但请记住以下事项

如果你做了fully abstract class那么

您的subclassextend一个类来实现该行为  它没有资格扩展任何其他类,因为{。{1}}不支持java。

看不到multiple inheritance我们无法实现interface

现在,如果我们接近multiple inheritance而不是interface

然后类可以实现它,并且仍然可以扩展另外一个类。

因此,如果fully abstract永远不需要扩展任何其他类,请在设计中选择fully abstract类。

如果sub classes稍后需要扩展某些类(通常是我们在应用程序中需要的方式),请选择sub classes

答案 2 :(得分:0)

因为你可以有一个类实现2个接口,但你不能有一个类实现(或扩展)2个抽象类。

答案 3 :(得分:0)

您编写了一个带有接口,抽象类和具体类的java程序,但是没有提到任何构造函数,编译它并在.class文件中查看字节代码。您会看到预期的抽象类和具体类具有由编译器添加的默认构造函数,其中接口不会通过编译器将构造函数添加到其中。这应该有助于您了解技术差异,因为我相信您知道其他差异。

答案 4 :(得分:0)

我可能会收到这个答案的downvotes :)。考虑这种情况。

public class TestClass{

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Fish f = new Fish();
        f.walk();
    }

}

abstract class Animal {
    protected void walk() {
        System.out.println("walking");
    }
}

class Fish extends Animal {

}

O / P:走路

从技术上讲,鱼不能走路。因为它扩展了Animal类,它可以"可以"从设计角度来看是错误的(尽管Fish没有实现walk(),它仍然可以调用它)。如果Animal是一个接口,那么Fish必须实现它赢得的方法walk() #39; t / shouldn' t。所以,你将被迫重新审视设计。

答案 5 :(得分:-1)

抽象类可以包含一些实现代码和实例变量。接口只有方法签名和静态变量定义,没有实现代码。

此外,如果实现接口,则必须包含接口中定义的所有方法的实现代码。