一、抽象类
1、概念
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
2、特点
抽象类不能被实例化,实例化应该交由它的子类来完成。
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
- 抽象方法必须被子类重写。
- 子类中的抽象方法不能与父类的抽象方法同名。
- 抽象类不能被final所修饰(因为final修饰的类不能被继承)。
- abstract不能与private、static、final或native并列修饰同一个方法。
3、实例
父类Animal
public abstract class Animal {
public abstract void voice();
}
子类cat、dog
public class Cat extends Animal{
@Override
public void voice() {
System.out.println("喵喵喵");
}
}
public class Dog extends Animal{
@Override
public void voice() {
System.out.println("汪汪汪");
}
}
二、接口
1、概念
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
2、特性
- 接口的所有方法访问权限自动被声明为public。
- 接口中声明的变量会自动变为被public static final修饰的常量,可以通过接口名直接访问。
- 接口中不存在方法体(jdk1.8之前)。
- 实现接口的普通类必须要实现该接口的所有方法,抽象类不用实现。
- 不能实例化一个接口,但是可以声明一个接口变量,该变量必须引用实现类的对象。
- 在实现多接口时,要避免方法名重复。因为实现类不知道重写的是哪个接口里的方法。
- 一个类可以实现多个接口,多个类也可以只实现一个接口。
3、实例
接口
interface Phone{
void make();
}
实现类
public class XiaomiPhone implements Phone {
public XiaomiPhone() {
this.make();
}
@Override
public void make() {
System.out.println("make xiaomi phone!");
}
}
三、抽象类与接口的区别
参数 | 抽象类 | 接口 |
默认的方法实现 | 它可以有默认的方法实现 | 接口完全是抽象的。它根本不存在方法的实现 |
实现 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与普通类的区别 | 不能实例化抽象类 | 接口是完全不同的类型 |
访问修饰符 | 抽象类可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。 |
继承 | 抽象类可以继承一个类和实现多个接口 | 接口只可以继承一个或多个其它接口 |