1.抽象类
什么是抽象类?——使用abstract关键字修饰的类
抽象类的特点:
-
一般情况下,至少包含一个抽象方法(注:只有方法声明,没有方法体)
/**
* 车辆驱动
*/
public abstract void runCar();
-
可以包含非抽象方法
public void turnLeft(){
System.out.println("车辆左转");
}
-
可以定义变量
/**
* 车轮数量
*/
public int wheelCount;
-
抽象类体现的是
is a的关系
简单定义一个抽象类:BaseCar,它是所有车的抽象基类
/**
* @author panyq
* @since: 2022/3/26 15:00
* #Description 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(),注:如果父类存在多个抽象方法,并且子类在继承抽象类的时候没有重写全部抽象方法,那么这个子类仍然是抽象类
/**
* @author panyq
* @since: 2022/3/26 15:13
* #Description BYDCar
*/
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修饰
/**
* 编译器会报错
* 提示Illegal combination of modifiers: 'final' and 'abstract'
*/
public final abstract void runCar();
/**
* 编译器会报错
* 提示Illegal combination of modifiers: 'final' and 'abstract'
*/
public final abstract class BaseCar{}
2. 接口
什么是接口?——接口是一系列方法的声明,使用interface关键字声明
接口的特点:
-
完全抽象,只有方法声明(注:和抽象类不同,接口不能有实例方法)
/**
* 左转弯
* 编译器报错
* Interface abstract methods cannot have body
*/
void turnLeft(){
System.out.println("车辆左转");
}
-
接口中只能定义常量(注:接口中变量都隐性使用static和final关键字修饰的,方法默认都是public访问权限的)
/**
* 车轮数量
* 子类可以访问,但是无法修改,fianl关键字修饰
*/
int wheelCount = 4;
-
接口体现的是
like a的关系 -
JDK8 开始,接口可以声明类方法(静态方法)和默认方法(default)
简单定义一个汽车接口:ICar,它具有公共行为runCar()方法
/**
* @author panyq
* @since: 2022/3/26 15:43
* #Description ICar
*/
public interface ICar {
//region 变量
/**
* 车轮数量
*/
int wheelCount = 4;
//endregion
//region 方法
/**
* 车辆驱动
*/
void runCar();
//endregion
}
定义一个奥迪汽车类AuDiCar,它重写了汽车接口的runCar(),表现出自己的行为
/**
* @author panyq
* @since: 2022/3/26 15:54
* #Description AudiCar
*/
public class AudiCar implements ICar {
//region 变量
/**
* 奥迪车的驱动方式
*/
@Override
public void runCar() {
System.out.println("奥迪车通过引擎烧油驱动");
}
/**
* 奥迪车的车轮数量,可以通过类名直接访问,说明wheelCount是类变量(静态变量)
*/
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();
}
/**
* 输出结果
* 奥迪车通过引擎烧油驱动
* 4
*/
}
注:奥迪车的车轮数量,可以通过类名直接访问,说明了wheelCount在接口中为静态变量
3万+

被折叠的 条评论
为什么被折叠?



