OOP: 继承以及多态

systemverilog-OOP:封装、继承和多态 类的封装、继承和多态1.面向对象的三个基本特征1.1 类与结构体的差异2.封装3.继承3.1 成员访问权限4.多态 1.面向对象的三个基本特征 对象:万物皆对象 类:类就是具有相同属性和行为的对象的抽象的集合 实例:对象就是类的实例 封装可以隐藏实现细节,使得代码模块化;继承可以扩展已经存在的代码模块,两者的目的都是为了代码重用,多态为了实现另一个目的——接口重用。 1.1 类与结构体的差异 结构体(struct)可以自定义一个类型,类也是一种类型,那类与结构体的异同在于: 二者本身都可以定义数据成员 阅读详情

Wednesday, October 10 2001 8:30 PM

在"OOP简介:理解类和对象"这篇文章中,我们讨论了继承和多态性的好处.我们还粗略的学习了如何扩展基类定义子类,继承基类中合适的行为和属性而重载那些并不适合的行为和属性.这种方式能够削减代码宏余以及错误的堆积.

现在我们将更深入的考察多重继承性以及Java是如何处理它的.我们还将通过学习动态绑定来学习多态性.

深入继承性
一些面向对象的语言提供叫做"多重继承"的特点,当一个对象需要从多于一个的基类继承行为和属性的时候这是有价值的.多重继承在有些情况下是复杂的.例如,假设我们需要定义一个基类,Animal,然后是Animal的两个子类,LandAnimal 和 WaterAnimal.现在我们想要定义一个类来代表青蛙.青蛙是两栖动物,所以我们自然会想到定义Frog类从LandAnimal和WaterAnimal类继承.这使得Frog类能够同时从LandAnimal 和WaterAnimal类继承所需的行为和属性.

初看起来这是相当简单的;但是,让我们为Animal添加一个叫做LivingEnvironment的属性,并用方法getLivingEnvironment来返回它.我们假设LandAnimal 和 WaterAnimal类都重载了这个方法来实现特殊的功能.LandAnimal将返回Land作为它的LivingEnvironment属性的值,而WaterAnimal将返回Water作为它的LivingEnvironment属性的值.现在,当我们将Frog类作为LandAnimal 和 WaterAnimal 子类实现的时候,想要得到Frog的LivingEnvironment属性值,这时将遇到一个麻烦:Frog类的getLivingEnvironment方法是返回Land值呢还是Water值?答案取决于编译器如何处理多重继承.

我在前面的文章里就已经说过,Java不支持多重继承.但它确实允许一个对象通过使用叫做"接口"的功能拥有多个特性.下面的例子显示了定义LandAnimal的接口的可能的定义代码:
public interface LandAnimal
{
    public int getNumberOfLegs();
    public boolean hasATail();
}


一个使用接口的类在类定义语句的开始添加implements+接口名.例如,在Java中,我们会以下面的方式定义Frog类:


public class Frog extends Animal implements LandAnimal, WaterAnimal

接口并没有什么实际的功能;相反,它的作用是联系使用者和实现了这个接口的对象.接口保证了对象实现接口定义的方法.而且,一个实现接口的对象能够在运行时被强制转换成接口类型.例如,使用上面的Frog定义,并且假设LandAnimal类定义了一个叫做getNumberOfLegs的方法而WaterAnimal定义了一个叫做hasGills的方法,那么一个Frog类的实例可以在运行时被强制转换成LandAnimal或WaterAnimal对象:


Frog aFrog = new Frog();
int legCount = ((LandAnimal)aFrog).getNumberOfLegs();
Boolean gillFlag = ((WaterAnimal)aFrog).hasGills();



注意Forg为什么能够被强制转换成一个LandAnimal对象即使实际的LandAnimal对象并没有被创建.这使得我们能够在运行时以其带有的任何"身份"调用一个对象,这就是所谓的"动态绑定"或"运行时绑定".

深入多态性
Java使用动态绑定来使多态成为可能,它指的是Java用来在运行时选择调用的方法或对象的机制.重载构成了了Java中的一种特殊的多态机制,它表现在当一个类的两个或者两个以上的方法拥有相同的名字但是不同的参数列表,或者说"方法签名".一个方法的签名指的是方法的名字以及参数的类型和数目.类的每一个方法都有与之相关的唯一的签名.类可以有多个名字相同的方法只要它们的参数列表是唯一的.例如,我们能够为Animal类定义两个名字为getHello的方法,用其中一个方法来获得动物通常的叫声,而用另一个获得当动物被惊吓或是抚摩的时候的叫声.我们将给每一个方法唯一的签名:

public String getHello();
public String getHello(int mood);



现在,让我们修改例子程序来将我们讨论的一些概念付诸实践:
 

public class HelloWorld
{
public static void main(String[] args)
{
Dog animal1 = new Dog();
Cat animal2 = new Cat();
Duck animal3 = new Duck();

System.out.println("A dog says " +animal1.getHello()
+", when scared says: " +animal1.getHello(Animal.SCARED)
+", is carnivorous: " +animal1.isCarnivorous()
+", is a mammal: " +animal1.isAMammal());
System.out.println("A cat says " +animal2.getHello()
+", when comforted says: " +animal2.getHello(Animal.COMFORTED)
+", is carnivorous: " +animal2.isCarnivorous()
+", is a mammal: " +animal2.isAMammal());
System.out.println("A duck says " +animal3.getHello()
+", when scared says: " +animal3.getHello(Animal.SCARED)
+", is carnivorous: " +animal3.isCarnivorous()
+", is a mammal: " +animal3.isAMammal());
}
}

abstract class Animal
{
public static final int SCARED = 1;
public static final int COMFORTED = 2;

public boolean isAMammal()
{
return(true);
}

public boolean isCarnivorous()
{
return(true);
}

abstract public String getHello();
abstract public String getHello(int mood);
}

interface LandAnimal
{
public int getNumberOfLegs();
public boolean hasATail();
}

interface WaterAnimal
{
public boolean hasGills();
public boolean laysEggs();
}

class Dog extends Animal implements LandAnimal
{
// 重载父类的方法
public String getHello()
{
return("Bark");
}

public String getHello(int mood)
{
switch (mood) {
case SCARED:
return("Growl");
case COMFORTED:
return("");
}

return("Bark");
}

// LandAnimal 接口的实现
public int getNumberOfLegs()
{
return(4);
}

public boolean hasATail()
{
return(true);
}
}

class Cat extends Animal implements LandAnimal
{
// 重载父类的方法
public String getHello()
{
return("Meow");
}

public String getHello(int mood)
{
switch (mood) {
case SCARED:
return("Hiss");
case COMFORTED:
return("Purr");
}

return("Meow");
}

// LandAnimal 接口实现
public int getNumberOfLegs()
{
return(4);
}

public boolean hasATail()
{
return(true);
}
}

class Duck extends Animal implements LandAnimal, WaterAnimal
{
// 重载父类的方法
public String getHello()
{
return("Quack");
}

public String getHello(int mood)
{
switch (mood) {
case SCARED:
return("Quack, Quack, Quack");
case COMFORTED:
return("");
}

return("Quack");
}

public boolean isAMammal()
{
return(false);
}

public boolean isCarnivorous()
{
return(false);
}

// WaterAnimal 接口实现
public boolean hasGills()
{
return(false);
}

public boolean laysEggs()
{
return(true);
}

// LandAnimal 接口实现
public int getNumberOfLegs()
{
return(2);
}

public boolean hasATail()
{
return(false);
}
}


程序执行后输出的结果如下:

A dog says Bark, when scared says: Growl, is carnivorous: true, is a mammal: true
A cat says Meow, when comforted says: Purr, is carnivorous: true, is a mammal: true
A duck says Quack, when scared says: Quack, Quack, Quack, is carnivorous: false, is a mammal: false

总结
综合继承,多态和接口的概念提供了一组强大的编程工具,允许我们重用代码,隔离错误的发生,并获得动态/运行时绑定带来的好处.在下一篇文章里,我们将讨论如何使用Java的变量作用域/可见域规则来控制方法和属性的暴露问题.

OOP的三大特性:封装、继承、多态 ​​1. 核心概念​​​​2. 示例​​ java 复制 public class Person {     // 私有属性,外部无法直接访问     private String name;     private int age;     // 公共方法:提供对属性的受控访问     public String getName() {         return 阅读详情

相关推荐

面向对象编程本质:从孔明棋看OOP的封装、继承与多态

面向对象编程(OOP)是一种以现实实体为建模基础的程序设计范式,其核心在于将状态、行为与责任边界统一于对象之中。它通过封装实现数据与操作的内聚保护,避免全局变量导致的状态不一致;借助继承支持在保持原有逻辑基础上安全扩展功能,如为标准棋盘添加倒计时机制;依托多态建立基于协议的松耦合协作,使胜利检测器无需知晓具体棋类即可通用工作。OOP的价值不在语法形式,而在于应对状态复杂、交互频繁、需求演进的系统场景——正如孔明棋中棋子位置、跳跃规则、胜负判定与悔棋重播构成的长链变化,唯有对象化建模才能保障可维护性与可扩展性

weixin_42116058的博客 81

oop思想(封装、继承、多态)

封装n  分析需求,用封装方式设计类,画出类图u  汽车销售人员销售汽车,可售款式有凯越、君威Ø 每款汽车有款式和编号,款式、编号不能修改(private)Ø 汽车销售人员有姓名,姓名不能修改(private)u  销售人员有两种销售方式:(两种销售方法)Ø 按车辆销售,每次一辆Ø 按车型销售(凯越),要同时告诉销售人员购买数量publicclass Excelle {       privat...

brid_fly的博客 9435

深入理解OOP:继承、多态与指针的奥秘

本章深入探讨了面向对象编程中的继承、多态以及指针的高级用法。通过对教师、官员和打字员等类的继承结构的扩展,展示了如何在程序中加入新的数据类以丰富信息。同时,介绍了C++中多态的两种形式:静态绑定和动态绑定,以及如何使用虚函数实现运行时多态。最后,本章还详细解释了指针的概念、声明和初始化,以及如何使用指针变量指向其他数据类型或指针。

weixin_36231030的博客 356

C#OOP深入——基本讲解

一:属性 语法: [访问修饰符] 数据类型 属性名 { get { 返回私有的字段; } set { 设置私有的字段; } } 自动属性 public char Sex { get; set; } 使用快捷键封装属性:ctrl+R+E 优点:控制私有字段的可访问性 保护内部数据的安全性和合法性 二、索引器 1、索引器是一种特殊的类成员 2、允许按照数组的方式检索对象的数组元素 3、索引器的定义语法与属性类似...

ZhuJiHan的博客 374

微磁模拟实战指南:从OOMMF安装到首个3D模型运行

本文详细介绍了OOMMF微磁模拟软件的安装与使用,从环境配置到首个3D模型运行的完整教程。涵盖Windows、Linux和macOS平台的安装避坑指南,以及MIF文件编写、并行计算优化等实战技巧,帮助研究人员快速掌握这一开源工具在磁畴壁运动、磁滞回线等微磁学问题中的应用。

weixin_29294597的博客 153

从零搭建Python接口自动化测试框架:pytest+requests+Allure实战指南

接口自动化测试是现代软件工程中保障交付质量、提升测试效率的核心实践。其基本原理是通过脚本模拟客户端请求,对服务端接口进行自动化的功能验证、性能探测与回归测试,从而替代重复的手工操作。在技术实现上,Python凭借其简洁语法和丰富的生态,成为构建此类框架的主流选择,其中pytest测试框架、requests HTTP库和Allure报告工具构成了技术栈的黄金组合。这套技术方案的价值在于,它能将测试用例数据(如YAML文件)与执行逻辑分离,实现数据驱动测试,并通过持续集成(如Jenkins)无缝融入DevOps

weixin_31822733的博客 378

Java基础回顾_深入OOP常见错误精髓

package java基础错误; //错误一 abstract class Name { private String name; // public abstract boolean isStupidName(String name){}//申明抽象的方法不能实现,必须通过继承才能实现...

chuolin8358的博客 203

IST——In-System-Test

安全性是自动驾驶平台的关键特性之一,而这些架构中使用的半导体芯片必须保证ISO 26262标准所要求的功能安全方面。为了监控由于现场缺陷导致的故障,在启动和/或关闭期间会自动运行系统内结构测试。当系统内测试(IST,In-System-Test)架构检测到任何永久性缺陷时,驾驶平台会做出响应,以实现系统的故障安全状态。汽车IC采用高质量测试方法进行筛选,以实现接近零的DPPM(每百万缺陷部件)。即使在这样的高测试标准下,由于环境或操作条件的影响,在系统现场运行过程中仍可能出现可靠性缺陷。

weixin_50518899的博客 3206

OOP三个基本特征:封装、继承、多态

OOP三个基本特征:封装、继承、多态 C++编程之—面向对象的三个基本特征 默认分类 2008-06-28 21:17:04 阅读12 评论1字号:大中小     面向对象的三个基本特征是:封装、继承、多态。     封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。   封装,也就是把客观事物封装成抽象的类

u013443618的专栏 2134

【unity实战】Cinemachine虚拟相机实战,使用InputSystem+Cinemachine+CharacterController复刻各种主流游戏的相机控制

这里主要是探讨如何使用InputSystem+Cinemachine+CharacterController复刻各种主流游戏的相机控制,我们主要专注Cinemachine实战效果,所以并不会深入讨论Cinemachine和CharacterController比较细节的参数介绍。注意:前面为了测试方便,我还是先用的旧的输入系统代替InputSystem【推荐100个unity插件之10】Unity最全的最详细的Cinemachine(虚拟相机系统)介绍,详细案例讲解,快速上手。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3750

EtherCAT主站SOEM -- 1 -- SOEM之ethercattype.h文件分析

“ethercattype.h” 文件用于支持 EtherCAT 网络通信,提供了各种类型定义和宏,以便开发者更轻松地开发 EtherCAT 相关应用程序。这些定义包括数据类型、命令类型、状态类型和错误类型,以支持 EtherCAT 通信。根据具体应用需求,还可以调整一些超时和帧长度设置。这些定义用于处理函数调用的结果,如 EC_NOFRAME(没有帧返回)、EC_ERROR(一般错误)、EC_TIMEOUT(请求超时)等。这些定义用于处理 EtherCAT 命令,例如 EC_CMD_APRD(自动递增读取

常驻客栈的博客--嵌入式EtherCAT 2714

理解OOP三大特征:封装 继承 多态

一、OOP三大特征之封装 1.什么是封装? 使用private修饰类的成员变量和方法,使得只能在本类中使用和修改这些成员变量和方法,类外如果想要访问需要通过接口来实现。 好处是类的实现对类外不可见比较安全,而对类的调用者来说不需要知道类的实现细节,直接调用公有方法,降低了代码管理的复杂度。 2.this关键字 代表当前对象的引用,①可以使用this()调用当前类的构造方法;②this.属性名 调用当前类的属性;③this.方法名() 调用当前类的成员方法。 注意:new一个对象需要先在堆上开辟内存,然后调用

nefss_的博客 481

lammps教程:FeNiCr合金多晶结构建模方法

大家好,我是小马老师。 本文介绍合金多晶模型的建模过程,使用的软件为Atomsk。 Atomsk是一个开源软件,可运行在windows、linux等多种操作系统上,本文使用windows版的Atomsk实现建模,其他操作系统的建模命令基本相同。 建模过程如下: 1. 生成单晶Fe晶胞 atomsk --create fcc 3.65 Fe Fe.xsf 2. 建立多晶节点文件polycrystal.txt 新建一个文本文件polycrystal.txt,文件内容为: box 200 100 200 ran

lammps_jiayou的博客 6658

OOP(面向对象)三大特性:封装、继承、多态

OOP(面向对象)三大特性:封装、继承、多态

lsh8886的博客 523

使用STM32实现简单的语音识别

此外,还需要将计算机的音频输出连接到外部音频放大器上,以便将测试语音播放到MAX9814麦克风模块。运行STM32代码后,系统将开始采集语音数据,并在采集完成后调用Python脚本进行MFCC特征提取。在本案例中,我们将使用STM32F4开发板、MAX9814麦克风模块和MFCC特征提取算法来实现语音识别。通过这个案例,我们可以了解到如何结合STM32开发板和Python实现语音识别,并可以根据需要进行相关扩展和优化。现在,我们可以编译和烧录STM32代码到开发板中,并准备好测试语音文件。

吃不胖. 1473

【微信小程序】微信小程序 manifest.json 配置 ES6 转 ES5 开关:3步让你的代码兼容性更强

ES6(ECMAScript 6)是 JavaScript 的最新标准,引入了许多新的语法和特性,如箭头函数、模板字符串、解构赋值等。然而,不是所有的环境都支持 ES6,特别是旧版本的浏览器和一些特定的运行环境。为了确保代码的兼容性,我们需要将 ES6 代码转换为 ES5 代码。通过本文的详细讲解,相信你已经学会了如何在文件中配置微信小程序的 ES6 转 ES5 开关。这个小小的配置步骤能够显著提高代码的兼容性和稳定性。如果你有任何问题或需要进一步的帮助,欢迎随时留言交流。

java专栏 1359

OOP的三大特征:封装、继承、多态

主要对封装、继承、多态这三大特性进行分析以及总结,再举一些实际的案例,便于理解。

qq_45283185的博客 1008

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Day 15:【99天精通Python】面向对象编程(OOP)中篇 - 封装、继承与多态

本文介绍了Python面向对象编程的三大核心特性:封装、继承和多态。在封装部分,讲解了如何通过私有属性(__前缀)保护数据安全,并提供公共方法访问。继承部分展示了子类如何复用父类代码,包括方法重写和super()函数的使用。多态则通过不同子类实现相同方法产生不同行为,并介绍了Python特有的鸭子类型概念。文章通过工资管理系统实例演示了继承与多态的实际应用,最后用Mermaid图表直观展示类继承关系,并解答了常见问题。

weixin_52694742的博客 2115

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python OOP三大特性详解:继承、封装、多态

本文系统讲解了Python面向对象编程的三大特性:封装、继承和多态。封装通过私有属性与公有方法保护数据安全;继承实现代码复用与扩展,支持方法重写;多态则允许不同子类对同一方法呈现不同行为。文章通过学生管理系统的实例(如本科生、研究生类),展示了三大特性如何协同工作,提升代码的可维护性和扩展性。掌握这些特性有助于编写更优雅、灵活的Python代码。

qq2745567641的博客 1358

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Python精讲 08】面向对象(OOP)一篇通:类、继承、封装与多态核心精讲

本文系统介绍了面向对象编程(OOP)的核心概念。从类与对象的区别讲起,通过宠物店的例子说明OOP将数据和行为封装成对象实体的优势。重点讲解了构造方法__init__和self关键字的作用,以及属性与方法的定义。深入剖析了OOP三大支柱:继承实现代码复用、封装保护数据安全、多态提供统一接口。最后总结OOP通过类与对象、继承、封装和多态等机制,使代码更结构化、可维护和可扩展。文章为后续模块与包的内容做了铺垫。

zcz0101的博客 900

掌握OOP核心:封装、继承、多态全解析

模块 5:原型链 5.1 原型链结构 实例 → 子类原型 → 父类原型 → Object.prototype → null。5.2 查找规则 沿原型链自下而上查找,直到找到或到达 null。模块 6:异常处理 6.1 try-catch-finally。模块 3:原型对象(prototype)3.3 constructor 属性。3.1 原型对象的核心特性。

qq_32936241的博客 900

OOP魔法:封装、继承、多态与抽象解析

本文阐述了创新与持续改进在企业发展中的重要性,分析了如何营造创新环境、培养改进意本文深入探讨了面向对象编程(OOP)的四大核心概念:封装、继承、多态与抽象。通过详实的应用场景和实用技巧,我们揭示了这些概念在软件开发中的重要性和实际应用。通过封装,我们提高了代码的安全性和可维护性;通过继承,我们实现了代码的复用和扩展;通过多态,我们提高了代码的灵活性和通用性;通过抽象,我们将复杂问题简化,提高了代码的可识,并分享了实用的技巧与案例。文章强调,通过鼓励团队创新思维与持续改进意识,企业能适应市场变化,保持竞争力。

silenceallat的博客 1070

深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)

在本系列中,我们以CodeProject上比较火的OOP系列博客为主,进行OOP深入浅出展现。 无论作为软件设计的高手、或者菜鸟,对于架构设计而言,均需要多次重构、取舍,以有利于整个软件项目的健康构建,有些经验是前辈总结的,我们拿来使用即可,有些是团队知识沉淀的,总之复用前人好的思想有利于减少返工。当然,在面试的时候,如果能围绕OOP大谈特谈,自然会加分多多的。 开始阅读本系列博客的...

245

OOP: 深入继承以及多态

Wednesday, October 10 2001 8:30 PM 在"OOP简介:理解类和对象"这篇文章中,我们讨论了继承和多态性的好处.我们还粗略的学习了如何扩展基类定义子类,继承基类中合适的行为和属性而重载那些并不适合的行为和属性.这种方式能够削减代码宏余以及错误的堆积.现在我们将更深入的考察多重继承性以及Java是如何处理它的.我们还将通过学习动态绑定来学习多态性.深入继承性一些面向对象

A Little Bit More...... 981

封装 继承 多态_OOP编程思想:封装、继承、多态

面向对象编程(Object-Oriented Programming)与面向过程(Procedure Oriented ) 两种方法都是编程中的比较常用的方法,从理论上来说,都能达到用计算机程序来解决实际问题的目的, 只不过是其中所体现出来的思想不一样而已。面向过程:面向过程的思想是把一个项目、一件事情按照一定的顺序,从头到尾一步一步地做下去,先做什么,后做什么,一直到结束。这种思想比较好理解,其...

weixin_39889487的博客 128
上一篇: OOP: 理解类和对象
下一篇: OOP: 限制对象属性的访问
botree
博客等级 码龄25年 2粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值