这里不去讨论面向对象的历史,去*看看,描述的很详细。主要把自己关于面向对象的一些理解记录下来,方便自己与有需要的人,进行温故而知新。
分为以下几个方面讨论:
1、为什么使用面向对象。
在面向对象出来之前,基本都是面向过程的。面向过程能够存在这么久,自然有他的历史,但是随着互联网的发展和项目工程的发展,面向对象的出现就成为了必然。
面向过程关注的是功能的实现,尽量以最少的代码去实现最复杂的功能,他注重的是效率,代码运行的效率以及对内存等硬件资源的使用上,典型的是C语言。
面向对象关注的是结构以及扩展,尽量去利于开发人员进行开发,尽量提高整个团队的工作协调效率,关注的是整个团队,以及大的项目的管理 开发 维护工作。
面向对象的优势在于团队协作以及良好的扩展性。例如在大的项目团队中,或者是复杂的工程中,肯定不能够一个人完成所有工作,这个时候就要一群人进行协作,但是每个人的进度不一样,以及项目的模块之间的依赖顺序不一样,因此就需要大家分开协作,或者是同时进行不同模块的开发,或者是不同模块不同时进行,甚至是同一模块,前后不同人员维护等等,这个时候就需要清晰的结构以及很强的独立性,即是松耦合,所有的设计模式都是为了实现这个目的而存在的。就算是 对于一个人的项目,也存在易扩展行,高维护性等问题。不能每次添加新功能都要对所有的代码进行修改,这样不但工作量极大,并且出错率很高,完全浪费了前面的成果。因此,面向对象的出现是一种必然。
但是面向对象也有自己的缺点,就是工程量较大,为了考虑以后的扩展性和松耦合性,涉及到大量的设计模式,并且一个好的框架对以后的扩展 维护很重要,因此就要求前期必须涉及好整个框架,否则就失去了面相对象的优势,同时还无谓增加了代码量。
2、如何使用面向对象。
既然面向对象有这些优点,那么什么内容可以作为对象,答案是“什么内容都可以作为对象,一切皆为对象”。对象主要是包括两个部分:标志和行为这两个属性。
标志主要用来标志所创建对象的状态位,而行为主要用来对象进行某些操作,例如更改自己的标志属性,或者更改其他对象的标志属性等。当然一个对象也可以是空的,即没有标志,没有方法,那么这个对象就什么也不做。
总体来说,标志位只是标志这一类中的不同对象,例如狗是一个类,通过狗的品种、大小、颜色等可以区分为哈巴狗、警犬等等。而对于同一类狗都会叫、跑等基本行为,但是又会根据不同的标志属性而表现出不同的行为习惯,就是说虽然都是狗,是一个类,但是他们属于不同的对象,因此会表现出不同的行为习惯。这个里面最好是使用接口或者抽象类来实现上层类,因为某个类的某个方法应该尽量的简单、明确、功能单一,这样利于管理和实现松耦合。
因此,是不是对象只是一种思路的改变,是一种看待问题的不同方式而已。只要你心中是对象,那么满世界都是对象。
3、JVM如何确定对象和原始变量。
对象中有标志属性和方法两大部分组成,标志属性也就是常说的变量。在java中变量有最基本的两个要求:类型和名称。对于类型又分为基本类型和复杂的引用类型。对于名称很简单,只需要遵守以下两个基本准则就行:必须以字母、下划线和$为开头,除首字母外可以使用数字;不得以java保留关键字作为变量名。
对于基本类型,主要包括以下8种:byte short int long float double boolean char,他们的区分标准就是表示的变量字节数,虽然会根据不同的JVM有所变化,但是总体来说是基本固定的,例如byte1个字节,short2个字节,int4个字节,long8个字节,float4个字节,double8个字节,bollean根据JVm来确定,一般是一个bite,char是2个字节。可以把基本类型想象成杯子,他就是一个容器,根据不同的杯子大小来表示存放的不同变量。每当你声明一个变量的时候,就创建了一个杯子,这个杯子必须有一个唯一的名字,然后通过这个名字对这个杯子的内容进行存取操作。
另外一种就是引用,主要是对对象的引用。每当你创建一个引用的时候,就在某一区域创建了一个固定大小的字节数,根据JVM来定,其中存放的可能是对对象的地址引用。这样就这个字节数的大小就与存放对象的堆区域的大小有关,一般是无法知道大小的,但是可能肯定的是所有引用的字节数都相同。这个因为的唯一作用,就是获取对其引用对象的操作权。创建一个对引用和对象的大致过程如下:
1、创建某一对象的引用,在内存中某一个固定区域,创建一个固定大小块,例如16个字节等。
2、创建一个对象,把这个对象存放到内存中一个固定的堆区域中,大小根据对象的变量和方法来确定。
3、把引用执行某一个类型的对象,类型必须一致。通过“=”进行建立连接。
4、引用销毁或者引用连接到其他对象,某一个对象没有再被引用,则会在需要的时候被垃圾回收器进行回收处理。
需要注意的是string和数组都是引用。无论是什么类型的数组,一定是一个引用,他执行某一片固定区域片;string也是一个引用而不是基本类型,因为每次对string的新建、修改等都会重建一个对象,只是把同一个引用指向了不同的对象而已,而没有在被引用的string对象就将要被回收。
对于如何区分是基本类型还是对象应用,有一个基本原则:创建的那一刻,JVM无法为其分配固定内存大小的,都是引用。请牢记上面的总结。
其实关于java无论多少书籍的深入剖析,以及设计模式,多态等的介绍,归根结底都是基于对象的,万变不离其宗的都是在围绕对象一词展开。