UML类图分析实战----媒体存储系统;Package与Class的权限(Java养成)

本文是Java学习的第三天内容,重点讨论UML类图中的继承和包含关系,以及如何从需求中抽取类。文章通过实例分析了员工、工作者和经理之间的关系,展示了如何构建通用类结构,如集合类Collections和自包含类。同时,讲解了如何设计媒体存储系统的类,包括类的属性、方法和关系。此外,还涵盖了Java的基本语法、数据类型、访问权限和对象创建。
摘要由CSDN通过智能技术生成

Java养成计划----学习打卡第三天

Java入门到精通(打卡第三天)


学习内容

UML类图关系实例分析

Java开发


内容管理

UML类图关系具体实例分析

继承关系与包含关系

昨天的内容中我们提到的Country,Capital,Governmennt中,前者就是包含后两者的,就是一种包含关系,并且关联的数量是1,关联属性的数据类型就是Captial和Government;

关于继承我们再说一下就是一个类(子类,子接口)继承另外一个类(父类,父接口)的功能,并可以增加它自己的新功能,一个类最多继承一个类

下面我们举个例子来看一下这里的两种关系

There are two different kinds of employees in the company:

  • Workers - Workers do not supervise anybody. They are paid a weekly salary.
  • Managers - Managers supervise one or more employees. In addition to a weekly salary, they also get a bonus based on the number of employees they manage. Assume that one employee is supervised by at most by one manager. A manager can be supervised by another manager.

这里我们可以找寻到3个名词,employee worker manager ,我们可以清晰地发现上面地of,这就可以体现一种继承关系,我们抽象三个类,employee类 下面有有两个子类就是worker类与manager类,所以这里的worker类与manager类继承employee类; 通过Managers supervise one or more employees这句,可以找到一种关联关系也就是包含关系,(属性),这里的manager类就是关联了employee类;最后一句就是让关联的类不只是worker而是整个employee类;关联的方向就是从manager类到employee类;关联数量是1··*,就是一至多;

通用类结构

类与类之间的关系一般是根据具体的应用来定,但是有一些类经常被用,这些常用类被称为基本构建块,比如Collections(集合类,容器类),Self-Containing Classes(自包含) Relation Loops(关系环类结构)

集合类 Collections

这个有一对多或者多对多,比如一个Client对应多个Bankcount,这里创建的经验就是我们的包含类(比如Client)中的方法一般都要有删除操作,添加操作,返回容器中总的数目,查找操作,就是比如

  • 添加操作

    • addBankAccount(account:BankAccount);
  • 从容器中删除

    • removeBankAccount(account:BankAccount);
  • 取得容器中的对象(查找)查找的方法有多种,但是为了方便阅读,这是我们就要利用重载

    • getBankAccount(index:int) 号码,序号查找
    • getBankAccount(id:String) 按名字查找
  • 获得容器中总的数目

    • getNumberOf(account:BanlAccouont);
自包含关系 Self- Containing Classes

这个的意思是自身与自身关联,就是这个类有的属性的数据类型就是自身;比如Person类的getFather与getMother属性都是自身类型;这里有个经验就是如果自包含的数量是单数,那么这个类应该建立一些get方法(必须)以及set方法(如果允许修改)

public class Person{
    ···
     private Person father;
     private Person mothaer;
    ···
     public Person(返回值类型) getFataher{
        return Father;
    } 
    public Person mother getMother{
        return mother;
    }
    ···
}
关系环结构 Relation Loops

在需求中找名词或者名词短语,然后以他们抽象创建类,两个实体之间有has就是包含关系;两个类如果有共性,就比如它们有一些相同的操作方法,这是经验就是将共性提取出来,然后创建一个基类Composite类来存放共性,其实就是我们人为提取出一个父类,让两个子类继承

媒体存储系统----设计类
从需求中找出类的步骤
  • 第一步:我们要认真阅读需求文档,找出其中的名词或者名词短语(标注出来)

The Media store system

A media store contains a database of the media files. There are two types of media files: image files and audio files. Each medial file has a ==name ==and a unique code. In addition:

  • ‌Theinformation for an Image file includes the== author== and format.
  • ‌The information for an audio file includes the duration of the audio file in seconds and theperformer.

‌  Assume that each media file are identified by a unique code. The system provides the following functions:

  • ‌Adds the specified media file to the media database.
  • ‌Look up a media file given a unique code.
  • ‌Removes the specified media file from the media database.
  • ‌Get the number of the media file that the media database contains
  • 第二步,将所有的名词或者名词短语罗列在excel表格中,然后修剪(删除)

    删除的规则如下

    • 将复数转换成单数(除非必须是容器)比如将media files 转成 media file ,image files 转成image file ,audio files 转成 audio file
    • 删除列表中可能是具体对象的,用通用化类代替,比如人们 和 张三,我们就要把张三删去,比如张三去取钱,将张三抽象成Client;还有就是删除某个变量的具体取值,比如format包含CD之类,就要删除CD,保留format;
    • 删除与需求无关或者含混不清的词语,比如这个information 或者这个kinds,找不到它们的属性
    • (那种)删除是某个实体属性的名词,如果这个名词本身也有属性,那就不能删除,像这里unique code,name,author,format,duration,performer(像上一个的salary就没有属性,就不是类)
    • 还有就是那种范围很大的大词要删除,比如这里的system
  • 将剩下的名词分类,将意义相同的名词中只选择一个就可以,同义词词组组合在一起,起一个名字就可以了

所以只有database,media file和image file 以及 audio file,所以我们设计四个类:MediaFileDatabase类, MeidiaFile类,ImageFile类,AutioFile类

接下来就是创建具体的属性和方法了,这里我们就可以就具体功能设计方法,这里MediaFileDatabase类是包含多个MeidiaFile类,所以创建一个容器,而ImageFile类,AutioFile类继承MeidiaFile类,关联关系就是这样子的,所以方法就有getMunberOf(mediafile:MediaFile);removeMeidiaFile(mediafile:MediaFile);getMeidiaFile(mediafile:MediaFile);addMeidiaFile(mediafile:MediaFile);需求中所要求的功能很少就容器的几个操作而已

设计好核心类之后,检查那些是否是好的,我们就增加一个类,叫做测试类,或者驱动类,我们就将这些放在驱动类加进来就提高代码的复用性;之类我们就创建一个驱动类MediastoreSystem类,从需求中可以看到这个类只与MediaFileDatabase类关联,把我们用户的需要的核心功能就放在里面,所以我们直接操作MediaFileDatabase属性,然后直接调用其中的几个容器操作就可以实现几个功能;使用.运算符就可以调用base的操作,这样就创建好了;

找出类的属性或者关联属性

这就找出每个类的属性就可

  • MediaFileDatabase类 meidiafile
  • MeidiaFile类 name , unique code
  • ImageFile类 author format
  • AutioFile类 duration performer

对于这些属性我们一般就有一些经验就是 get 与 set方法,output与display 方法,perform calculation 特性计算 object‘s values 对象的价值之类的方法

写出每一个类中可能的方法

这里就根据这些对象和我们常见的方法来编辑方法

  • MediaFileDatabase类

    • getMunberOf(mediafile:MediaFile);
    • removeMeidiaFile(mediafile:MediaFile);
    • getMeidiaFile(code:int);
    • getMeidiaFile(name:String);
    • addMeidiaFile(mediafile:MediaFile);
  • MeidiaFile类

    • setCode(code:int);
    • setName(name:String);
    • getCode(name:String);
    • getName(code:int);

之后的就不在细说了,就这样子创建就好了;

找出类与类的关系

我们可以建立一个矩阵,然后首先看他们的继承关系;问自己问题:“类A 的对象是类B 的一个对象吗?”这样就找出继承关系(泛化),看看是否继承了所有父类属性;

第二步是找关联关系,一对一或者一对多的关系 ;(找同一句话中出现了两个类)这里MediaFileDatabase类是包含多个MeidiaFile类,就是一对多的关联关系)所以创建一个容器,而ImageFile类,AutioFile类继承MeidiaFile类

UML的Java实现

基本的类语法

Java里面定义类就是class,前面是访问权限,比如public static ,这个可以不要,之后就是类名,类名要大写,之后的花括号就是类的作用域,包括类的数据成员 data members 和属性方法 meeber functions.

数据成员 data members 数据成员的对象可以是符合要求的任何类型,当然它也可以是原始类型primitive types 如int ,double之类 它的定义方法是 访问权限 数据类型 变量名

四种访问权限:public private protected ,缺省

比如 private Captial captial; double x;

java的数据类型

包括基本数据类型以及引用数据类型;(原始)基本数据类型 就分为数值型(byte int short long float double) ;字符型(char); 布尔型(boolean); (对象)引用数据类型包括 类class,接口interface,数组

Sring就是对象数据类型 class, 基本类型可以使用包裹类型,包裹类型就是Class类

方法(函数),在Java中只能当作类的一部分去创建,其他的就和C差不多,只是一般要加访问权限

Java类的构造方法

构造方法于类名相同,并且没有返回值,构造方法通过传递的实参初始化对象的成员变量,一般使用前缀use the prefix “initial”来给构造方法的参数命名

new关键字调用构造方法来创建类对象;当为某个类撰写多个构造方法时,想在某个构造方法里调用另外的构造方法就是this[参数列表]

当没有构造方法时,Java会自动给一个缺省的构造方法,表现就是Java类会自动初始化,数值型就是0,boolean就是false,char型就是’\0’,对象类型就是null,一旦我们撰写了,Java就不会再这样初始化了,接下来,我们大概写一个类

public class Point2D{
    private float x;//在这个类中,这相当于我们C里面没有封装的全局变量
    private float y;
    public Point2D(float initialX,float initialY)
    {
        x = initialX;
        y = initialY;
    }
    public float getX(){
        return x;
    }
    public float getY{
        return y;
    }
    public static void main(String[] args)
    {//在C里面一般int main,所以写return 0;这里就是void main,main函数不需要返回值
        // you code here
        System.out.println("%.2f",getX());
        System.out.println("%.1f",getY());
    }
}

写好一个类之后我们就把它存储在一个.Java文件里面,这个.Java文件里面一般只定义一个类,并且文件名与类名一致;定义多个类时,只以一个类做主类,其余类都是辅助,主类一般访问权限都是public的,所以这里文件名就是Point2D.java

Java的对象声明与创建(Java封装性)

在类定义的基础上,对象的创建和应用包括三个步骤:对象的声明,对象的创建,通过.运算符对对象的引用

比如我们上面创建好类之后(这个就要类比String),我们声明一个对象Point2D pointOne;这样就声明了,就像String s;对于这个声明,系统就会在栈里为其分配一个空间,存储一个真正指向的地址

pointOne = new Point2D(10,100);

point2D就是点,所以这里就是给他赋值为(10,100),类比String s = new String(“i like it”);,所以之后系统看到new就在堆中分配对象所占的空间,并且返回一个引用地址给对象变量;而且系统会自己free内存,在Java里不能修改地址,这里和指针很像,但是不需要修改指针的值,所以不需要指针;
在这里插入图片描述

访问属性就是pointOne.getX();这里需要注意我们把这个叫做首地址的引用,它可以找到堆中容器的地址;

在Java里面形参与实参结合的方式是地址的copy;比如p1与pointOne都是指向同一块内存,就像指针但又不是指针;C语言里面的指针在Java里就自己给用new全自动操作了,所以这就是类似一种指针传递,形参改变堆中的值,实参的就跟着变了

Java访问权限(Java封装性)

Java对象是Java封装性的一个方面,另一方面体现在堆Java类以及其成员的访问权限限制;访问权限限制体现在三个方面就是包、类的访问权限以及类成员的访问权限

Java为解决类命名冲突问题,就引入包(package)来组织管理类;包中存在一个或者多个类,通过.来指明目录的层析结构,比如Java.io;对应文件夹java\io,类位于包中,就是位于对应的文件夹中

API(application programming interface)应用程序接口,Java的类的API就分别存储在不同的包中

在包条件下类的使用
  • 用类的全名 = 包名 + 类名
  • 使用 the import Statement来导入

例如我们定义一个日期对象,Java库里util包里就有Date类,我们要使用按第一种方式就是

java.util.Date day = new java.util.Date();

这里Date是类名,java.util是类所属包的名字,java.unti.Date是全名,通过这种方式唯一标识一个类名,包提供了一种命名机制和可见性限制机制

像我们的Scanner 其实也就是一个类,这个类也就是在Java的util包里面,所以我们定义输入时的

import java.util.Scanner;//这就是我们要使用Scanner类时系统用第二种方式导入的Scanner类,工具类

Scanner in = new Scanner(System .in);//这里的in也只是一个对象,为了直观理解,所以对象命名为in,new就是给对象分配一块空间

当我们想使用包中的很多类时我们就直接导入包,加一个*,在软件工程中就代表多,或者任意

import java.until.* //这样就可以了

**将整个包都导入并不会影响Java的语言的效率,**并不像语言的头文件,那里就会将整个都解析,这里因为Java的封装性很好,包封装了,类也封装了,所以加载的只是我们要使用的那几个类

Java内库的各种包比如IO包就是控制输入输出的,util包就是工具包,里面有Scanner类,Date类等;

自定义包

我们有时在实现不同的功能模块,完成不同的功能,就需要将不同的类打包,需要注意一点就是package必须是文件的第一条语句,我们打包类的语法就是

package point;//这里的point就是自定义名,可以随便取
pubilc class Point2D{
    ·······
}

使用自定义包和之前的两种方法

包的访问权限
  • 如果一个.java源文件中不加package语句,就指定为缺省包或无名包,类文件位于当前工作目录下
  • 无论是JDK提供的类还是自定义包中的类,都必须使用import的两种方法使用包中的类,以通知编译器使用,但下面两种可以不用
    • 位于同一个包中的类可以互相引用
    • 在源程序Java类库的lang包中的类可以直接使用,它是所有Java类的父类,就像System类就在里面,System.out.println();
类的访问权限

类的访问权限体现在有无public修饰

  • public ---------- 可以被不同包中的类访问(只要导入了)
  • 无 --------------只能被同一个包中的类访问(包内友好,包外不可见)
类里面成员的访问权限

一共四种修饰

  • private ---------- 可以被同一类的成员访问
  • 无 ------------- 可以被同一包中的类访问
  • protected ---------- 可以被同一包中的类访问或者被不同包中的子类访问(继承)
  • public ---------- 可以被不同包中的类访问
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值