总序
- 抽象类是用来捕捉子类的通用特性,接口是抽象方法的集合。
- 从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
相同点:
- 接口和抽象类都不能进行实例化
- 都位于继承的顶端,用于被其他类实现或者继承
- 都包含抽象方法,其子类都必须覆盖重写这些抽象方法
不同点
- 声明:抽象类使用abstract关键字来声明,接口使用interface关键字来声明
- 实现:抽象类的子类使用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现,接口的子类使用implements关键字来实现接口,它需要提供接口中所有声明的方法的实现
- 构造器:抽象类可以有构造器,接口不能够有构造器
- 访问修饰符:抽象类中的方法可以是任意访问修饰符,接口方法默认修饰符是public,并且不允许定义为private或者protected
- 多继承:一个类最多只能继承一个抽象类,而一个类可以实现多个接口
- 字段声明:抽象类的字段声明可以是任意的,接口的字段默认都是static和final的
通过对比两段代码我们可以更加形象的理解以上所列举的抽象类和接口的相同点和不同点,话不多说,上代码
接口的代码演示
创建一个接口
public interface MyInterfaceAbstract {
/**这是一个抽象方法*/
void methodAbs1();
/**这也是一个抽象方法*/
void methodAbs2();
/**这也是抽象方法*/
void methodAbs3();
/**这也是抽象方法*/
void methodAbs4();
}
对接口进行实现
public class MyInterfaceAbstractImpl implements MyInterfaceAbstract {
@Override
public void methodAbs1() {
System.out.println("这是第一个方法");
}
@Override
public void methodAbs2() {
System.out.println("这是第二个方法");
}
@Override
public void methodAbs3() {
System.out.println("这是第三个方法");
}
@Override
public void methodAbs4() {
System.out.println("这是第四个方法");
}
}
创建测试类对接口以及实现接口的类进行测试
public class Test {
public static void main(String[] args) {
//错误写法!不能和直接new接口对象使用。
// MyInterfaceAbstract inter=new MyInterfaceAbstract();
//创建实现类的对象使用
MyInterfaceAbstractImpl impl = new MyInterfaceAbstractImpl();
impl.methodAbs1();
impl.methodAbs2();
impl.methodAbs3();
}
}
抽象类的代码演示
定义一个吃东西的抽象方法
public abstract class Animal {
/**
* 这是一个抽象方法,代表吃东西,但是具体吃什么(大括号里的内容)不确定。
*/
public abstract void eat();
}
定义一个Cat类,用于继承Animal类
public class Cat extends Animal{
@Override
public void eat(){
System.out.println("猫吃鱼");
}
}
定义一个测试类对方法进行测试
public class Test {
public static void main(String[] args) {
/*Animal animal = new Animal();
错误写法~!不能直接创建抽象类对象*/
Cat cat = new Cat();
cat.eat();
}
}