封装、继承、多态
那我举一个汽车的例子
定义:将数据(属性)和操作数据的方法(行为)捆绑在一起,并隐藏内部实现细节,仅对外提供必要接口。 类比:汽车的发动机舱。
通俗解释:
封装的话就是比如把发动机、变速箱藏在引擎盖下面,只留给用户几个简单的“按钮”
(方向盘、油门、刹车)
关键作用:
代码示例:
public class Car {
private int speed; // 隐藏速度,不让外部直接修改
// 提供公共方法控制速度
public void pressAccelerator(int force) {
if (force > 0) {
speed += force;
if (speed > 200) speed = 200; // 限速保护
}
}
public int getSpeed() {
return speed;
}
}
定义:子类(派生类)继承父类(基类)的属性和方法,实现代码复用和扩展。 类比:汽车的分类体系。
Car
(有speed
、start()
等通用属性和方法)。ElectricCar
和GasCar
继承Car
,并扩展各自特性。通俗解释: 所有汽车(子类)都继承 “汽车” 这个大类的基本特性(轮子、方向盘),但可以添加自己的特色(如给汽车的充电功能)。
// 父类:普通汽车
public class Car {
public void drive() {
System.out.println("开车前进");
}
}
// 子类:电动车
public class ElectricCar extends Car {
public void charge() { // 新增充电功能
System.out.println("新增充电功能");
}
@Override
public void drive() { // 修改父类行为
System.out.println("电动引擎安静地启动");
}
}
定义:同一方法调用,根据对象类型不同表现出不同行为。 类比:汽车的喇叭。
关键点:
honk()
)。BMW
)时,无需修改honkAll()
方法。代码示例:
// 接口:定义汽车的行为
public interface Car {
void honk(); // 按喇叭方法
}
// 奔驰车
public class Benz implements Car {
@Override
public void honk() {
System.out.println("优雅的:哔~");
}
}
// 特斯拉
public class Tesla implements Car {
@Override
public void honk() {
System.out.println("电子合成音:哔~");
}
}
// 测试多态
public class Main {
public static void main(String[] args) {
Car benz = new Benz();
Car tesla = new Tesla();
honkAll(benz, tesla); // 统一调用按喇叭方法
}
public static void honkAll(Car... cars) {
for (Car car : cars) {
car.honk(); // 不同汽车的喇叭声自动区分
}
}
}
定义:忽略细节,提取共性,用抽象类或接口定义规范。 类比:汽车设计蓝图。
通俗解释: 汽车设计图只规定 “必须有四个轮子”“必须能启动”,但不规定具体用什么材料(钢轮还是铝轮)。
关键点:
Car
不能直接new Car()
)。start()
)必须由子类实现。Car
接口),不依赖具体类。// 抽象类:汽车设计蓝图
public abstract class Car {
public abstract void start(); // 抽象方法:必须启动
public void stop() { // 具体方法:默认实现
System.out.println("踩刹车停车");
}
}
// 燃油车实现
public class GasCar extends Car {
@Override
public void start() {
System.out.println("点火启动燃油发动机");
}
}
// 电动车实现
public class ElectricCar extends Car {
@Override
public void start() {
System.out.println("按下启动按钮,电动引擎就绪");
}
}
代码示例:
// 抽象类:汽车设计蓝图
public abstract class Car {
public abstract void start(); // 抽象方法:必须启动
public void stop() { // 具体方法:默认实现
System.out.println("踩刹车停车");
}
}
// 燃油车实现
public class GasCar extends Car {
@Override
public void start() {
System.out.println("点火启动燃油发动机");
}
}
// 电动车实现
public class ElectricCar extends Car {
@Override
public void start() {
System.out.println("按下启动按钮,电动引擎就绪");
}
}
官方定义: 接口是一种抽象类型,它只定义方法签名(名称、参数、返回值),但不包含方法体。实现接口的类必须实现接口中所有的方法。
汽车类比:
通俗解释: 汽车的 “充电接口”(如 Type-C、国标快充口),只要符合这个接口标准,任何充电桩都能充电。
关键作用:
汽车场景中的作用:
3. 代码示例:汽车充电接口
// 充电接口(规定必须有充电方法)
public interface Chargeable {
void charge();
}
// 特斯拉实现了充电接口
public class Tesla implements Chargeable {
public void charge() {
System.out.println("插入Type-C充电桩,开始充电");
}
}
// 比亚迪也实现了充电接口
public class BYD implements Chargeable {
public void charge() {
System.out.println("插入国标充电桩,开始充电");
}
}
加解锁的一个线程: 只读锁(共享的):多个读线程可以同时读取文件。 若一个读的线程先获取到资源,那么就要加一个只读锁、 在只读锁没有被释放的时候,别的线程就不能去更新(写)这个文件。 如果A线程把这个文件读完了,这个时候就可以把锁给释放掉。 就是说这个文件我不用了, 写锁(排他的):同一时间只允许一个线程写入,且写入时不允许其他线程读取。 解锁之后更新的线程可以获取一把写锁 他告诉别人我正在写,你们看着读,写完之后他把锁一解。