面向对象的实现

面向对象的实现
对象之间存在的关系如下:
继承关系
继承关系使用extends关键字来实现,通常父类具有的属性子类都有,另外子类会有一些特殊的属性,继承父类之后,只需要在子类中添加新的成员变量就可以了。
这里需要关心的是这些成员变量在哪里进行初始化?对于子类新创建的成员变量肯定是在子类中就行初始化,通常情况下是在构造函数中进行初始化。对于从父类继承过来的成员变量可以在父类中初始化,也可以在子类中进行初始化,如果是在父类的构造函数中初始化,需要在子类的构造函数中调用父类的构造函数,如果调用默认的构造函数子类中可以不显式调用。
public class A
{
private int a;
public A()
{
a = 0;
}
public A(int a)
{
this.a = a;
}
}
一个成员变量,两个构造函数,第一个赋默认值0,第二个赋给定的值。
public class B extends A
{
private int b;
public B()
{
b = 0;
}
public B(int a,int b)
{
super(a);
this.b = b ;
}
public void setB(int b)
{
this.b = b;
}
public int getB()
{
return b;
}
}
无参数的构造函数是默认的构造函数,实际上在初始化的时候调用了父类的无参数构造函数,第二个构造函数通过关键字super显式的调用了父类的构造函数。
一对一的关系
一对一的关系,例如A和B两个之间的关系就是一对一的关系,每个A要么对应一个B要么不对应B,而每个B要么对应一个A要么不对应。
一对一的关系使用Java来实现,需要把一个类的对象作为另外一个类的成员变量,一对一的关系可以是双向的,可以是单向的,主要根据需要来确定,如果仅仅需要根据一个对象找到另一个对象,这种关系就是单向的,如果需要根据任意一方找到另外一方,这种关系就是双向的。
假设A和B是一对一的关系,并且这种关系是单向的,只需要根据A定位B,关系的定义如下:
public class A
{
public B b;
public void setB(B b)\
{
this.b = b;
}
public B getB()
{
return b;
}
}
如果是关联关系,b仅仅是引用,A和B的关联通常会有下面的代码:
A a1 = new A();
B b1 = new B();
a1.setB(b1);
从上面的代码可以看出,这种关联关系应该是先有对象存在,然后通过set方法来建立这种关系。
如果是包含关系,这种关系的建立通常是在创建包含对象的时候创建,也就是说通常会在构造函数中编写,也就是说当组件存在的时候,才去创建整体,当然这不是绝对的。
如果是包含关系,首先类的代码可能是这样的:
public class A
{
public B b;
public A(B b)
{
this.b = b;
}
public void setB(B b)
{
this.b = b;
}
public B getB()
{
return b;
}
}
对象创建的代码可能是下面的样子:
B b=new B();
A a = new A(b);
把B的对象作为参数来创建A的对象。
如果是双向关系,这时候只能是关联关系,不能是包含关系,类的定义需要定义成如下的形式:
public class A
{
B b;
public void setB(B b)
{
this.b = b;
}
public B getB()
{
return b;
}
}
public class B
{
A a;
public void setA(A a)
{
this.a = a;
}
public A getA()
{
return a;
}
}
关系的建立通过下面的代码:
A a1 = new A();
B b1 = new B();
a1.setB(b1);
b1.setA(a1);
这里需要注意的是两个对象之间并不是包含关系,有人会说A是B的成员变量,B又是A的成员变量,就像鸡和蛋的问题,到底应该是先有A还是先有B。其实,可以这样去想,学过C或者C++的人都知道指针,在这里是引用,可以理解为相互引用,是对象的引用作为成员,而不是对象作为成员。
另外需要注意的是因为A作为B的成员变量,B又作为A的成员变量,在编译A的时候会用到B,同时在编译B的时候会用到A,没有办法单独编译,所以如果是这种双向关系,需要同时编译。使用:
javac *.java
关系的访问,可以根据一个对象访问与它相关联的对象,例如有A的对象a1,可以访问与a1关联的B的对象,不管是关联关系还是包含关系,访问的方法是相同的:
B temp = a1.getB();
//temp指向a1关联的对象,这样访问temp就可以了。
一对多的关系
一对多的关系需要定义集合类型的对象作为成员变量:假设A和B是一对多的关系。
public class A
{
Collection bs;
//设置元素的方法
public A
{
bs = new ArrayList();
}
public void setBs(Collection c)
{
bs = c;
}
//获取元素的方法
public Collection getBs()
{
return bs;
}
//添加元素的方法
public void addB(B b)
{
if(bs==null)
bs = new ArrayList();
bs.add(b);
}
public void removeB(B b)
{
if(bs!=null)
bs.remove(b);
}
}
public class B
{
A a;
public void setA(A a)
{
this.a = a;
}
public A getA()
{
return a;
}
}
如果是包含关系,通常不需要在B类中创建与A对象的关联。
关系的建立与操作:
A a1 = new A();
//创建A的对象
for(int i=1;i<5;i++)
{
B temp = new B();
//创建B的对象
temp.setA(a1);
//建立B对象与A对象之间的关系
a1.addB(temp);
//建立A对象与B对象之间的关系
}
关系的访问,一对多的关系的访问要稍微复杂一些。B中访问A的过程与前面的一对一情况相同,通过A访问B的代码如下:
Object[] bs = a1.getBs().toArray();
//对关联的对象进行遍历
for(int i=0;i<bs.length;i++)
{
B temp=(B)bs[i];
//temp指向某个元素,进行操作就可以了
System.out.println(temp.toString());
//这里a1所关联的所有对象的信息显示在控制台
}
多对多的关系
多对多的关系只能是关联关系,如果只考虑单向关系,与一对多的关系相同,所以这里介绍的是双向关系。
多对多的关联关系的定义如下:
public class A
{
Collection bs;
//设置元素的方法
public A
{
bs = new ArrayList();
}
public void setBs(Collection c)
{
bs = c;
}
//获取元素的方法
public Collection getBs()
{
return bs;
}
//添加元素的方法
public void addB(B b)
{
if(bs==null)
bs = new ArrayList();
bs.add(b);
}
public void removeB(B b)
{
if(bs!=null)
bs.remove(b);
}
}
public class B
{
Collection as;
//设置元素的方法
public B
{
as = new ArrayList();
}
public void setAs(Collection c)
{
as = c;
}
//获取元素的方法
public Collection getAs()
{
return as;
}
//添加元素的方法
public void addA(A a)
{
as.add(a);
}
public void removeA(A a)
{
if(as!=null)
as.remove(a);
}
}
关系的建立比较复杂,假设有5个A的对象,有4个B的对象,它们的关系如下:

a1
a3
a2
b1
b3
b2

这些关系的建立,需要下面的代码:
A a1 = new A();
A a2 = new A();
A a3 = new A();
A a4 = new A();
A a5 = new A();
//A对象的创建
B b1 = new B();
B b2 = new B();
B b3 = new B();
B b4 = new B();
//B对象的创建
a1.add(b2);
a2.add(b1); a2.add(b3);
a3.add(b1); a3.add(b2); a3.add(b3);
b1.add(a2); b1.add(a3);
b2.add(a1); b2.add(a3);
b3.add(a2); b3.add(a3);
//关系的创建
多对多的关系的访问与前面一对多的关系的访问基本相同,这里不再给出代码。
软件工程——第12章面向对象实现知识点整理 阅读详情

相关推荐

C语言实现面向对象的原理

编排 |strongerHuang微信公众号 | strongerHuang不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语言的语法...

编程与实战的博客 853

面向对象六种关系

对于拥有共同行为的类可以将它们抽象出一个接口。指一个类的实例A使用另外一个类的实例B。面向对象中派生类与基类之间的关系。​ 电脑和键盘、鼠标的关系。(实例对象依赖实例对象)桌子和桌面、桌腿的关系。

qq_43239467的博客 692

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

应用处理器(AP)、系统级芯片(SoC)与微控制器(MCU)的区别与联系

a_zxswer的博客 1695

面向对象的6种关系:关联,聚合,组合,泛化,依赖,实现

1.单项关联Association 一个类的实例Customer使用另外一个类的实例Address,这两个对象之间为关联关系。 public class Customer { private Address address; private String name; public String getName() { return name; } public Address getAddress() { retur

wdxzuishuia的博客 7548

10X Genomics单细胞数据分析实战:从FASTQ到UMAP可视化的完整流程

本文详细介绍了10X Genomics单细胞数据分析的完整流程,从FASTQ原始数据处理到UMAP可视化。通过Seurat工具包实现数据质量控制、标准化、降维聚类和细胞注释,特别适合生物信息学新手学习。文章包含可复现的代码示例和常见问题解决方案,帮助研究者快速掌握单细胞测序数据分析的核心技术。

weixin_30952535的博客 536

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED

本文为使用 STM32Cube IDE 的 STM32 Blue Pill 入门教程。 在本文中,我们将介绍如何控制 STM32 Blue Pill 的 GPIO 引脚。以及开发环境搭建。 本系列文章将重点介绍采用 ARM Cortex-M 的 BluepellSTM32F103C8 微控制器以及如何使用 STM32CubeIDE 对其进行编程。 STM32CubeIDE是STM32官网提供的IDE

视觉与物联智能 1071

【软件设计师】面向对象类图的六种关系

指一个类使用另一个类作为成员变量,如果类A使用类B作为成员变量,称类A单向关联类B,如果类B也使用类A作为成员变量,则类A与类B双向关联。关联有1:1,1:n,n:1,n:n多种关系。实现的使用:例如学生和教师,都需要知道自己在学校的信息,给学生和教师提供一个根据自己的编号查看信息的方法,可以使用一个接口定义方法,由学生和教师类实现这个方法。依赖的使用:例如学生犯错后,班级的班主任要给一个学生记过,即教师类修改学生信息,给教师类定义一个方法,使用学生类作为方法参数,对学生类的数据进行修改。

Liszter 2062

[xboard-real6410]39 real6410中的BL1和BL2实验及流程分析

文章目录uboot控制uboot 流程uboot加载kernel uboot控制 uboot 流程 uboot加载kernel

鹰之翔 298

第十二章: 面向对象实现

面向对象实现主要包括两项工作:把面向对象设计结果翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序。面向对象程序的质量基本上由面向对象设计的质量决定,但是,所采用的程序语言的特点和程序设计风格也将对程序的可靠性、可重用性及可维护性产生深远影响。

weixin_42559968的博客 517

ShaderJoy —— 简单又神奇的 “合体” 函数【GLSL】

smin 函数 它实际上有两种常见的实现方式 多项式 指数 多项式 smin 函数图 其对应的代码为 float smin( float a, float b ) { // 多项式 const float k = 0.5; float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0); return mix(b, a, h) - k * h * (1.0 - h); } 从上图中我们可以很明显的看出有两处不连...

ShaderJoy 的兴趣技术杂货铺 1858

按照CANoe模板制作seed&&key.dll

在canoe进行诊断测试的时候,在0x27服务中需要制作一个dll文件。可在canoe的诊断中进行加载,也可用于diva的自动化测试。 本文按照canoe提供的KeyGenDll_GenerateKeyEx模板制作。 KEYGENALGO_API VKeyGenResultEx GenerateKeyEx( const unsigned char* iSeedArray, /* Array for the seed [in] */ unsigned int

天赐好车的博客 6525

面向对象类之间主要的几种关系

关注+星标公众号,不错过精彩内容转自|嵌入式情报局嵌入式开发虽然平时C语言用的比较多,但面向对象的思维应该是每一位嵌入式软件工程师必备的知识。之前给大家分享过用C语言实现面向对象的内容,也分享过单片机用C++点灯的文章。今天就再给大家拓展一下面向对象类之间的几种关系。1、类之间的关系 类在面向对象程序设计中是一个非常重要的概念,是一系列具有相同属性和方法的对象抽象,那么弄明白类之间的主要关...

strongerHuang 1737

肖特基二极管选型参数,结构原理,工艺与注意问题总结

肖特基二极管(Schottky Diode)是一种特殊的二极管,也被称为肖特基势垒二极管。它是利用金属与半导体接触形成的金属-半导体结原理制成的。与传统的PN结二极管相比,肖特基二极管具有更低的正向压降、更高的开关速度、更高的反向恢复时间以及更好的温度稳定性等特点。本文对肖特基二极管的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 813

如何实现面向对象

如何实现面向对象面向对象的定义面向对象的三大特征、面向对象的基础实现面向对象基本准则实例 面向对象的定义 对象是指具体的某一事物,在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象指的是计算机系统中的某一个成分。 在面向对象程序设计中,对象包含两个含义,其中一个是数据,另一个是动作。对象是数据和动作的结构体。 面向对象是在对象这一层次。 面向对象的三大特征、面向对象的基础 封装、继承、多态 封装:在面向对象中,对数据和动作进行包装,其中的某些数据动作,可以是私有的,不能被外界访问,以此来实现对数

理想主义的花最终会盛开在浪漫主义的土壤里,我的热情永远不会熄灭在现实的平凡之中,我们终将上岸,阳光万里。 6662

【机器视觉】基于深度学习的托盘PCB识别与计数(有无、正反)

工业机器视觉是指在制造业和工业环境中使用计算机视觉技术来执行检测、测量、识别和控制任务。它结合了硬件(如相机、镜头、光源)与软件(图像处理算法)来自动完成传统上需要人工视觉的任务,从而提高生产效率、产品质量以及工作安全性。工业机器视觉系统通常具有高精度、高速度和高可靠性,能够适应恶劣的工作环境。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Lua如何实现面向对象

(1)封装封装是指将数据(属性)和行为(方法)封装在一个对象中,并对外部隐藏对象的具体实现细节,只提供有限的接口与外部交互。这种机制提供了对外部访问的限制和保护,使得对象的使用者无需关心对象内部的实现细节,只需关注对象提供的公共接口。封装有助于提高代码的可维护性、可重用性和安全性。(2)继承继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而可以扩展或修改父类的功能。这种机制能够建立类之间的层次关系,使得代码可以更好地重用和扩展,同时提高了代码的可扩展性和可维护性。

m0_64251659的博客 1742

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

面向对象的几种实现

面向对象的几种实现简单对象模型经典对象模型(C++对象模型)拓展对象模型 面向对象思想本身没有什么太值得讨论的地方,实际上就是把数据与其上的操作相绑定。这里着重讨论其底层实现,即编程语言所采用的对象模型。为简单起见,此处不使用最底层的汇编语言或机器语言,而是采用C语言描述。(原本想用C++,但考虑C++本身就是面向对象语言,为了避嫌才用了C) 在开始之前首先看一个例子: struct A { int data1 = 1; virtual void print() const {

大耳朵鱼的博客 1175

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

有函数就可以实现面向对象

无论何种语言,只要有函数,就可以实现面向对象。 -

u012632105的博客 170

C语言这样来实现面向对象

关注、星标公众号,直达精彩内容来源链接:https://blog.youkuaiyun.com/onlyshi/article/details/81672279不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语言的语法功能在不断升级变化。虽然我们的教材有这么一个结论:C语言是面向过程的语言,C++是面向对象的编程语言,但面向对...

李肖遥的专栏 1948

用c语言实现面向对象,用C语言实现面向对象

1、 概述C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是struct,查找Interface的定义,你可以发现有这样的宏定义:#ifndef Interface#define Interface struct#endifC++在语言级别上添加了很多新机制(继...

weixin_31809171的博客 1331

Lua之面向对象的实现

Lua本身是不支持面向对象的,但是可以利用table和元表、元方法进行面向对象的模拟! 以下是Cocos2d-lua中面向对象的实现: class function class(classname, ...) local cls = {__cname = classname} local supers = {...} for _, super in ipairs(supe...

fightsyj的博客 1332

C语言实现【面向对象】的一些方法

关注+星标公众号,不错过精彩内容编排 |strongerHuang微信公众号 | strongerHuang不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语言的语法功能在不断升级变化。虽然我们的教材有这么一个结论:C语言是面向过程的语言,C++是面向对象的编程语言,但面向对象的概念是在C语言阶段就有了,而且应用到了很多地方,比如某些操作系统内核...

strongerHuang 1391

Lua语言实现面向对象

文章目录前言一、Lua中的数据类型二、_G三、元表四、面向对象1.封装2.继承3.多态总结 前言 Lua是一种轻量级的脚本语言,在unity开发中经常用来做热更新相关的解决方案,我们现在的程序开发往往都是面向对象的,而Lua中是不存在类的概念的,让我们来看一下在Lua中如何实现面向对象编程。 一、Lua中的数据类型 Lua中共有8种数据类型,简单数据类型:number、boolean、string、nil,复杂数据类型:function、userdata、thread、table。Lua中没有类的概念,

IQsuper的博客 6012

C实现面向对象

C实现面向对象编程

pythom_aaa的博客 586
上一篇: 异常处理
下一篇: 日期及其格式化
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值