首页 >>  正文

子类继承父类例子

来源:baiyundou.net   日期:2024-09-21

下面这篇文章是笔者整理分析的关于如何绘制「UML类图」的相关内容,大家一起来看看吧!

UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。也就是说,掌握UML的20%,就能做80%的事情。

对于程序员来说,最频繁使用的莫过于类图。因此,这里我们只讲解UML类图。至于其它UML图,请在以后的工作中参阅更多UML学习资料继续学习。

类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。类图中最基本的元素是类、接口。软件设计师设计出类图后,程序员就可以用代码实现类图中包含的内容。

一、UML类图简介

类图以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法。类图用来描述系统中有意义的概念,包括具体的概念、抽象的概念、实现方面的概念等,是对现实世界中事物的抽象。

类图的主要作用是对系统的词汇进行建模、对简单的协作进行建模和对逻辑数据库模式进行建模。

二、类图基本属性

类图概括起来主要由两部分组成:类和类之间的关系,其中对类的定义如下图所示,主要由三部分组成,它们分别是类名、类的属性、类的方法,对应图中的三个分区内容。

类名:图中最上面的矩形框中为类名。如果字体为斜体,表示为抽象类

*符号解释

说明:属性和方法前面的“+”“-”和“#”表示访问级别,以下对这些符号进行解释说明。

  • +:public,公用的,对所有类可见
  • -:private,私有的,只对该类本身可用
  • #:protected,受保护的,对该类的子孙可见
  • ~:package,包的,只对同一包声明的其他类可见
  • =:表示默认值
  • 下划线:static
  • 斜体:抽象 (注意也可以用两个尖括号包裹来表示抽象,比如 —— <<我是抽象类or接口>>)

冒号前是方法名/变量名(根据有无括号区分),冒号后是返回参数/变量类型(根据有无括号区分),如果没有冒号的话表示方法返回空(也有人通过:void表示返空)

三、类图中具体类、抽象、接口和包的表示法

UML类图中具体类、抽象类、接口和包有不同的表示方法。

1. 在UML类图中表示具体类

具体类在类图中用矩形框表示,矩形框分为三层:

  • 第一层是类名字。
  • 第二层是类的成员变量。
  • 第三层是类的方法。

成员变量以及方法前的访问修饰符用符号来表示:

  • “+”表示 public;
  • “-”表示 private;
  • “#”表示 protected;
  • 不带符号表示 default。
2. 在UML类图中表示抽象类

抽象类在UML类图中同样用矩形框表示,但是抽象类的类名以及抽象方法的名字都用斜体字表示。

3. 在UML类图中表示接口

接口在类图中也是用矩形框表示,但是与类的表示法不同的是,接口在类图中的第一层顶端用构造型 <>表示,下面是接口的名字,第二层是方法。此外,接口还有另一种表示法,俗称棒棒糖表示法,就是类上面的一根棒棒糖(圆圈+实线)。圆圈旁为接口名称,接口方法在实现类中出现。

4. 在UML类图中表示包

类和接口一般都出现在包中,UML类图中包的表示形式。

四、类之间的关系

类之间的关系主要包括泛化(继承)、依赖、关联、聚合、组合和实现6种关系,下面对它们进行一一阐释。

1. 泛化关系

泛化关系是一种继承关系,子类继承父类的所有行为和属性,子类可以新增新的功能或者重写父类功能。

表示方法:空心三角+实线,箭头指向父类

2. 依赖关系

依赖关系表示一个类使用(依赖)另一个类的服务或信息。当一个类的改变会影响到另一个类时,两个类之间存在依赖关系。一般来说,依赖总是单向的,不应该存在双向依赖。

表示方法:尖括号+虚线

3. 关联关系

关联关系是一种拥有的关系,它使一个类知道另一个类的属性和方法。它体现不同类的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强,不存在依赖关系中的偶然性,关系也不是临时的,一般是长期性的。

关联关系分为单向关联或双向关联,也可以有多重性(一对多),双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

表示方法:尖括号+实线,箭头指向被拥有者

4. 聚合关系

聚合关系是关联关系的一种,表示一种“弱”的“拥有”关系,是整体与部分的关系,且部分可以离开整体而单独存在,如车和轮胎是整体和部分的关系,轮胎离开车仍然可以单独存在。

表示方法:空心菱形+实线,菱形指向整体

5. 组合关系

组合关系也是关联关系的一种,是比聚合关系还要强的关系,是整体与个体的关系,但个体不能离开整体而单独存在。如公司和部门是整体和部分的关系,没有公司就不存在部门。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

表示方法:实心菱形+实线

6. 实现关系

实现关系是一种类与接口的关系,表示类是接口所有特征和行为的实现。

表示方法:空心三角+虚线

五、类图案例分析

为了帮助大家更好的理解类之间的6种关系,下面使用例子辅助大家学习和消化吸收。

汽车类图

汽车类图说明:

  • 车与小汽车和自行车之间是「实现」】关系,使用带空心箭头的虚线表示。
  • 小汽车与SUV之间的关系为泛化关系,使用带空心箭头的实线表示。
  • 小汽车与发动机和轮胎之间是「组合」】关系,使用实心菱形箭头的实线表示。
  • 学生上学需要用到自行车,与自行车是一种「依赖」】关系,使用带箭头的虚线表示。
  • 学生与班级之间是「聚合」】关系,使用带空心菱形箭头的实线表示。
  • 学生与身份证之间为「关联」】关系,使用尖箭头的实线表示。

如果你能快速的看懂并理解以上案例,说明你基本上已经把类图弄懂了,再去多结合一些代码和对应的类图巩固一下,以后再看到类图就不会懵了。

六、如何绘制类图?

ProcessOn支持多种图形的绘制,当然也包括UML图啦,用ProcessOn绘制类图的方法很简单,只要掌握了类图绘制的知识点,研究明白了类图案例,相信每个人都可以快速学会画类图。

  • Step1:注册登录ProcessOn,新建UML图形。
  • Step2:在左侧工具栏中选择类的标志,拖拽到右侧编辑区,写上类名、属性和方法。
  • Step3:根据类之间的关系,标注箭头和线。

注:ProcessOn每个图标之间的连线默认都是实线箭头,大家根据需要可以在上方工具栏中调整连线样式、连线类型、连线颜色、箭头方向和箭头样式等。如果你想让自己的图更美观一些,可以把文本、图标、线条等填充不同颜色、相同的图标尽可能大小相同。

本文由 @观察月亮的小白羊 原创发布于人人都是产品经理。未经许可,禁止转载。

题图来自Unsplash,基于CC0协议。

该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务。

","gnid":"9baf06dcce2cfb240","img_data":[{"flag":2,"img":[{"desc":"","height":"420","title":"","url":"https://p0.ssl.img.360kuai.com/t01e8343e3706df163b.jpg","width":"900"},{"desc":"","height":"607","title":"","url":"https://p0.ssl.img.360kuai.com/t012f4a354898c09cf6.jpg","width":"541"},{"desc":"","height":"207","title":"","url":"https://p0.ssl.img.360kuai.com/t014d20cd693082dd4e.jpg","width":"720"},{"desc":"","height":"263","title":"","url":"https://p0.ssl.img.360kuai.com/t017a6b2ea83cd5123d.jpg","width":"720"},{"desc":"","height":"206","title":"","url":"https://p0.ssl.img.360kuai.com/t01a86491c7db863499.jpg","width":"720"},{"desc":"","height":"209","title":"","url":"https://p0.ssl.img.360kuai.com/t0155a65c7d86a7e27d.jpg","width":"720"},{"desc":"","height":"830","title":"","url":"https://p0.ssl.img.360kuai.com/t01f4a61818b6ff5f61.jpg","width":"658"},{"desc":"","height":"605","title":"","url":"https://p0.ssl.img.360kuai.com/t01f3b66ea91a37851e.jpg","width":"1033"},{"desc":"","height":"390","title":"","url":"https://p0.ssl.img.360kuai.com/t011e3aba8ab0d587f7.jpg","width":"964"},{"desc":"","height":"391","title":"","url":"https://p0.ssl.img.360kuai.com/t01347e5571eb335a06.jpg","width":"1033"},{"desc":"","height":"398","title":"","url":"https://p0.ssl.img.360kuai.com/t01e6bd970e247a9ccd.jpg","width":"1072"},{"desc":"","height":"391","title":"","url":"https://p0.ssl.img.360kuai.com/t0178e082464f8d43e7.jpg","width":"1043"},{"desc":"","height":"622","title":"","url":"https://p0.ssl.img.360kuai.com/t01743a0d219aca0fe6.jpg","width":"1063"},{"desc":"","height":"483","title":"","url":"https://p0.ssl.img.360kuai.com/t01c33c3f2f9689903c.jpg","width":"1080"},{"desc":"","height":"665","s_url":"https://p0.ssl.img.360kuai.com/t012f82c57b0f46caeb_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t012f82c57b0f46caeb.gif","width":"1079"}]}],"original":0,"pat":"art_src_3,fts0,sts0","powerby":"pika","pub_time":1698305700000,"pure":"","rawurl":"http://zm.news.so.com/1da5aec703165c505e12f64eea4d6356","redirect":0,"rptid":"5f88661566847271","rss_ext":[],"s":"t","src":"人人都是产品经理","tag":[],"title":"如何绘制「UML类图」?附内容详解和优质实例分析!

牛显轻3083Java 子类一旦继承父类后,子类的所有对象也都成为父类的对象了? -
敖策盛18236941370 ______ 子类的对象实例都可以用父类的变量去引用.具体来说,假设Son类继承了Father类.则可以有:Father objRef = new Son(...); Son sonRef = (Son) objRef;我们用new关键字建造了一个新的Son类对象实例,然后用一个Father类的引用去指向它;这时我们透过objRef这个引用,看到的就好像是一个Father类对象,只能使用Father类有的方法和属性.当然, 因为objRef指向的其实是一个Son类实例,因此可以借助强制类型转换将一个Son类的引用去指向它,然后就可以使用Son类独有的方法和属性了.

牛显轻3083c++,子类与父类谁能用例子给我说明下?是否子类除了继承父类还可有新东西 -
敖策盛18236941370 ______ #include using namespace std; class Base { private:int i; protected:void fun1(){ cout} public:Base(){ i=10; cout} void fun2(){ cout} virtual void fun3(){ cout} }; class Inherit:public Base { private:int i; public:Inherit(){ i=15; } void print(){ cout} virtual void fun3(...

牛显轻3083编写程序显示父类、子类构造函数的调用过程,在子类中实现构造函数的继承. -
敖策盛18236941370 ______ Parent.java123456789 publicclassParent { 5261public Parent() { System.out.println("父类无参4102构造1653"); } publicParent(String str) { System.out.println("父类带参构造str= "+ str); } } Child.java123456789 publicclassChild ...

牛显轻3083java中继承那一块我不知道怎么写,父类里应该写什么,子类又应该写什么,我很是迷茫,脑子里一塌糊涂. -
敖策盛18236941370 ______ 举个简单的例子吧;如果动物是父类,小猫小狗就可以做子类了.因为动物有的特性猫狗都有;而且小猫小狗可以扩展出自己的特性,像狗会咬人,而猫不会.饿...貌似这个说服力不高..再举个,如果说猫科动物是父类,那么老虎和小猫就可以做子类了.因为它们都是猫科动物,都很像猫;而且可以扩展出自己的特性,像老虎会咬人,而猫不会.饿...为什么又扯到咬人这一块了??!好吧,总之就是子类继承了父类后能得到父类的所有公有属性和方法,并且可以自己再扩展.大概就是这么一回事.

牛显轻3083java中一个子类继承父类,功能比父类强大了,那么父类是不是就没有使用价值了? -
敖策盛18236941370 ______ 父类更多的是一个继承的作用,比如我现在需要制作好多家具,但是这些家具都有一些共同特性:都是实木,加工程序,销售程序等,然后沙发有沙发的特性,桌子有桌子的特性,定义类的继承主要是为了更好的拓展,比如某天我所有的家具的加工程序突然都改变了,如果没有父类,我是不是要在所有的子类里面都去重新修改加工程序?但是如果这些家具都继承了同一个父类的话,我就只需要修改父类(也就是家具)的加工程序,就不需要沙发、桌子什么的都修改了.. 而父类的作用还不仅如此,比如我现在需要执行“加工”这一方法,但是我不知道是执行加工沙发还是执行加工桌子,那么久直接选择执行加工家具了,类的继承一个是方法属性的继承,还有就是一种规范(跟接口一样)..

牛显轻3083C++中继承的本质到底是什么 -
敖策盛18236941370 ______ “子类继承父类和把父类的成员变量包含到自己的类中到底有啥区别呀?” 回答:这里面有一点点区别.比如说如果子类创建了自己的私有成员那么子类是可以通过自己的成员函数来访问自己的私有成员的,但是子类却不可以通过自己的成员函数来访问继承自父类的私有成员,这就说明通过继承过来的成员与子类本身具有的成员是有一些区别至于为什么会这样,我也有点疑问. 因为c++有规定类本身自己的成员函数是可以访问自己的成员变量的,所以继承的本质并不仅仅是包含和关联那么简单

牛显轻3083Java 子类继承父类,子类重写父类方法,这种情况下父类可以获取到子类的数据吗? -
敖策盛18236941370 ______ 在父类中能获取子类的属性吗?一般情况下是不行的,因为孩子尚未出世哪里来的属性.但有时需要在父类处理该类(包含子类)的所有属性,该怎么做呢,有种方法能解决——在父类中将子类的实例引用进来.假设BaseClass是基类,有个...

牛显轻3083JAVA中的继承
敖策盛18236941370 ______ 子类继承父类的构造方法和父类所有属性和其他方法(被声明为private的除外),子类在被实例化后,会先调用父类的构造方法,然后在调用自己的,但是,在new时,子类会默认调用父类无参的构造方法,如果父类没有显式的定义无参构造方法,编译时就会出错.

牛显轻3083在JavaScript的原型链继承方式中,为什么子类在调用父类的构造函数时不能传参数? -
敖策盛18236941370 ______ 以前我在看书时也遇到过这样的问题,找了很多资料都没有明确的解释. 我觉得,并不是语法上不能实现对构造函数的参数传递,而是这样做不符合面向对象编程的规则:对象(实例)才是属性的拥有者. 如果在子类定义时就将属性赋了值,...

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024