美文网首页
抽象类与接口

抽象类与接口

作者: Rreply | 来源:发表于2018-08-03 23:41 被阅读6次

抽象类

抽象类即使用abstract修饰的类

  • 抽象类和抽象方法必须使用abstract来修饰。抽象方法不能够有方法体
  • 抽象类不能够被实例化。即使抽象类中没有抽象方法,其也不能够创建实例。
  • 抽象类和普通类的组成部分大致相同,可以有普通方法,成员变量,构造器,区别在于抽象类中有抽象方法来被子类实现,抽象类中的构造器不是用来创建实例的,而是用来在子类中调用的。
  • 含有抽象方法的类(包括继承了抽象类但是没有实现,实现了接口,但是没有完全实现其中的抽象方法)只能够被定义成抽象类。
  • 抽象类是可以没有方法和属性的
  • 当使用abstract修饰方法时,这个方法一定要被子类或者子类的子类实现,而final修饰的方法是不能够被修改的,因此final与abstract是不能够同时使用的。
  • abstract不能够修饰成员变量,也不能够修饰局部变量和构造器。
  • 使用abstract修饰方法时,这个方法是没有方法体的,如果这个方法也同时用static修饰,这个方法理论上能够通过抽象类调用,但是这个方法时没有方法体。调用出错,所以static也不能够与abstract公用。
  • abstract修饰的方法必须在子类中实现才有意义,所以abstract不能够与private共同使用。
作用

抽象类是从多个具有相似特征的类中提取出其中共同的部分,然后把这些部分组成一个抽象类。抽象类大多数是作为一个模板,避免子类在设计上的随意性。同时在抽象类中普通方法也能够起到代码复用的作用。

abstract class Person{
    public void everyNeedToDo() {
        System.out.println("吃喝玩乐");
    }
    abstract void work();
}
public class Student extends Person{
    @Override
    void work() {
        System.out.println("上课听讲,回家复习,周末考试");
    }
}
class Colder extends Person{
    @Override
    void work() {
        System.out.println("与产品斗智斗勇,撸代码");
    }
}

学生与程序员共同的部分是都要吃喝拉撒,这是每个人类都要做的事情,因此把它提取出来作为抽象类的普通方法,然而每个人要完成的工作都是不一样的。这不一样的部分就在抽象类中定义成抽象方法,最终在子类中根据实际情况进行实现。
抽象类与接口的最大不同之处在于他们与子类的关系上。
对于抽象类来说,子类是其模板的实现,是抽象类的继承,是“is a”的关系。也可以说子类就是抽象类,子类和抽象类的本质是一样的,不同的只是不同子类对于抽象方法的实现。比如学生,程序员就是Person一样,但是它们的工作任务是不一样的。
然而对于接口来说,实现类与其之间并没有继承的关系。接口更多的是作为一种扩展规范,其与子类的关系并没有那么密切。下面介绍接口的相关知识。

接口

接口定义了某一批类所需要实现的规范,接口不关系这些类的内部实现细节,只要其实现接口中定义的抽象方法。接口定义的是多个类共同的公共行为规范,这些行为是与外界沟通的渠道。

  • 接口使用interface关键字
  • 一个类可以有多个接口, 但是接口只能够继承接口,不能够继承类
  • 接口中不能够有构造器和初始化块定义。接口可以有静态常量和静态方法、抽象方法、默认方法。
  • 默认方法使用default来修饰,不能够使用static修饰。
  • 静态方法使用接口来调用,默认方法使用接口的实现类的对象来调用。
  • 接口内的成员变量默认使用public static final来修饰
  • 接口支持多继承
abstract class Person{

    public void everyNeedToDo() {

        System.out.println("吃喝拉撒");
    }

    abstract void work();

}

interface drive{

    void driveCar();
    
    default void own() {
        System.out.println("拥有驾驶证");      //默认方法
    }
}
public class Student extends Person implements drive{

    @Override
    void work() {
        System.out.println("上课听讲,回家复习,周末考试");
    }

    @Override
    public void driveCar() {
        System.out.println("驾驶电动车");
    }
}
class Colder extends Person implements drive{

    @Override
    void work() {
        System.out.println("与产品斗智斗勇,撸代码");
    }

    @Override
    public void driveCar() {
        System.out.println("驾驶小汽车");
    }
}

如上述代码所示,Student和Colder都实现了drive这个接口,也就代表了他们都拥有驾驶这个技能,通过对于接口中抽象方法的不同实现,他们的技能也是不一样的,学生骑电动车,程序员开车。
这里也能一定程度上看出接口与抽象类的区别。
接口是对象增加某种技能的方法,这种技能可以是很多个,有或者没有都没关系。

相关文章

网友评论

      本文标题:抽象类与接口

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