(如今的程序领域,大家都在说,面向对象OOP,但是真正能理解面向对象的含义的程序员却很少,究竟什么是对象,怎样面向对象)
一、面向对象
1、何谓对象:
在面向对象程序设计中,我们将问题空间中的元素以及他们在方案空间中的的表示物称作对象(object)
Alan Kay总结了smalltalk中对象的5大基本特征:
所有的东西都是对象。
程序是一大堆对象的集合,他们通过消息传递,各个对象之间知道要做些什么。
每个对象都分配有自己的存储空间,可容纳其他对象。
每个对象都有一个类型。
同一类的所有对象能接收相同的消息。
-----而所有的编程语言的最终目的是提供一种抽象方法----
2、对象的接口:
我们向对象发出请求是通过它的接口定义的,对象的类型决定了它的接口形式。
3、OOP中唯一关心的:
就是接口是什么,就像汽车的发动机一样,我们不必要知道它的结构是什么,只要它能工作就行了。
所有的程序是由一定的属性(数据)和行为(方法)组成的,不同的对象访问通过函数调用来完成,对象间的所有交流都是通过方法调用,通过对封装数据对象,很大程度上提高复用率。
4、对象的3个主要特征:
behavior—说明这个对象能做什么。
State—当对象施加方法时对象的反映。
Identity---与其他相似行为对象的区分标志,每一个对象有唯一的indentity, 而这3者是相互影响的。
5、面向对象中最重要的思想就是类
类是模板是蓝图,从类中构造一个对象,即创建了一个类的实例。
类好比一个建材市场,其中有许多子类--各种各样的装饰材料,而我们装修自己的房子就要选择我们需要的材料,(为了建立我们自己的程序,我们必须选择我们需要的类)这个比喻可以很形象的解释类是什么。
6、类之间的关系:
依赖关系:use-a A类中的一个方法操作了另一个类中的对象。
聚合关系:has-a A类中的对象包含B类的对象。
继承关系:is-a A继承了B类,此时A类不仅有了B类的方法,还加入了自己的方法。以便我们创建我们自己需要的对象。
7、继承:
Java中定义的每一个类都必须继承另一个类,使用关键字extends,如果一个类在定义中不现实使用关键字extends,这个类就会隐式继承Object类。
Object类又叫根超类,或基类。我们从根超类继承来的叫子类。Java中每个类都是根超类的子类。
8、接口(interface)规定了可对特定的对象发出哪些请求。
9.继承=重新使用接口:
创建出一个数据类型后,当需要新建立一个数据类型去实现相同的功能,是很没有意义的一件事,此时对其克隆后,再根据情况改进实现自己的目的就是继承。
10.封装:
就是把数据和行为结合在一起在一个包中,并对对象使用者隐藏数据的实现过程。
Java用3个关键字来设置边界,从而进行对数据的隐藏。
Public(共有)的定义任何人都可使用
Private(私有)意味着除你自己,类型创建者及那个类型的内部函数成员可以访问外其他任何人使用都会产生错误。
Friendly(友好)意味在包(package)中是可以访问的。(以上过程也可叫方案隐藏)
11.引用(Handle)操控对象:
当创建一个引用时必须要对其进行初始化
例:
String s=”happy” //(未建立连接)
String s=new string(“happy”) //与一个新的对象连接使用new 。
此句建立了一个引用,并且连接引用并初始化对象 赋值字符串“happy”
12、对象的创建及存在时间:数据存放的地点
》1:寄存器:
速度快,数量少,在cpu内部,我们对寄存器没有控制权
》2:堆栈:驻留长规内存中,堆栈指针下移建立新的内存,上移释放内存
》3:堆:
常用内存池,保存对象,有极大的灵活性,java的数据就存放在此,但是要以时间及效率为代价。Java的对象建立是在程序运行时才决定。而c++是在设计时建立对象。
对象的生存时间(lifetime):
Java提出的垃圾收集器可以很好的发现无须再用的对象,使用GC(grabage collector)垃圾收集器。清除对象,释放内存。为此我们就要付出一定的运行期的开销。
13、在此我们就会有这样一个印象,一个程序只是一系列对象的集合,他们的方法将其他对象作为自己的变量使用。
14、主要类型:
java的主要类型有:
boolean,char,byte,short,int,long,float,double,void
这些主类型的大小都不随机器的结构变化而变化,提供了java很好的可移植性。
15、字段方法:
字段又叫数据成员,成员函数又叫方法,java的全部工作就是定义类,制作类的对象及发送消息。
16、一个程序只是一系列对象的集合,他们的方法将其他的对象作为自己的变量使用,而且将消息发给那些对象。
17、名字的可见性:
为了使名字不重复,作者可以定义自己的库,一般用自己域名的倒写形式
如:
COM.: Leeak.utility.foidles
18、static关键字:
即使没有创建对象,也需要一愕能调用的方法,此时可以使用static
19、java.lang默认自动的导入每个java程序中
20、OOP中对象使对属性和方法的封装,对象具有信息的隐蔽的性质,对细节的隐藏,对象只需要知道去这样做,而不知道如何做的细节,类的方法应谨慎控制对java数据的访问,可以用get读取方法,用set修改方法。
21、pakage:
JavaAPI中每个类和接口属于一个特定的包,包实际上市对类和接口进行组织的目录结构,提供了一种软件复用机制。
22、创建可复用的类得步骤:
》1、定义一个public类
》2、选择一个包名,并把pakage语句加到可复用的类的源码中。
》 3、编译这个类。
》4、把可复用的类导入其他程序中即可。
23、java中提出在类定义的括号外的仅有2个语句,pakage和import。
24、软件的复用性,软件的复用性就是利用已有的,定义良好的的经过仔细测试的文档清晰的可移植的易于获得的软件构件开发新的软件。
以上就是java面向对象的一些基本术语的概述,其中的有些部分可以扩展的更深,看过think in java的 朋友就会有此种感觉。此文章向对初学者阐述了面向对象的基本概念。对已是java程序员的朋友可以对他们的基本知识做以回顾。
我在此说明几点:
1、对于作者这篇文章中所说的,我标示红色的地方,使我们经常会有疑问的地方,之前大家都一直在问常量池存在于哪里,我觉得是在方法区中,作者说是在栈中,我的理解是,栈内存是一块很大的内存,里面可能包含方法区,而常量池是在方法区中,如果细分的话,就是将方法区从栈内存中分离出来,所以会说常量池不存在栈内存中。仅为个人观点,大家仅供参考。
2、看了这篇文章,问个提过的问题,javac是对象吗?
是不是对象,大家看看是不是javac符合对象的标准,在百度百科上将javac解释为:
javac 是javaC语言编程编译器。javac工具由java语言编写的类和接口的定义,并将它们编译成字节代码的class文件。javac 可以隐式编译一些没有在命令行中提及的源文件。用 -verbose 选项可跟踪自动编译。
那么,文章中说,所有东西都是对象,即万物皆对象。
我的理解是:从对象的特征验证,如下:
第一、所有东西都是对象,javac符合
第二、javac也是一个程序,可对你编译的文件操作,进行消息的传递,作用于.java文件上
第三、每个对象有分配自己的存储空间,javac是java的一种命令,那么它一定有自己的定义和实现方法,这些方法在运行时也存在于java分配的内存中,至于具体在哪,本人才疏学浅,今后还需深入研究。javac可以容纳.java文件,将其编译成为.class文件。
第四、每个对象都有一个类型,javac应该属于类类型的。因为javac被封装成一个操作.java文件的类,内部实现方式我们是不知道的,直接使用这个编译器即可。
第五、同一类的所有对象能接受相同的消息。这句话的意思我理解是同一个类是可以接收相同的参数的,javac接收的.java文件,那么这个相同的消息就是.java的传入。