接口和抽象类之间到底有什么区别?


当前回答

php.net上抽象类和接口的简单而有效的解释:

接口就像一个协议。它不指定对象的行为;它指定代码如何告诉该对象的动作。接口类似于英语:定义接口定义代码如何与实现该接口的任何对象通信。接口始终是一个协议或承诺。当一个类说“我实现接口Y”时,它就是说“我承诺拥有与任何具有接口Y的对象相同的公共方法”。另一方面,抽象类类似于部分构建的类。它很像是一个有空格要填写的文档。它可能使用英语,但这并不像某些文档已经写好这样重要。抽象类是另一个对象的基础。当一个类显示“I extend abstract class Y”时,它表示“I use some methods or properties already defined in this other class named Y”。因此,请考虑以下PHP:<?php文件类X实现了Y{}//这意味着“X”同意使用代码使用语言“Y”。类X扩展了Y{}//这意味着“X”将完成部分类“Y”。?>如果您正在分发一个类供其他人使用,那么您的类将实现一个特定的接口。接口是一个协议,为您的类提供一组特定的公共方法。如果您(或其他人)编写了一个已经编写了一些要在新类中使用的方法的类,则可以让您的类扩展一个抽象类。这些概念虽然很容易混淆,但却特别不同和不同。出于所有意图和目的,如果您是任何类的唯一用户,则不需要实现接口。

其他回答

一些重要的区别:

以表格的形式:

正如Joe在javapapers中所说:

1.主要区别在于Java接口的方法是隐式抽象的,不能有实现。Java抽象类可以具有实现默认行为的实例方法。2.Java接口中声明的变量默认为final。抽象类可以包含非最终变量。3.默认情况下,Java接口的成员是公共的。Java抽象类可以具有类成员的通常风格,受保护等。。4.Java接口应使用关键字“implements”实现;Java抽象类应该使用关键字“extends”进行扩展。5.接口只能扩展另一个Java接口,抽象类可以扩展另一Java类并实现多个Java接口。6.Java类可以实现多个接口,但只能扩展一个抽象类。7.接口是绝对抽象的,不能实例化;Java抽象类也不能实例化,但如果main()存在。8.与java抽象类相比,java接口速度较慢,因为它需要额外的间接寻址。

当您想在继承层次结构中提供多态行为时,请使用抽象类。

当您想要完全无关的类的多态行为时,请使用接口。

抽象类和接口的一般思想是由使用这些通用“设置”(某种模板)的其他类(不能单独构建)来扩展/实现,这使得为以后扩展它的所有对象设置特定的通用行为变得简单。

抽象类具有常规方法集和抽象方法。扩展类在被抽象类扩展后可以包括未设置的方法。当设置抽象方法时,它们由稍后扩展抽象方法的类定义。

接口与抽象类具有相同的财产,但只包含抽象方法,这些方法可以在其他类中实现(可以是多个要实现的接口),这就创建了一个更持久的方法/静态变量定义。与抽象类不同,您不能添加自定义的“常规”方法。

其实很简单。

您可以将接口视为一个类,它只允许有抽象方法,而不允许有其他方法。

因此,接口只能“声明”而不能定义您希望类具有的行为。

抽象类允许您声明(使用抽象方法)和定义(使用完整方法实现)您希望类具有的行为。

常规类只允许您定义而不是声明您希望类具有的行为/动作。

最后一件事,

在Java中,可以实现多个接口,但只能扩展一个(抽象类或类)。。。

这意味着定义行为的继承被限制为每个类只允许一个。。。例如,如果你想要一个从类a、B和C中封装行为的类,你需要执行以下操作:类a扩展B,类C扩展a。。这是一个有点迂回的方式来拥有多重继承。。。

另一方面,您可以简单地执行接口:接口C实现A、B

因此实际上,Java只在“声明的行为”(即接口)中支持多重继承,并且只支持具有定义行为的单一继承。。除非你像我描述的那样。。。

希望这是合理的。

代表实际实现的抽象类和接口之间的差异。

接口:它是一个关键字,用于定义对象的模板或蓝图,它强制所有子类遵循相同的原型,作为实现,所有子类都可以根据其要求自由实现功能。

我们应该使用接口的一些其他用例。

两个外部对象(应用程序中的第三方集成)之间的通信通过此处的接口完成。

抽象类:抽象,它是一个关键字,当我们在任何类之前使用这个关键字时,它就成为抽象类。它主要用于我们需要定义模板以及所有子类后面的对象的一些默认功能时,这样它就删除了多余的代码和一个可以使用抽象类的用例,例如,我们不希望其他类可以直接实例化该类的对象,只有派生类可以使用该功能。

抽象类示例:

 public abstract class DesireCar
  {

 //It is an abstract method that defines the prototype.
     public abstract void Color();

  // It is a default implementation of a Wheel method as all the desire cars have the same no. of wheels.   
 // and hence no need to define this in all the sub classes in this way it saves the code duplicasy     

  public void Wheel() {          

               Console.WriteLine("Car has four wheel");
                }
           }


    **Here is the sub classes:**

     public class DesireCar1 : DesireCar
        {
            public override void Color()
            {
                Console.WriteLine("This is a red color Desire car");
            }
        }

        public class DesireCar2 : DesireCar
        {
            public override void Color()
            {
                Console.WriteLine("This is a red white Desire car");
            }
        }

接口示例:

  public interface IShape
        {
          // Defines the prototype(template) 
            void Draw();
        }


  // All the sub classes follow the same template but implementation can be different.

    public class Circle : IShape
    {
        public void Draw()
        {
            Console.WriteLine("This is a Circle");
        }
    }

    public class Rectangle : IShape
    {
        public void Draw()
        {
            Console.WriteLine("This is a Rectangle");
        }
    }