最近在整理由于比较空余,花了点时间把之前的学习笔记搬一下
面向对象可以理解为对事物进行分门别类(class), 然后通过不同的类型,创造出不同的对象实例,然后对这个实例进行操作。对象是类型的实体化,可以理解为描述事物的一个实体,对该对象进行操作既是对事物进行操作,当我们想要操作这个对象的时候,先要创者这个对象,然后再给对象发送操作的消息指令,例如:
Light lt = new Light(); ------>创造一个Light对象实体 lt
lt.on(); -------> 通过句点符号 . 给lt实体发出点亮灯的指令,如果这个实体没有问题的话, 这时候灯是亮起了
类可以说是对象的一个模板,通过类来创造一个实体,然后对实体进行操作,那么我们操作这个实体对象的时候,是否一定要知道对象内部的所有具体实现呢?答案是否定的,对象内部有些具体实现我们是不需要关心的,有些是可以知道的,有些是不能知道的,为了达到这个目的,在创造这种类型或者事物实体的时候可以指定这类事物内部细节的访问权限。
对于类(class)的使用者来说,大多数只关心自己要用到的功能,而不需要知道类里面的具体实现,为了更好的保护以及维护这类事物内部,Java提供了设置类控制访边界的关键字
public: 顾名思义是公共的,也就是任何人都可以访问
private: 顾名思义是私有的,也就是除了自己、类的创造者以及类型的内部函数成员
friendly: 顾名思义是友好的,这种访问界限限制在包范围内,也就是同属于这个包的其他事物可以访问friendly限定的东西
protected: 受保护的,继承类可访问受保护的类(暂时还不理解)
类的重复使用方法
1、包含其他类的对象
重复使用一个类最简单的方法就是直接使用这个类的对象,也就是通过其他类的对象,组织成一个新的类。例如一个人类包含大脑类一样。通常情况下这个内部的类设置成private属性,以防止其他使用者直接访问。在创建新类的时,优先考虑组织对象的方式
2、继承
继承最常用的类重复利用方法,继承通过克隆的方式使用现有类的功能,并根据实际情况进行添加和修改,当然了,如果父类发生改变了,通过继承创造的类也是会做出相应的改变,因而继承不仅仅是简简单单的克隆现有父类,还会根据现有父类的变化而变换。继承的关键字是extends,顾名思义就是根据实际情况拓展现有类的功能,形成解决新问题的新类。如果是简单的克隆一个基础类,不做任何的修改和添加去产生一个新类,也没有任何意义,我们希望的是新类(衍生类)和基础类(父类)在行为上面是不一样的,以解决一些新的问题,为达到这种不一样,有以下方法
a、为新类(衍生类)新增函数或者功能
b、改变基础类的现有函数行为,也就是在使用接口不变的情况下,重新定义基础类里一些函数,这样新的类也有不同的行为
继承后产生的衍生类和基础类的关系
a、如果衍生类只是改变了基础类现有函数的行为,那么衍生类的对象可以换成基础类的对象,替换成基础类对象后,对基础类对象发送消息时,衍生类也可以收到消息,并表现出衍生类的行为,这时候基础类和衍生类是一种等价关系,这里有个问题,基础类可以替换成衍生类吗?
b、如果衍生类不仅改变了基础类现有函数的行为,还添加了新的函数,这时候衍生类的对象依然可以替换成基础类对象,但是替换成基础类对象后,基础类对象只能相应和衍生类共有的部分,对于新增部分是不响应的,此时基础类和衍生类不完全等价
利用衍生类可以制造出和基础类具有不同行为的很多类,用来处理同一类事物不同实体的差异问题,最后将这些衍生类当做基础类来处理,然后对基础类对象发送消息,基础类对象就会根据不同衍生类对象做出相应的动作,这是一种非常巧妙的编程方法,例如:
void doStuff(Shape s){
s.erase();
s.draw();
}
Circle c = new Circle();
Square s = new Square();
Triangle t = Triangle();
doStuff(c);
doStuff(s);
doStuff(t);
从上面的例子,我们创建了Circle Square Triangle 衍生类并在doStuff中替换成Shape对象,当我们给Shape对象发送消息,例如erase和draw时,实际表现是具体Circle Square Triangle的行为,实现这种表现的技术在java里叫做动态绑定,这种把衍生类当基础类处理的方式叫做上溯造型
后面继续学习的概念:
抽象类
接口
集合
继承器