给零基础讲透:Java核心概念
父类/子类/继承 • 抽象类/接口 • 高层模块/底层模块
说明:本节内容主要讲清楚关于父类/子类/继承 • 抽象类/接口 • 高层模块/聚合这些概念,为后续软件设计原则与模式知识奠定基础。
一、父类、子类、继承(核心中的核心)
1.你可以把“类”理解成“事物的模板”,比如:
- 父类(也叫超类/基类):
就像“手机”这个通用模板,所有手机都有“打电话、发短信”的功能,还有”品牌、价格”这些属性;
-子类(也叫派生类):
就是具体的手机,比如“苹果手机”“"华为手机”,它们都属于“手机”,所以能直接用父类的“打电话、发短信”功能(不用重新造),还能加自己的特色功能(比如苹果的 Face ID、华为的鸿蒙系统); - 继承:
就是“苹果手机继承了手机的所有特性”,子类“继承”父类的所有属性和方法,不用重复写代码,就像你继承了父母的某些特征一样。
2、我们来看一段极简的代码,验证一下我们刚才的理解。这里定义了一个父类Phone,里面有品牌、价格两个属性,还有打电话、发短信两个方法。然后,我们定义了两个子类,IPhone和HuaweiPhone,它们都使用extends关键字继承了Phone类。这样,IPhone和HuaweiPhone就自动拥有了Phone类的所有属性和方法,同时还可以定义自己独有的方法,比如faceID和hongmeng。这就是继承的好处,代码复用,避免重复劳动。
3、核心要点
继承用关键字 extends ,Java 里子类只能继承1个父类(比如手机不能同时继承“手机”和“电脑”):子类能“复用”父类的代码,不用重复写“打电话”这种通用功能,,子类可以加自己的属性/方法,实现“通用 +个性化”。
二、抽象类:不完整的父类模板
- 生活场景:手机充电的困境
需求共性:所有手机都需要“充电”,但接口不同(Lightning/Type-C)。
传统痛点:父类无法预知所有子类的具体实现方式,写死逻辑会导致僵化。 - 核心概念:抽象类的定义
只声明不实现:父类定义抽象方法(如“充电”),但不写具体代码,强制子类去实现。
“半成品”模板:抽象类保留通用逻辑,将差异化的部分留给子类填充,实现代码复用。 - 代码示例
// 抽象类定义abstractclassPhone{// 通用方法实现publicvoidcall(){System.out.println("打电话");}// 抽象方法:强制子类实现publicabstractvoidcharge();}/子类1:IPhoneclassIPhoneextendsPhone{@Overridepublicvoidcharge(){System.out.println("Lightning接口");}}// 子类2:HuaweiPhone (同理实现Type-C)4 核心要点
关键字定义:使用abstract class定义抽象类,使用abstract定义抽象方法。
不能实例化:抽象类是“半成品”,不能直接 new 对象,只能作为父类被子类继承。
必须实现:子类继承抽象类后,必须实现所有抽象方法(除非子类本身也是抽象类)。
核心作用:提取子类的“通用部分”,把“差异化部分”留空让子类实现,实现代码复用。
三、接口:纯粹的行为约定
- 生活中的例子:行为的抽象
手机 (Mobile):不同的硬件设备,但具备相同的“上网”行为
电脑 (Computer):接口定义了“能做什么”,而非“是什么”
平板 (Pad):只要实现了“可上网”接口,就必须具备上网能力 - 核心概念:一份契约
签署契约 (Implement):一旦实现了某个接口,就必须遵守接口中定义的所有约定(即实现所有方法)。
无关身份 (Irrelevant):接口不关心你具体是什么类,只关心你是否具备该行为能力。 - 代码示例实现
// 接口定义interfaceCanSurfInternet{voidsurf();}// 手机实现接口classIPhoneimplementsCanSurfInternet{publicvoidsurf(){System.out.println("用5G上网");}}- 核心要点
关键字定义:使用interface定义接口,类通过implements关键字实现接口。
不可实例化:接口本身不能直接new 对象,只能指向其实现类的实例对象。
支持多实现:弥补单继承的局限,Java类虽然只能继承1个父类,但可以实现多个接口。
核心作用:定义“行为标准”,解耦“做什么”和“怎么做”,提升代码的灵活性与扩展性。
四、高层模块:指挥干活的老大
生活例子:公司架构
高层模块:销售部门,负责核心逻辑(谈单、下单),只指挥“送什么、送到哪”,不关心运输细节。
底层模块:物流团队,负责具体执行(送货),处理“怎么送、用什么车”等底层细节。代码映射:软件架构
高层模块:订单系统,调用其他代码,实现核心业务逻辑(如创建订单),不关心支付具体实现。
底层模块:支付接口,被调用的代码,实现具体细节(如微信支付、支付宝支付的API对接)。代码示例
```java // 高层模块:订单系统(核心逻辑) class OrderSystem { // 依赖抽象接口 Pay,而非具体实现 public void createOrder(double money, Pay pay) { System.out.println("创建订单成功"); pay.pay(money);// 调用底层模块 } } // 测试:高层模块代码无需修改即可扩展 classTest { public static void main(String[] args) { OrderSystem order =new OrderSystem(); order.createOrder(99.9,new WeChatPay()); order.createOrder(59.9,new AliPay()); ```
说明:依赖抽象,而非具体,OrderSystem 仅依赖 Pay 接口,与具体的微信或支付宝实现解耦,符合开闭原则。
高层模块稳定不变,新增支付方式(如银行卡)只需新增实现类,核心业务逻辑代码无需修改。
灵活扩展,通过接口隔离,高层模块可以轻松切换不同的底层实现,提升系统的灵活性。
五、总结
- 父类/子类/继承:子类继承父类通用功能,使用 extends 关键字,支持单继承。
- 抽象类:不完整的父类模板,包含通用方法与抽象方法,不能实例化。
- 接口:纯粹的行为约定,使用 implements 关键字,支持多实现。
- 高层模块:核心逻辑层,应依赖接口或抽象类,而非具体的底层细节。
