美文网首页
接口和抽象类的区别

接口和抽象类的区别

作者: MonkeyLqj | 来源:发表于2018-08-11 00:01 被阅读0次

    对于面向对象编程来说,抽象是它的一大特征之一(面向对象的四大特性:封装、继承、多态、抽象)。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。今天我们就一起来学习一下Java中的接口和抽象类。

    一、抽象类

    1.抽象方法和抽象类
    抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

    先了解下抽象方法和抽象类的声明格式:

    /*抽象类*/
    public abstract class ClassName {
        //抽象方法
       protected abstract void fun();
        //普通方法
       public void commonFun() {...}
    }
    

    从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
    包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。

    2.抽象类和普通类的区别:
    1). 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public,抽象方法不能有方法体。
    2). 抽象类不能用来创建对象。
    3). 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
    4). 含有抽象方法的类只能被定义成抽象类。

    二、接口

    接口,英文称作interface,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。
    接口的定义形式如下:

    public interface InterfaceName {
      [public abstract] void OnClickListener()
    }
    

    接口中可以含有变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”。

    作为接口就需要被实现 ,使用implements关键字,具体格式如下:

    public class ClassName implements InterfaceName{
        @Override
        public void OnClickListener() {   
        }
    }
    

    允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。

    public class ClassName implements Interface1,Interface2,[....]{
    }
    

    三、抽象类和接口的区别

    1. 抽象类和接口都不能被实例化。如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
    2. 抽象类可以有默认的方法实现,接口完全是抽象的,接口根本不存在方法的实现。
    3. 抽象类是可以后构造器的,接口是不允许有构造器的。
    4. 抽象方法可以使用public、protected修饰符,接口只能使用public修饰符。
    5. 抽象类里可以可以定义静态方法,可以定义普通成员变量,也可以定义静态常量;接口不能定义静态方法,不能定义普通成员变量,只能定义静态常量。
    6. 一个类最多只能有一个直接父类,包括抽象类;但是一个类可以直接实现多个接口。通过实现多个接口可以弥补Java中单继承的不足。

    四、总结

    当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
    抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

    如果理解的有误,还望指正。谢谢!

    相关文章

      网友评论

          本文标题:接口和抽象类的区别

          本文链接:https://www.haomeiwen.com/subject/xjnxbftx.html