面向对象编程:从类到多态的实战指南
2026/8/11 6:47:34 网站建设 项目流程

实例:

1)电话卡类

2)套餐类

1、面向对象编程(OOP

面向对象编程是一种以 “对象” 为核心的编程思想,把现实中的事物抽象成程序里的 “类” 和 “对象”,通过封装、继承、多态来管理代码。

如上图中,我们把 “移动卡”“套餐”这些现实概念,抽象成了对应的类。

1)类和对象

类是对象的模板,对象是类的实例。

类是对象的抽象模板(设计图纸),定义了对象的属性(特征)和方法(行为)。如学生模板,定义学号、姓名、性别、专业、学习。学生就是类,学号、姓名、性别和专业就类是属性,学习就类的行为。

对象是根据图纸造出来的实例,是类在内存中创建的具体实体。真实的一个学生是有具体学号(2301010122)和姓名(张三)的, 一个学生模板,可以填写很多学生信息,即一个类可以创建无数个对象。

本例中的话唠套餐、 网虫套餐、超级套餐类、电话卡就是类,资费、通话时长、短信条数、上网流量就是套餐的属性。打印信息、通话、发短信、上网就是套餐的行为。电话卡有卡号、余额等属性,行为有打电话、上网等。

一张真实的话唠套餐(58 元 / 月,500 分钟通话) 一张真实的网虫套餐(68 元 / 月,10GB 流量) 一张真实的手机号卡( 13800138000)这些就是对象

2)类和对象的关系(总结 4 句)

  1. 类是抽象的,对象是具体的
  2. 类是对象的模板
  3. 对象是类的实例
  4. 一个类可以创建多个对象

2、类的封装与继承

1)封装

封装是把类的属性私有化(用 private 修饰),通过 public 的 getter/setter 方法对外提供访问和修改的入口,隐藏内部实现细节。

例:电话卡中的卡号cardNumber是 private 的,外部只能通过 getCardNumber() 方法读取,通过setCardNumber()方法修改卡号,但余额balance,外部可以通过 getBalance() 方法来读取余额,但不能修改余额,所以就不提供setMony()方法,保证数据安全。

2)继承

(1)父类

如果多个类(is-a)有相同的属性和方法,可以将相同属性和方法抽取出来,写成一个共同的父类(抽象类),由子类继承父类,子类继承父类后自动拥有父类的属性和方法,还可以扩展自己的功能(各个子类有不同的属性和方法),实现代码复用。

例:话唠套餐TalkPackage、超级套餐SupperPackage、网虫套餐NetPackage 都继承自抽象类 ServicePackage,所以它们都自带名称name、资费 price 属性和showInof方法。

其中showInfo方法强制所有套餐子类实现自己的套餐信息展示逻辑,比如话唠套餐要显示通话时长和短信数,网虫套餐要显示流量,超级套餐要显示全部信息。这种方法需要写成抽象方法(只有方法声明,没有方法体),因为方法的实现强制在各个子类实现。

(2)抽象类和最终类

抽象类(abstract):必须被继承,不能直接 new 对象,用来当父类模板。抽象类可包含抽象方法,用于定义子类的统一规范。

最终类(final):禁止被继承,是 最后一代,不能再有子类。即不能被继承。最终类可实例化,用于保护类的实现不被修改扩展。

3、接口与多态

1)接口

接口是一种特殊的抽象类型,只定义方法的签名,不提供具体实现,用来定义 “行为规范”和“具备的能力”。

  1. 继承表示 is-a 关系:子类是父类的一种,强调 “属于”。
  2. 接口表示 can-do 关系:类具备接口定义的行为能力,强调 “能做”。

例:图中的 CallService、SendService、NetService 是接口,分别定义了通话、短信、上网的行为规范或行为能力。

套餐类通过实现这些接口,来获得对应的服务能力(比如 TalkPackage 实现了 CallService 和 SendService,说明它支持通话和短信服务)。

如:前端工程师(编程),开发工程师(编程),学生(编程)三个类,前端工程师和开发工程师是一个员工(is-a),可以继承,但学生不是一个员工,不能继承。解决方法是将编程写成一个接口,三个子类就可以实现这个接口(can-do),即全具有编程能力。

2)多态

同一类型的对象,调用同一个方法时,表现出不同的行为。即抽象类或接口的同一个方法,在不同的子类实现不同。这个方法就是抽象方法。抽象方法是没有实现的,只能在子类去实现。

记住三句话:

  1. 继承是多态的基础
  2. 子类重写父类(接口)方法
  3. 父类指向子类的应用

例:ServicePackage 类型的变量,可以指向 TalkPackage、SupperPackage、NetPackage 任意一个子类对象;

调用 call() 方法时,会根据实际对象的类型,执行不同的实现(多态的动态绑定)。

4、几个关键字

1)abstract(抽象)

意思:抽象、只定义规则,不写具体实现

用法:修饰类(不能 new)、修饰方法(没有方法体)

2)final(最终)

意思:最终的、不可改变的

用法:

修饰类:不能被继承

修饰方法:不能被重写

修饰变量:变成常量,不能改值

3) static(静态)

意思:静态的、属于类的,不属于对象

用法:修饰变量、方法、代码块

特点:用类名直接调用,不用 new 对象

4)this(本对象)

意思:代表当前对象自己

用法:

访问本类属性:this.name

调用本类方法:this.method()

调用本类构造:this()

5)super(父对象)

意思:代表父类对象

用法:

访问父类属性:super.name

调用父类方法:super.method()

调用父类构造:super()

5、四种修饰符

修饰符

同类

同包

子类

不同包

public

protected

default

private

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询