接口和抽象类之间的区别

抽象类和接口这是大多数Java APIs的基础元素。在这篇文章中,我将尝试触及两个最重要的概念。

本文是理解Java中的抽象的延续。我建议您首先阅读抽象的概念,因为它是抽象类和接口背后的主要力量。

本文中的内容:

  • 理解抽象类
  • 理解接口
  • 识别明显的差异
  • 探索抽象类vs接口的用法

理解抽象类

简单地说,抽象类是用abstract关键字声明的类。它可能包含或不包含任何抽象方法。JVM将抽象类标识为不完全的类,没有定义它完整的行为。声明类抽象导致一件事:您不能创建这个类的实例,就是这样。

那么,为什么还要费心创建一个根本就不能实例化的类呢?答案是在解决一些关键设计问题上时使用。稍后我们将在这篇文章中讨论这个部分。

让我们来看看抽象类的一个非常基本的形式:

abstract class TestAbstractClass
{
    public abstract void abstractMethod();
    public void normalMethod()
    {
        //method body
    }
}

在这里,我们的TestAbstractClass有两个方法,一个是抽象的,第二个是正常的方法。在类中使用抽象方法将迫使您将类本身声明为抽象。

抽象方法,是一种没有实现的方法。抽象方法以不完整性的形式添加到类中,因此编译器希望声明整个类为抽象。

在应用程序中使用抽象类的唯一方法是继承这个类。它的子类如果不能再次声明抽象,那么可以实例化。子类继承超类的行为,子类可以实现抽象方法。

理解接口

接口是大多数Java APIs的另一个基本构建元素。比如集合、I/O或SWT,你可以到处看到它们

接口定义了实现类需要遵守的契约。这些契约本质上是未实现的方法。Java已经有一个针对未实现的方法的关键词即abstract。Java已经提供的任何类都可以实现任何接口,所有接口中声明的方法只能是public。

让我们看看接口的基本形式:

public interface TestInterface
{
    void implementMe();
}

针对上面的接口,任何实现类需要实现implementMe ()方法。只有一种情况例外,当您实现一个接口时不需要实现接口的方法,即声明实现类本身抽象。例如,

public abstract class TestMain implements TestInterface
{
    //No need to override implement Me
}

否则,你必须在你的类中实现implementMe ()方法。

public class TestMain implements TestInterface
{
    @Override
    public void implementMe() {
        // TODO Auto-generated method stub
    }
}

识别明显的差异

让我们记下抽象类和接口之间的差异,以便快速查阅:

1)接口所有方法都具有public abstract。您不能通过试图减少方法的可访问性来覆盖此行为。您甚至不能声明静态(static)方法。只有public abstract

另一方面,抽象类在声明方法时是灵活的。您还可以定义protected的抽象方法。此外,还可以定义静态方法,前提是它们不是抽象的。允许使用非抽象静态方法。

2) 接口不能有完全定义的方法。根据定义,接口仅用于提供契约。

抽象类可以有非抽象的方法,没有任何限制。您可以使用任何非抽象方法的关键字,就像在其他类中一样。

3) 任何抽象类可以用extends关键字继承抽象类,用implements关键字实现接口。

一个类只能继承一个类,但可以实现任意数量的接口。Java用此特性模拟多继承。

4) 接口是完全抽象的,不能被实例化;Java抽象类也不能实例化,但可以被调用,如果main()存在。

抽象类与接口的使用探索

始终记住,在接口或抽象类之间进行选择并不是非此即彼的情况,在没有适当分析的情况下选择一个都会产生相同的结果。在了解了手头的问题后,必须明智地作出选择。让我们试着把一分析一些情况:

抽象类让您定义了一些行为,使它们成为应用程序框架内的优秀候选者。

让我们以HttpServlet作为一个例子。如果你正在使用servlet技术开放Web应用程序,那么它是一个主要的必须继承的类。正如我们所知道的,每个servlet都有一个明确的生命周期阶段,即初始化、服务和销毁。如果我们创建的每一个servlet,我们必须反复编写关于初始化和销毁的相同的代码,这将非常痛苦。

JDK设计师使HttpServlet为抽象类解决这个问题。它已经为servlet初始化和销毁它编写了所有基本代码。您只需重写编写应用程序处理相关代码的某些方法,即可。有道理,对吗?!!

你能在接口上面添加特性吗?不,即使你能,对大多数无辜程序员来说,设计也会像地狱一样。

现在,让我们看看接口的用法。一个接口只提供契约,它让实现类负责来提每一个方法

接口最适合于只定义具有种特性的情况,并且希望强制所有实现都实现这些特性。

我希望以集合框架中的Map为例。它只提供规则,Map在使用时应该如何表现。它应该存储键值对,值应该用键访问等。

这些规则在接口中以抽象方法的形式定义。

所有的实现类(如HashMap,HashTable,TreeMap或WeakHashMap)以不同的形式实现了所有的方法,从而它们表现出了不同的特征。

另外,接口可以用于确定分离的责任。例如HashMap实现了Map ,Serializable,和Cloneable接口。每个单独的接口定义了责任,实现类选择性的实现想要实现的功能,接口只提供了小一个范围了的功能。

最后,再举一种用法,实际上就多线程的例子,如 new Thread(Runnable task),Thread类要求传入一个实现Runnable接口的对象,然后Thread类对象会调用接口上实现的方法

希望你更多的理解了Java接口和抽象类。我会不断更新这个页面,所以继续访问。

Happy learning !!

时间: 2024-10-15 15:58:55

接口和抽象类之间的区别的相关文章

接口跟抽象类之间的区别

接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口: interface Animal { public void eat(); public void travel(); } 抽象类: /* 文件名 : Employee.java */ public abstract class Employee { private String name; private String address; private int number; public Employee(String n

Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?

Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09|  分类: JAVA |  标签:java  |举报|字号 订阅 下面比较一下两者的语法区别:1.抽象类可以有构造方法,接口中不能有构造方法.2.抽象类中可以有普通成员变量,接口中没有普通成员变量3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法.4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclips

接口和抽象类有什么区别?

接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样.接口是对动作的抽象,抽象类是对根源的抽象. 抽象类表示的是,这个对象是什么.接口表示的是,这个对象能做什么.比如,男人,女人,这两个类(如果是类的话--),他们的抽象类是人.说明,他们都是人. 人可以吃东西,狗也可以吃东西,你可以把"吃东西"定义成一个接口,然后让这些类去实现它. 所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口.走

高级程序员必备知识点:接口和抽象类有什么区别?

在Java中可以用接口和抽象类来定义允许有多个实现的类型:不过,接口和抽象类有两个主要的不同: 抽象类允许包含某些方法的实现,接口则不允许:[Java8中已经提供了默认方法] 从设计层面看,为了实现由抽象类定义的类型,类必须定义为抽象类的子类,这就限制了它在类图中的层次,但是接口则没有这种层次的限制: 在实际开发中,我们应该遵循一个原则——接口优于抽象类,主要是由于接口有三个方面的优势: 只要实现新的接口,就可以给现有的类增加新的功能:但是一个类只能继承自一个父类: 接口非常适合用于定义mixi

接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?

原文链接: (1)接口和抽象类有什么区别 (2)深入理解Java的接口和抽象类

【转载】接口和抽象类有什么区别

原文出处:http://blog.csdn.net/fenglibing/article/details/2745123 接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样.接口是对动作的抽象,抽象类是对根源的抽象. 抽象类表示的是,这个对象是什么.接口表示的是,这个对象能做什么.比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人.说明,他们都是人. 人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它. 所以,在

转 接口和抽象类有什么区别

接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样.接口是对动作的抽象,抽象类是对根源的抽象. 抽象类表示的是,这个对象是什么.接口表示的是,这个对象能做什么.比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人.说明,他们都是人. 人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它. 所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口.走路接口).

(转)接口和抽象类有什么区别

接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样.接口是对动作的抽象,抽象类是对根源的抽象. 抽象类表示的是,这个对象是什么.接口表示的是,这个对象能做什么.比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人.说明,他们都是人. 人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它. 所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口.走路接口).

zbb20180827 接口和抽象类有什么区别

接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 总结几句话来说: 1.抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象. 2.抽象类要被子类继承,接口要被类实现. 3.接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现 4.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量. 5.抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类.