一、何为抽象类
1. 语法角度
在java中,由 abstract 关键字修饰的类被称为抽象类。在抽象类中可以同时存在抽象方法和普通方法,并且至少需要有一个抽象方法,这样被称为抽象类才有意义,举一个简单的例子:
// 抽象类Test
public abstract class Test {
// 抽象方法a
public abstract void a();
// 抽象方法b
public abstract void b();
// 普通方法add
public int add(int a, int b){
return a+b;
}
}
抽象方法即为,由 abstract 关键字修饰且没有方法体的方法,就像例子中的方法a和方法b,这样的方法只能出现在抽象类或接口中。
正因为会出现没有方法体的方法,抽象类是不能被实例化的!但是抽象类可以被子类继承,由子类实现抽象方法,如下:
public class Test2 extends Test1{
@Override
public void a() {
System.out.println("a");
}
@Override
public void b() {
System.out.println("b");
}
}
子类实现父类抽象方法后,通过创建子类对象即可使用这些方法。
若子类没有将父类中的抽象方法全部实现,除非子类也是抽象类,否则将报错。
2. 应用角度(建议先了解接口)
当我们使用接口时,它的实现类可能有很多个,而其中某些实现类可能会出现实现的功能相同或者其中有相同的属性,这时候我们可以抽象一个父类出来,把所有共性的属性方法放在父类中,使项目结构更合理
二、何为接口
1. 语法角度
接口(Interface)是抽象方法的集合,接口中通常没有普通方法,也就是说接口中的方法通常都没有方法体,在定义方法的时候可以省略public abstract关键字。接口中的属性全部都是公共静态常量,定义的时候也可以省略public static final,举一个简单的例子:
// 学生接口
public interface Student {
int age = 18;
String name = "张三";
void study();
void rest();
}
现在有了抽象方法就需要我们去实现它们,子类继承父类的关键字为 extends,而一个类实现接口的关键字为 implements。和继承不同,一个类可以实现多个接口,用英文逗号隔开接口名即可。
public class StudentImp implements Student{
@Override
public void study() {
System.out.println("正在学习");
}
@Override
public void rest() {
System.out.println("正在休息");
}
}
同样,如果没有实现接口中的所有抽象方法,实现类也必须是抽象类,否则报错。
接口中通常都是抽象方法,但是在jdk1.8中添加了 default 关键字,只要在方法前加入default该方法就可以有方法体。
当我们需要实现一个功能,而这个功能只需要使用接口内的方法就可以实现时,就可以加上default写一个普通方法,这样直接在接口内完成了这个功能,体现出编写java代码高内聚低耦合的原则
2. 应用角度
在项目开发时,不使用接口,当我要一个功能才能往下写,就需要等别人的代码写完,类似串行工作,效率不高。而当我们使用接口来定义一个规范,提前设计好需要用到的方法,采用面向接口的编程,程序员们分工写实现类,这样就达成了并行开发的目的,提高了开发效率。
三、区别
1. 抽象类本质是类使用extends单继承,接口使用implements可以多实现
2. 抽象类中的属性可以是不同类型,接口中的属性只能是公开静态常量
3. 接口在开发中用于定义规范,抽象类一般作为接口和实现类之间的桥梁
4. jdk1.8前,接口中只能有抽象方法,抽象类可以同时含有抽象方法和普通方法