一切都是对象
"如果我们说另一种不同的语言,那么我们会发觉一个有些不同的世界。"
--------Luduing Wittgerstein(1889-1951)
最近在学习《java编程思想》这本书,写这类文章,主要是用于学习交流,不当之处,欢迎大家指正错误,共同进步。
首先,java是一门面向对象的语言,何为对象?本科生菜鸟的我,来说一下我的理解,不当之处,欢迎指正!
何为对象,万物皆为对象,一滴水,一粒沙,一个人。。。都可以看做对象,我们可以把生活里的实物,待解决问题里面的名词看做对象(如我们想解决盖房子的问题,就可以把建筑工人,卡车等看做对象),可见对象就是一个“实实在在”的“物体”,它”有血有肉“(对象有自己的属性),还可以完成一些”动作“(对象有自己的方法)。而面向对象这种编程思想就是一种把问题抽象成一个一个的对象,他们之间相互交流,协调工作,从而解决问题的方法论。
对象具有状态,行为和标志。每一个对象可以拥有内部数据(它们给出了该对象的状态,”内部“则体现了对象的封装性,好比,在盖房子的问题里,我们不需要,也不能了解建筑工人内部的毛细血管)和方法(它们产生行为),并且每一个对象都可以唯一的与其他对象区分开来,具体地说,就是每一个对象在内存中都有一个唯一的地址。
好了,暂时从思想上理解对象到这种程度。下面,我们按《java编程思想》本章的顺序进行学习总结。
1.用引用操纵对象
先讲一个例子,你用遥控器可以操纵电视机,你想看到,听到的东西都是从电视机得到的,但你不必带着电视机,只需拿着遥控器就能实现对电视机的操纵。
例如: String s; (1)
String s=new String("aaaa"); (2)
String s="aaaa"; (3)
(1)中只是一个声明,只是一个引用,不是对象,s就好比是个遥控器,但这时候,你不能看电视,因为并没有电视机出现.
(2)中创建一个引用的同时并进行初始化。 new String("aaaa")建立了一个“电视机”,String s建立了一个“遥控器”,String s=new String("aaaa")将“遥控器”指向“电视机”,以后对“电视机”的操作,均可用“遥控器”来代替。
(3)与(2)相同,因为字符串可以用带引号的文本初始化。
2.内存分析
如果上面的“引用与对象”不太明白,我们也可以从内存的角度加以区分。
在java中主要存在4块内存空间,这些内存的名称及作用如下:
a.栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)
b.堆内存空间:保存每个对象的具体属性内容。
c.全局数据区:保存static类型的属性。
d.全局代码区:保存所有的方法定义。
在栈内存里保存的是引用,即保存的是“遥控器”,在堆内存里面,保存的是对象,即保存的是“电视机”。如下图:
有人会问了,那为什么要采取这种方式来创建和操纵对象呢,在我看来,原因有: (1)引用相当于给对象进行了命名,我知道下次用什么方式来获取该对象(2)因为对栈内存的操作速度比对堆内存的速度要快,对引用的调用比直接对对象调用要快。(3)可以有多个引用对应同一个对象,如下图(暂时想到这么多,理解的不够深刻,欢迎补充,指正。)
当然,凡事都有例外,也有一些对象不是存在堆内存里的,而是存在栈内存里,那就是基本类型:boolean,char,short,int,long,float,double,void
3.垃圾回收机制
在上述的内存分配中,你会发现,在堆里面的对象是可以单独存在的,万一对该对象的引用不见了,那么就无法对该对象进行操作了,这种无法使用的对象就变成了垃圾,在java里有垃圾回收器,用来监视用new创建的所有对象,并辨识那些不会再被引用的对象,随后便释放这些对象的内存空间,所以我们不用担心这类问题,java默默的帮我们处理好了。
4.新的数据类型: 类
万物皆对象,有些对象时极其相似的,他们可以归为一类,如:韩寒,郭敬明两个对象,可以归为一个类型:男人。所以,具有某些相同特征的对象就组成了类,在java里用class定义。一种类就是一种数据类型,对象是对类的具体实现。我们可以采用这样的说法:一个对象,一种类。
对于类的说明,可以看书理解,在此不再赘述。
感想:
第一次写,感觉有很多东西在脑子里,却很难跑到文章里,会继续加油。欢迎交流指正。