抽象类
什么是抽象类,为什么要使用抽象类?
- 抽象类作为派生其他类的基类,而不做为特定的一种实例类。具体的实现要在子类中完成。
- 如果定义了抽象类,在查看代码时,就会注意抽象方法,而知道这个方法是在子类中实现的,起到提示作用。
//使用abstract关键字来定义接口
public abstract class Person {
protected Person() {
}
//定义了一个抽象类
//只要类中存在抽象方法,那么这个类就要定义成抽象的。
public abstract void getName();
//抽象类中可以实现非抽象方法
public void printN(){
System.out.println("123");
}
}
public class Demo extends Person {
public static void main(String[] args) {
//以下两种方式来创建对象都可以。
//方式一:父类引用指向子类对象。
Person p=new Demo();
Demo d=new Demo();
p.printN();
p.getName();
d.printN();
}
//子类必须实现抽象类中的抽象方法。
public void getName(){
System.out.println("Sivan Xin");
}
}
接口
- 什么是接口,为什么要使用接口?
-
接口体现的是一种规范。可以认为和类是并列的关系。
如果拿继承来类比,继承更多表示“是不是”问题,而接口更多表示“能不能”的问题。 -
从某种程度上来看,接口类似于整个系统的“总纲”,它制定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变。一旦接口被改变,对整个系统甚至其他系统的影响将是辐射式的,会导致系统中大部分类都需要改写。
//implements关键字表示该类调用了这个接口
public class Demo implements Person {
public static void main(String[] args) {
Demo d=new Demo();
d.run();
d.walk();
d.go();
//接口静态方法只能这样调用
Person.go1();
}
//如果一个类调用了接口,就必须实现接口中的所有声明的方法。
@Override
public void walk() {
System.out.println("walk");
}
@Override
public void run() {
System.out.println("run");
}
}
//使用interface关键字来定义接口
interface Person{
//1.8之前接口中不允许实例化方法。
void walk();
//在接口中使用abstract是多余的。
abstract void run();
//在jdk1.8之后,允许使用default(默认)方法和静态方法。
default void go(){
System.out.println("go");
}
static void go1(){
System.out.println("go1");
}
}
区别
- 侧重点:接口强调特定功能的实现,而抽象类强调所属关系。
- 多重继承:一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
- 构造器:接口不能存在构造器,抽象类存在构造器。
- 添加方法:对接口进行修改,就要改变所有调用接口的类。对抽象类进行修改,可以给他提供默认的实现,不必重新修改子类。
- 访问修饰符:接口在jdk1.7及之前,只能使用public,1.8及之后可以定义default和static方法。而abstract类可以使用多种访问修饰符。