Java中,接口和抽象类很普遍也很相似,但是初学者在实际写代码中大部分都用接口,抽象类很少用,而且也不怎么注意二者的比较,
哎,没错,就是我了,唉,随着时间的流逝越发觉得自己菜的一批。
(1)首先我们先从表现形式上来看一下区别:
接口interface:关键字是interface,用来被类实现,可以多继承(Java类只能单继承)其他接口,内部都是抽象方法,所以被Java类实现(implement)的时候
就要实现内部所有的方法,内部的变量隐式的被public static final 修饰,方法则是被public abstract 修饰(而且方法只能是public权限)。
抽象类abstract:关键字是abstract,用来被类继承,只能单继承其他类,内部既可以有抽象方法,也可以有普通方法,被Java类继承(extend)的时候
必须实现内部的抽象方法,内部的抽象方法被abstract修饰,如果子类没有将抽象类全部实现,那么子类也要加abstract关键字。
(2)从意义上来说:
接口interface:接口之所以出现,其中一点就是为了满足Java的开闭原则,即对拓展开放,对修改关闭。
例如:现在有一个接口为animal,内部定义了一个方法为call:
1 1 package com.example.dinner.service; 2 2 3 3 public interface Animal { 4 4 void call(); 5 5 }
有一个类为dog,实现这个类,同时实现内部方法:
1 package com.example.dinner.service; 2 3 /** 4 * @program: dinner 5 * @description: 6 * @author: liuqj 7 * @create: 2020-06-28 14:17 8 **/ 9 public class Dog implements Animal { 10 @Override 11 public void call() { 12 System.out.println("汪汪叫"); 13 } 14 }
可以看到小狗是汪汪叫的。那这个时候如果我再有一个类是cat呢,继续实现这个接口:
public class Cat implements Animal {
@Override
public void call() {
System.out.println("喵喵叫");
}
}
这样,刚开始只有一个狗,所以是汪汪叫,后来增加一个猫,叫声为喵喵叫,而我们只是进行了拓展没有修改任何东西,接口的意义这不就是。
那么抽象类呢?
抽象类也是对所有公共行为进行提取,区别在于,它内部不仅有抽象方法,它还有普通方法,就是在抽象类中已经实现了,子类中不用再
实现,当然你可以进行重写。
这样看来好像只要用抽象类就行了呀,因为抽象类中既有抽象方法,也有普通方法,而接口中只有抽象方法。
但接口本身是可以继承多个接口的,Java类实现是可以实现多接口的。
而抽象类本身只能单继承其他类,Java类一次也只能继承一个抽象类。
不过二者都不能被实例化,如果要实例化对象,那么就要实现内部所有的抽象方法。