抽象类和接口


兄弟们还记不记得在上一篇“多态”博客的最后,我们给兄弟们展现了多态的一个小小的用法?

public class Animal {
    public String name;
    public int age;
    public void bark(){
        System.out.println("嘤嘤嘤");
    }
}

引子

在Animal这个父类当中的bark方法似乎从头到尾都没有被实现过,我们既没有实例化一个Animal对象来调用它的bark方法,然后继承了Animal的子类当中也都是重写了这个方法的,发生动态绑定后,我们调用的都是子类的方法,那么父类中的bark方法是不是显得有点多余?有点鸡肋?有点小丑?

抽象方法

那么对于这些并不需要有具体实现的方法我们不妨把它设置成一个抽象方法(我们在方法前面加上abstra表示抽象的意思),首先兄弟们要明白,有抽象方法的类一定是抽象类,但是并不是每一个抽象类中都必须有抽象方法的。
在这里插入图片描述
这里报错是因为,这个类中有了抽象方法,那么我们也必须在类前面加上abstract表示这是一个抽象类:
在这里插入图片描述
这里报错是因为抽象类是不需要有具体的实现的,只需要有个空架子就行了:
在这里插入图片描述
这样子就尽善尽美了!

抽象类

强调一下:由抽象方法的类一定是抽象类,但不是每一个抽象类都要有抽象方法的。

    public String name;
    public int age;
    public abstract void bark();

    public void setAge(int age) {
        this.age = age;
    }

抽象类也是类,也可以有自己的成员变量和方法。
对于抽象类,我当时就很猴急地问它有什么作用,我只能说:我知道你很急,但是请你先别急。
在这里插入图片描述
我们试图实例化一个抽象类对象,但是现实却给了我们一个大耳光,事实上确实做不到实例化一个抽象类,抽象类最大的作用就是被继承,而且继承了抽象类的子类必须重写抽象类中的所有抽象方法:
在这里插入图片描述
随着学习的深入,兄弟们会发现Java中会有很多便于我们的规则,事实上不是工作量减少了,而是有人替我们做好了那些工作量,就像集合类,我们只需要掌握使用,不需要自己敲出来具体的实现。在这里我们如果不想再子类中重写父类的abstract方法,那就需要把子类也变成一个抽象类,但是抽象类的作用就是要被继承,后面除非真的能忍住不使用这个抽象类,否则子类不光要重写其父类的抽象方法,还需要重写父类的父类的抽象方法,所以说啊不是不报,时候未到而已。
因为我们要重写抽象类的抽象方法,那么这个方法就不能被private、final、static修饰,具体的原因我在上一篇讲过了。
那么兄弟们是不是还不太明白抽象类的意义?是不是觉得不管这个类是不是抽象类,从理论上来说我们都是可以自己重写其中的抽象方法的,那既然如此我们为什么要增加抽象类这个知识点呢?
我的老师告诉我的是,抽象类本身就相当于起到了一个提醒的作用,你不重写其中的抽象方法,人家都不给你通过,所以第一节课我就说过了Java是一门很谨慎的语言。

接口

在这里插入图片描述
兄弟们看上面的图片,我们到今天为止应该都是new的class,那么接口就是Interface:
在这里插入图片描述
首先要告诉兄弟们的就是,接口其实是一个特别特殊的抽象类,接口中的方法默认是public abstract 的,接口中的成员变量默认是public static final的,所以在接口中的方法都不能有具体的实现,在接口中的成员变量都要赋初值:
在这里插入图片描述
我们说类与类之间的关系的时候可以说,是一个类继承了一个类,我们可以说一个类实现了某个接口,用implements来表示实现了类:
在这里插入图片描述
由于接口中的方法都是用abstract修饰的,所以我们必须要在实现了接口的类中重写其中的方法,如果不想重写,那就要把这个类定义为抽象类,这就是上节课我们讲的知识了。其实在接口中因为变量和方法的修饰符都是默认的,所以我们可以不写,但是我们不能乱写,你随便写一个非默认的类型,编译器都不会放你过去的。
那么我们讲这个接口的意义何在呢?

    public static void show(Running runner){
        runner.run();
    }
    public static void main(String[] args) {
//        Animal animal=new Animal();
        Dog dog=new Dog();
        show(dog);

在这里插入图片描述
我们之前说的,接口其实就是一个特殊化的抽象类,那我们就可以把接口当作实现接口的类的父类来使用,这下子我们在使用show方法的时候就完全脱离了数据类型的限制,不管是什么类型,只要实现了Running这个接口,那么就可以进行传参!所以,我觉得实现了某个接口,其实就是具备了某种功能,然后具备了这个功能的就可以看作是一个大类!
我们之前说过,Java是单继承模式,一个类只可以有一个父类,可不能乱当三姓家奴,但是接口很大程度上弥补了这个缺点,我们一个类可以实现好多好多接口,从效果上来看这其实就是多继承。
好了,那么关于抽象类和接口的知识就讲到这里吧,希望我的这篇博客能对兄弟们有所帮助!
百年大道,你我共勉!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值