文章目录
一、抽象类
1. 抽象类的定义
抽象就是从多个事物中将共性的、本质的内容抽取出来。包含抽象方法的类叫做抽象类。
2. 抽象方法的由来
多个对象具备相同的功能,但功能的具体内容有所不同,那么在抽取过程中,只抽取功能定义,而不抽取功能主体。只有功能声明而没有功能主体的方法称为抽象方法,由 abstract 关键字修饰。
例如,猫和狗都会叫,但是具体叫的方式是不一样的,所以就可以抽象出来一个动物叫的方法,具体怎么叫由具体的子类实现。
示例:
// 动物类,抽象类
public abstract class Animal {
// 抽象方法
public abstract void roar();
}
// 猫
public class Cat extends Animal{
@Override
public void roar() {
System.out.println("喵喵喵。。。");
}
}
// 狗
public class Dog extends Animal{
@Override
public void roar() {
System.out.println("汪汪汪。。。");
}
}
3. 抽象类的特点
3.1 访问权限
- JDK 1.8 以前,抽象类的默认访问权限为 protected;
- JDK 1.8 以后,抽象类的默认访问权限为 default。
3.2 抽象类与抽象方法
如果一个类包含抽象方法,那这个类必须是抽象的。相反,一个抽象类里面可以没有抽象方法。
也就是说,抽象类里面可以有抽象方法和普通方法,普通方法子类可以直接使用,而所有的抽象方法子类必须实现。
3.3 抽象类的继承
抽象类也可以继承抽象类。
也就是说,如果从一个抽象类继承,并想创建该新类的对象,那么就必须实现所有的抽象方法。如果没有实现所有的抽象方法(这样也是可以的),那么这个子类也是抽象类。
3.4 抽象类的构造方法
抽象类不能创建实例对象,但可以有自己的构造方法。
这两者看上去似乎有些矛盾,但是其实也是合理的。因为抽象类是可以有自己的成员变量的,子类继承之后,还得调用父类的构造方法。也就是说,抽象类可以通过子类向上转型来实现实例化。例如,
Animal animal = new Dog();
二、接口
1. 接口的定义
接口是比抽象类还要抽象的 “类”。接口是一系列方法的声明,是一些方法特征的集合。
接口是为了解决 Java 不能多继承这一问题的,我们可以把接口理解为 100% 的抽象类,即接口中的方法必须全部都是抽象方法(不可以有普通方法)。
2. 接口的特点
- JDK 1.8以前,接口中的方法必须是 public 的;JDK 1.8时,接口中的方法可以是 public 的,也可以是 default 的。
- 接口是隐式抽象的,当声明一个接口的时候,不必使用 abstract 关键字;
- 接口中的方法被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错),接口中每一个方法也是隐式抽象的,声明时同样不需要 abstract 关键字。接口中的方法都是公有的( public ) !!!
- 接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
- 接口里面的方法要全部被子类实现。
三、抽象类与接口的区别
- 抽象类可以有构造方法,接口不可以;
- 抽象类里可以有普通的成员变量,接口不可以(接口中的变量默认都是 public static final 的);
- 抽象类里可以有静态方法,接口不可以;
- 单继承,多实现;
- 抽象类也可以实现接口,可以把接口中的方法映射到抽象类中作为抽象方法而不必实现,在子类中实现接口方法。
- 抽象类不能被实例化,但可以有构造方法,子类可以通过 super() 调用父类的构造方法。