java 万物皆对象(Object)

来源:互联网 发布:2ne1 解散 知乎 编辑:程序博客网 时间:2024/05/17 07:14


面向对象编程具有多方面的吸引力。


抽象


所有的编程语言的最终目的都是提供一种“抽象”的方法。

1.所有的东西都是对象。可将对象想成成一种新型的变量:保存着数据,但可要求他对自身进行操作。

2..程序是一大堆对象的组合:通过消息传递,各对象知道自己该做什么。

3.每个对象都有自己的存储空间,可容纳其他对象

4.每个对象都有一种类型,很具语法,每个对象都是某个“类”的一个“实例。

5.统一各类所有的对象都能接受相同的信息


对象的接口


在这个例子中,类型/类的名称是 Light,可向 Light 对象发出的请求包括包括打开( on)、关闭( off)、
变得更明亮( brighten )或者变得更暗淡( dim)。通过简单地声明一个名字( lt),我们为 Light 对象创建
了一个“句柄”。然后用 new 关键字新建类型为 Light 的一个对象。再用等号将其赋给句柄。为了向对象发
送一条消息,我们列出句柄名( lt),再用一个句点符号( .)把它同消息名称( on)连接起来。从中可以看
出,使用一些预先定义好的类时,我们在程序里采用的代码是非常简单和直观的。


隐藏


Java 采用三个显式(明确)关键字以及一个隐式(暗示)关键字来设置类边界: public, private,
protected 以及暗示性的 friendly。若未明确指定其他关键字,则默认为后者。这些关键字的使用和含义都
是相当直观的,它们决定了谁能使用后续的定义内容。“ public”(公共)意味着后续的定义任何人均可使
用。而在另一方面,“ private”(私有)意味着除您自己、类型的创建者以及那个类型的内部函数成员,其
他任何人都不能访问后续的定义信息。 
 


继承

“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。在继承过程中,若原始
类(正式名称叫作基础类、超类或父类)发生了变化,修改过的“克隆”类(正式名称叫作继承类或者子
类)也会反映出这种变化。在 Java 语言中,继承是通过 extends 关键字实现的




为“几何形状”新类型编写的代码会象在旧类型里一样良好地工作。所以说程序具
备了“扩展能力”,具有“扩展性”。



“抽象”的—— 使用 abstract 关键字。若有人试图创建抽象类的一个对象,编译器就会阻止他们。这种工具
可有效强制实行一种特殊的设计。
亦可用 abstract 关键字描述一个尚未实现的方法—— 作为一个“根”使用,指出:“这是适用于从这个类继
承的所有类型的一个接口函数,但目前尚没有对它进行任何形式的实现。”抽象方法也许只能在一个抽象类
里创建。继承了一个类后,那个方法就必须实现,否则继承的类也会变成“抽象”类。通过创建一个抽象方
法,我们可以将一个方法置入接口中,不必再为那个方法提供可能毫无意义的主体代码。
interface(接口)关键字将抽象类的概念更延伸了一步,它完全禁止了所有的函数定义。“接口”是一种相
当有效和常用的工具。另外如果自己愿意,亦可将多个接口都合并到一起(不能从多个普通 class 或
abstract class 中继承)。


对象的创建和存在时间

在一个内存池中动态创建对象,该内存池亦叫“堆”或者“内存堆”。若采用这种方式,除非
进入运行期,否则根本不知道到底需要多少个对象,也不知道它们的存在时间有多长,以及准确的类型是什
么。这些参数都在程序正式运行时才决定的。若需一个新对象,只需在需要它的时候在内存堆里简单地创建
它即可。由于存储空间的管理是运行期间动态进行的,所以在内存堆里分配存储空间的时间比在堆栈里创建
的时间长得多(在堆栈里创建存储空间一般只需要一个简单的指令,将堆栈指针向下或向下移动即可)。由
于动态创建方法使对象本来就倾向于复杂,所以查找存储空间以及释放它所需的额外开销不会为对象的创建
造成明显的影响。



万物皆对象
在 Java 里都得到了简化,任何东西都可看作对象。因此,我们可采用一种统一的语法,任何地方均
可照搬不误。但要注意,尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”
( Handle)。


列如

String s;
但这里创建的只是句柄,并不是对象。若此时向s 发送一条消息,就会获得一个错误(运行期)。这是由于
s 实际并未与任何东西连接(即“没有电视机”)。因此,一种更安全的做法是:创建一个句柄时,记住无
论如何都进行初始化:
String s = "asdf";
然而,这里采用的是一种特殊类型:字串可用加引号的文字初始化。通常,必须为对象使用一种更通用的初
始化类型。


所有对象都必须创建

用new 关键字达到这一目的。 new 的意思是:“把我变成
这些对象的一种新类型”。所以在上面的例子中,可以说:
String s = new String("asdf");


字串( String)并非唯一的类型。 Java 配套提供了数量众多的现成类型。对我们来讲,最重要的就是
记住能自行创建类型。



保存?

寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存
器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的
程序里找到寄存器存在的任何踪迹
 


堆栈。驻留于常规 RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆
栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存
方式,仅次于寄存器。创建程序时, Java 编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存
在时间”。


堆。一种常规用途的内存池(也在 RAM 区域),其中保存了 Java 对象。和堆栈不同,“内存堆”或
“堆”( Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要
在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new 命
令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然
会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
 

静态存储。这儿的“静态”( Static)是指“位于固定位置”(尽管也在 RAM 里)。程序运行期间,静
态存储的数据将随时等候调用。可用 static 关键字指出一个对象的特定元素是静态的。但 Java 对象本身永
远都不会置入静态存储空间


常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数
需要严格地保护,所以可考虑将它们置入只读存储器( ROM)。








0 0