什么是抽象类?——使用abstract关键字修饰的类
抽象类的特点:
一般情况下,至少包含一个抽象方法(注:只有方法声明,没有方法体)
public abstract void runCar();
可以包含非抽象方法
public void turnLeft(){
System.out.println("车辆左转");
}
可以定义变量
public int wheelCount;
抽象类体现的是is a的关系
简单定义一个抽象类:baseCar,它是所有车的抽象基类
public abstract class baseCar {
//region 变量
public int wheelCount;
//endregion
//region 方法
public abstract void runCar();
public void turnLeft(){
System.out.println("车辆左转");
}
//endregion
}
定义一个比亚迪汽车类BYDCar,它继承自抽象类baseCar,并重写了抽象方法runCar(),注:如果父类存在多个抽象方法,并且子类在继承抽象类的时候没有重写全部抽象方法,那么这个子类仍然是抽象类
public class BYDCar extends baseCar {
//region 重写方法
@Override
public void runCar() {
System.out.println("比亚迪汽车通过电池电驱行驶");
}
//endregion
public static void main(String[] args) {
baseCar bydCar = new BYDCar();
bydCar.runCar();
bydCar.turnLeft();
}
}
注意点:
虽然抽象类可以声明构造方法,但是抽象类本身无法进行实例化,因此一般都需要子类通过继承方式创建子类后,再向上转型为抽象基类的引用
因为抽象类需要被继承后进行子类的实例化操作 ,抽象方法需要被子类重写,因此抽象类和抽象方法不能被关键字final修饰
public final abstract void runCar();
public final abstract class baseCar{}
2. 接口
什么是接口?——接口是一系列方法的声明,使用interface关键字声明
接口的特点:
完全抽象,只有方法声明(注:和抽象类不同,接口不能有实例方法)
void turnLeft(){
System.out.println("车辆左转");
}
接口中只能定义常量(注:接口中变量都隐性使用static和final关键字修饰的,方法默认都是public访问权限的)
int wheelCount = 4;
接口体现的是like a的关系
JDK8 开始,接口可以声明类方法(静态方法)和默认方法(default)
简单定义一个汽车接口:ICar,它具有公共行为runCar()方法
public interface ICar {
//region 变量
int wheelCount = 4;
//endregion
//region 方法
void runCar();
//endregion
}
定义一个奥迪汽车类AuDiCar,它重写了汽车接口的runCar(),表现出自己的行为
public class AudiCar implements ICar {
//region 变量
@Override
public void runCar() {
System.out.println("奥迪车通过引擎烧油驱动");
}
public void printWheelCount(){
System.out.println(AudiCar.wheelCount);
}
//endregion
public static void main(String[] args) {
ICar auDiCar = new AudiCar();
auDiCar.runCar();
AudiCar audiCarSelf = new AudiCar();
audiCarSelf.printWheelCount();
}
}
注:奥迪车的车轮数量,可以通过类名直接访问,说明了wheelCount在接口中为静态变量



