这里引用Java编程思想的一句话叫所有语言的最终目的都是为了提供一种抽象方法。为什么会怎么说啦
,因为我们的Java语言就是抽象了JVM这个虚拟机,从而在一个虚拟空间里面可以解决我们现实生活中
的问题。在我们的的生活中每个人都是独一无二的,每个人的生活价值观也都会有所不同,所理解的对象
也会有所不同。按照生物书上所说对象,分为两种,一种是能动的自然,一种是非动的自然。按照历史来
归类,我们可以理解为,不同的时代为不同的对象。按照时间来区分对象,对象又分为过去,现在,和未
来。这里我要说的是在面向对象编程里面的对象到底是什么。我归纳出了一下几点:
1.每个对象都会对应一个物体,对象是我们在计算机虚拟世界里所创造出来的一个个物体。
这些物体可以和我们的现实世界相互对应。
2.每个对象都会有自己的存储空间,即可以组成其他对象,达到对象和组合和聚合。
3.每个对象都有自己的状态,即创造,使用,赋值,销毁。在我们需要使用的时候就去创造
并使用不需要了就可以去销毁。
4.每个对象都有自己的使用价值,如果一个对象没有其使用价值,那创造出来也没有任何
意义。
5.每个对象都会有一种类型,可能这个说法比较隐晦,在后面我会说到。
现在假设一个场景,我需要有一个对象,这个对象可以帮我管理图书这就是他的使用价值。
那么我们首先会去创建一个类,叫做图书类。这样我们都知道了,这个对象的类型叫做图
书类,对应第五个特征。这个对象对应一个物体,就是图书,和我们生活中的图书所对象。
当我们创造出这个对象后,系统会为他分配内存空间,我们可以把图书类和管理员类,组
合或者聚合在一起成为一个图书管理类。当我们创建好Book类的时候,他的状态就是创建,
这对应的第三个特点,每个对象都有自己的状态。
接着讨论一下类和对象的概念:
在面向对象的编程中,万物皆对象,那么类也是一个对象了,但类不是一个具体的对象,
而是一个抽象的对象,我们说类就是一组具有相同特点对象的集合,或者说类就是一个模板,
它抽象了一组对象的特点。举个简单的例子吧,我们都知道人大致是由什么组成的。
如果与面向对象相对应的话,我们会创建人这个类,这个类里面会有头颈躯干四肢。
我们说这个类是人这个对象。但是人只是一种类型,并不是一个具体的事物,在我们
可以根据人这个类,去具体化这个类,也就是说目前我们只知道他是个人,但是你并
不知道他是个什么人,我们说再现实生活中,你想让张三帮你做事情,这个时候你只
需要告诉张三你要干什么事情。假设我们不去实例化这个人,我们说你能叫人帮你做
事情吗,肯定不行。这个时候可以总结为类是一类物体共同抽象的特征,而对象是类的
一个实例。我们说在java里面最小的组成单位是类,这个类可以是一个空类,也可以有很
多的抽象特征。还是引用人这个类,他可以按照上图那样分类,也可以按照器官去分类,
当然了,人最小的组成单位是细胞,如果按照细胞来分的话可以分为40万-60万亿个细胞。
对应java类,也就是会有上亿个属性值了,这样想想会是多么可怕。所以我们说每个类都
有他自己的使用价值,创造一个类是为了解决我们现实生活中的问题的,如果我们要去在
计算机里研究一个人的四肢,我们可以把人按四肢来分类。如果要研究器官就可以按照器
官来分类。如果是为了解决一个取钱的业务问题,我们可以按照人的特征来分类。
所以我们的面向编程语言里面用class(分类),而不是用type(类型)来表示类;
既然说到面向对象就不得不提到面向对象的三大特征,封装,继承和多台;
1.封装:
封装简单的来说,就是把客观世界中一些单一的属性抽象成一种可以用来描述和解决问题
空间的一种类。我们说人是一个类,他是由多个属性组成。我们把这些属性都设置为private的
防止不可信的类对其修改,而把操作这些属性的方法给释放出去,从而达到良好的封装效果。
这里要注意一点是,一旦一个类封装完毕,那么其结构将不可更改。
2.继承:
继承是为了让我们不用去改变其原有的类,也能够使用许多新功能。继承主要有两种实现
方式,一种是父子关系继承。这也是传统意义上的继承,即子类继承父类的方法和属性,
并在其基础上进行扩展,有时我们也把父类 称为超类和基类,子类称为派生类。这里
有一点要注意的是,其继承类有没有包含关系,比如说现在有人这个类,由它派生出了
黄种人,白种人,这几个类,这都是没有问题的。但是如果派生出腿这个类就有点问题了,
因为腿是属于人的一部分,可以算作是它的一个属性,虽然java代码可以允许你这样做,
但是这显然不符合面向对象的原则。
还有一种是非传统意义的特殊继承,我们称之为接口继承,接口是一个很特殊的类,他是用
interface来进行修饰的,他定义了一套实现方法和参数,继承了这个接口的类,必须去实现其中
的方法。
3.多态:
所谓多态就是指一个类的实例在不同的情景下有不同的类型和不同的行为(方法)。相信大家都听过南
橘北枳这个成语了吧,同是橘这个类,但是到了南边就会被实例化为橘子,到了北边就会被实例化为枳。
而多态最好的实现方法是重写和重载,即子类重写了父类的方法,有时也称为覆盖。重载是一个方法有
几种不同的参数,而程序在编译期间是不知道会调用哪个具体的方法,只有在运行此函数(方法)的时
候程序才会根据你的参数类型,显示的去调用。
这里再简单的说一下面向对象的五大原则:
1.单一职责原则SRP(Single Responsibility Principle):
单一原则核心思想就是一个类最好只去解决一种问题,即功能要单一,明确。
2.开放封闭原则OCP(Open-Close Principle)
对外扩展开发,对内修改封闭。