接口和抽象类之间的区别

Jiakeqiang Jiakeqiang     2022-09-04     750

关键词:

抽象类和接口这是大多数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 !!

 

接口跟抽象类之间的区别(代码片段)

接口和抽象类有什么区别你选择使用接口和抽象类的依据是什么?接口:interfaceAnimalpublicvoideat();publicvoidtravel();抽象类:/*文件名:Employee.java*/publicabstractclassEmployeeprivateStringname;privateStringaddress;privateintnumber;publicE 查看详情

Java 8中接口和抽象类之间的根本区别[重复]

】Java8中接口和抽象类之间的根本区别[重复]【英文标题】:FundamentaldifferencebetweeninterfaceandabstractclassinJava8[duplicate]【发布时间】:2014-05-1608:18:45【问题描述】:考虑到接口现在可以为它提供的方法提供实现,我无法正确解释接口... 查看详情

抽象类和接口以及它们之间的区别

一、抽象类和抽象方法 abstract修饰符修饰的方法称为抽象方法,修饰的类称为抽象类。1、抽象类和抽象方法的关系抽象类中可以没有抽象方法,但是有抽象方法的类一定要申明为抽象类。2、语法public abstract class A... 查看详情

抽象类(abstractclass)和接口(interface)的区别

前言抽象类(abstractclass)和接口(Interface)是Java语言中对于抽象类定义进行支持的两种机制,赋予了Java强大的面向对象能力。二者具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstractclass和In... 查看详情

接口和抽象类有什么区别?你平时怎么用?

文章目录接口和抽象类区别设计目的上:使用方式上:共同点使用接口和抽象类区别设计目的上:接口体现的是一种规范。对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务;对于接口的调用者而言,接口规定了... 查看详情

抽象类和接口的联系与区别

抽象类和接口联系与区别关键字:抽象类与接口的区别abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定... 查看详情

java中抽象类和接口的区别

在Java语言中,abstractclass和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换... 查看详情

类的抽象和接口的区别

在Java语言中,abstractclass和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因... 查看详情

java中抽象类和接口的区别?(代码片段)

...象方法不能用private修饰//如何声明abstractvoidfunc();什么是接口?接口是一种规范publicinterfaceinter //声明方法和变量 publicabstractvoidfunc();//默认publicabstract修饰 inta=2;//默认publicfinalstatic修饰必须赋值操作 defultvoidfunc1() //default修饰可以实... 查看详情

详细解析java中抽象类和接口的区别

在Java语言中,abstractclass和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因... 查看详情

抽象类与接口的区别

抽象类与接口的区别 abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相... 查看详情

接口和抽象类的区别

抽象类和接口是面向对象编程中的基本概念,类(含抽象类)、接口、数组是同一个级别的概念,都属于引用数据类型。相同点:? 抽象类和接口均包含抽象方法,类必须实现所有的抽象方法,否则是抽象类。? 抽象类和... 查看详情

抽象类和接口

1、抽象方法既能存在于抽象类,也能存在于接口。2、抽象类中可以有已实现的方法,接口中只能有抽象方法3、抽象类只能做基类4、抽象类的派生类可以使用override关键词重写抽象类的抽象方法接口与抽象类的区别它们之间的区... 查看详情

java抽象类与接口区别

java抽象类与接口区别:  abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的... 查看详情

java里抽象类和接口的区别

java里抽象类和接口的区别abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具... 查看详情

java里抽象类和接口的区别

java里抽象类和接口的区别abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具... 查看详情

(转)java接口与抽象类的区别

很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。 在讨论它们之间的不同点之前,我们先看看抽象类、接口各自的特性。... 查看详情

java抽象类与接口的区别(代码片段)

很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。在讨论它们之间的不同点之前,我们先看看抽象类、接口各自的特性。抽象... 查看详情