对象
什么是对象
代码角度:从概念上将各式各样的数据和功能封装到了一起
体系角度:物化
发消息/发请求
向目标对象发消息
或发请求
:就是调用目标对象的目标方法,例如向Light类型(灯类型)的对象lt(灯对象)发送开灯消息:lt.on()
Light lt = new Light();
lt.on(); // 向lt对象发送开灯消息:发消息或发请求
实现方案的隐藏
- 类创建者:目标是从头构建一个类,只向
类使用者
开放必要开发的接口,其他所有细节都隐藏起来;隐藏之后,类使用者就不能修改那些隐藏的细节!这里的隐藏是从代码层面使用访问权限关键字public、protected、private、default
来修饰成员变量与成员方法,当类编译成字节码文件后,类使用者当然只能使用类创建者提供的公共的接口 - 类使用者:使用别人开发好的类(字节码class文件或源代码,如果是源代码当然可以修改了),不必关系该类的实现细节
- 接口:接口Interface规定了可对一个特定的对象发出哪些请求,所以必须在某些地方存在着一些代码以满足这些请求,在代码层面上其实就是
public的方法,即类对外提供的公共接口
- 隐藏实现:类对外提供的公共接口+隐藏起来的数据。
类使用者
只需要知道类提供的公共接口能够完成什么功能即可,不需要知道该接口里面是怎么实现的:实现手段就是访问控制
- 访问控制
- 内部数据类型的设计思想:防止程序员接触他们不该接触的东西
- 也许类创建者修改类的内部结构,而不必担心这些修改会对已有的程序造成什么影响:例如将类的内部结构进行修改,用到该类的地方都要跟着修改,那就是一场灾难!将
接口与实现进行分离
,接口不变,实现改变,已有的程序只需要重新链接一下即可,不需要进行代码的修改
类的重复使用
直接使用类创建对象
:那么对这个类要求很高,要求类创建者具有较多的经验与洞察力继承
:本质就是对已有类的扩展extends
,子对象中包含了一个父对象组合
:将一个类的对象置于新类。灵活性强:将新类的成员对象
设置为private
,那么使用该类的客户程序员就不能访问他们,那么可以在不干扰客户代码的前提下,从容的修改那些成员对象
,甚至可以在运行时
动态的改变这些成员对象
。这种灵活性是继承
不具备的(因为编译器必须对通过继承
创建的类加以限制)
继承:等价与类似
- 目标:利用现成的数据类型,对其进行
克隆
,再根据情况进行添加和修改,得到新的数据类型(继承并不是完全等于克隆
) - 父类:
- 子类:
- 实现:通过
extends
关键字实现的,子类中包含了父类所有的成员(尽管父类的private成员被父类隐藏起来了且不能访问,但的确被子类继承下来了,只是不能访问而已)。更为重要的是子类复制了父类的接口:可以像父类对象发送的消息同样可以发送给子类对象 - 接口:这里的接口可以理解为父类的public的方法,以供外部调用
等价关系
is-a
:子类继承父类,子类与父类具有完全相同的接口(public的方法),子类并没有新添自己的方法。在这种情况下,可以理想的将子类对象替换成父类对象
类似关系
is-like-a
:子类继承父类,子类与父类具有完全相同的接口(public的方法),子类新添自己的方法,即新类型拥有了旧类型的接口,但还包含了其他方法,所以他们不是完全等价的。
来源:CSDN
作者:点康慕
链接:https://blog.csdn.net/MOOG007/article/details/104626037