抽象类
简单地说,就是被 abstract 修饰的类就是抽象类。
关于abstract修饰符:
1)被abstract修饰的类为抽象类,该类不能有对象,即不能通过new来进行实例化。
2)被abstract修饰的方法称为抽象方法,该方法不能有方法体,不能实现任何具体的功能,即一个空的方法,连{}都不能有。
3)有抽象方法的类一定是抽象类,抽象类内的方法不一定都是抽象方法。
那么,可能就会有疑问了,既然抽象类不能new一个对象,而且其中的方法也是空方法,那这个抽象类有什么用呢?又怎么去使用呢?
抽象类一定要有其他的类去继承这个抽象类,如果没有类继承,那么这个抽象类就真的失去了意义了。与此同时,当一个类继承了这个抽象类后,一定要重写其中所有的抽象方法。
比如定义一个抽象的学生类:
//抽象学生类
public abstract class Student {
//三个抽象方法:学习、吃饭、睡觉
public abstract void study();
public abstract void eat();
public abstract void sleep();
public abstract void test();
}
再定义一个大学生类去继承这个抽象的学生类,并重写其所有的抽象方法:
public class CollegeSTU extends Student{
@Override
public void study() {
// TODO Auto-generated method stub
System.out.println("大学生在学习");
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("大学生在吃饭");
}
@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("大学生在睡觉");
}
@Override
public void test() {};
}
这样便可以在大学生类中对其中的方法进行调用了。抽象类类似于一个模板,所有基层这个模板的子类都需要重写所有的抽象方法,即使在子类中没有用到该函数也要将其重写(如上例中的考试方法)。
接口(interface)
接口是抽象类的延伸,是一种特殊的抽象类。
关于接口:
1)接口中的方法是默认抽象的,因此也不能有具体的实现。
2)接口中的变量是默认static final 的,因此在接口中声明一个变量是必须赋值且在后续的使用中无法更改。
3)当一个类实现该接口时,也必须重写接口中定义的所有的抽象方法。
相同点
1)都必须重写所有的抽象方法。
2)二者都无法被实例化,也就是不能直接new一个对象。
不同点
1)关键字:继承抽象类的关键字是extends,实现接口的关键字是implements
2)变量:抽象类中对于变量可正常声明且后续使用中可更改;接口中声明一个变量是默认static final的,必须赋于初值且后续无法更改。
3)方法:抽象类中可以有非抽象的方法;接口中的方法一定都是抽象的。正是因为如此,在抽象类中可以实现部分方法,只要这个方法是非抽象的,但是由于接口中的方法一定是抽象的,因此接口中无法实现所有的方法。
4)构造方法:抽象类中可以有构造方法,接口中不能有构造方法。
5)具体使用中:子类继承抽象类时只能继承一个抽象类;而一个类实现接口时可以同时实现多个接口。
6)设计理念:抽象类为“A is B”,接口为“A has B”。因此,当你想了解某个事物的本质和根源时,使用抽象类;当你只想使用某个或某些功能时,使用接口。