相信大家对面向对象有了一些基本认知,至少知道:需要在问题域中找对象,定义类,new对象,调用对象的属性和行为。
在实际的开发过程中,我们遇到的很多问题不是某一个对象单独能够解决,而是可能由多个不同类型的对象协作完成的,那么我们就需要在复杂的问题域中去设计(找)他们的关联,让他们能够合作。
三种对象的关联关系
has - a 关系
顾名思义:有一个
指的是在一个对象的内部“拥有”另一个对象
use - a 关系
用一个
指的是在一个对象的某个方法中“使用”另一个对象
is - a 关系
是一个
指的就是一个对象是另外一种对象的特例
其中,今天我们学习前两个(has-a 有一个、use-a 用一个),在后续章节(继承)时讲解
has-a 关系 有一个
在语法上,has-a 关系就是把一个对象 设计为 另一个对象的属性
例子:张三 有 钱包 (张三 属于人这个类型的对象 钱包 属于 钱包这个类型的对象)
此时 关联--- 单向关联 和 双向关联
A has a B 或者 B has a A 单向关联 A 中有B 或者 B中 有A
A has a B 且 B has A 双向关联 A中有B 且 B中有A
把对方 设计为自己的属性后,有一个特点,那就再当前对象的所有方法中我就可以访问到关联对象
换句话说,两个对象的生命周期时保持一致的,这就是你中有我,我是你的一部分。
到底 has a 关系 到底时设计为双向 还是 单向,取决于对问题与的分析。如果说再问题域场景中,我只需要通过
A找B或B找A,那么我就设计为单向,如果在问题域中,既要通过A找B,也要通过B找A,那么就是设计为双向
use-a 关系 用一个
在语法层面上,use-a关系是把一个对象 设计为 另外一个对象的某个方法的局部变量
该变量 可以通过 参数传递进这个方法,其实与可以在方法内部去new一个,两者不管采用哪一种方式都是use-a关系。因为不管是参数传递还是方法内部声明定义,都是方法局部变量,方法结束,局部变量消失,关系就会解除。
// 场景:主人喂猫 主人由喂猫的行为,猫也有 主人喂食,就给撸给包给亲亲的行为
以后完成场景练习时,注意什么时候把对方设计为属性,一定要在问题域找到什么拥有这个词汇,此时表示has关系,那么他们的生命周期就一致,我们就可以在很多方法中用它,而不是产生一个用完就丢
如果分析出来是use-a关系,请把它设计为对方的一个方法局部变量
包 和 this 关键字
this关键字
学到目前位置,如果在类中定义属性和行为,都需要通过""对象名."的方式去访问属性或行为。因为同一个类可以产生多个对象,我们必须明确的告知计算机,操作的哪一个对象的属性,哪一个对象的行为。
在类的内部方法中,访问当前类的属性或者调用自己的某个方法,也有一个默认的对象,---用 this 表示。
这个”this“ 表示的是 ”当前对象“,相当于”我”的含义。
那么谁是当前对象呢?谁调用这个方法谁就是“当前对象”
有同学可能会说:“在目前代码中,用或者不用this,没什么变化,会觉得this的用处不大”,因为根据作用域,就算不写this也可以访问本类中的属性或者调用本类中的方法。
但是建议大家,在书写代码时,只要是访问本类的属性或方法就加上“this”。
原因:
1.利用集成开发环境(IDEA),书写上this后,可以自动联想出本类的属性和方法,提高编码速度
2.它可以区分局部变量和属性重名的情况,如果出现局部变量和属性重名的情况,要表示全局变量,一定要是用this
包
当我们的程序越来越大时,里面包含的类越来越多,那么我们更好的去管理类,以及对类进行分门别类的进行存放,我们就需要有一种结构帮助我们。于是“包“就诞生了。
包:本质其实就是一个用于放Java类的文件夹,当一个Java类被放入到某个包中时,会有以下特点:
1.在这个类的最上面 会有一句 申明包的代码,代码格式:关键字 package 后面加上 包名即可
包名的书写规范:1全小写,如果包有多级结构,包名1.包名2.包名3
2.在默认情况下,一个Java类只能访问同一个包中的其他Java类,如果需要访问其他包的类,那么需要使用
关键字 import,把那个类导入进来。 import 包名.类名; 就能导入某包中的某类