Java编程思想-一切都是对象

2.1 用引用操纵对象

尽管一切都看作对象,但操纵的标识符实际上是对象的一个“引用”。可以将这一情形想象成遥控器(引用)来操纵电视机(对象)。只要握住这个遥控器,就能保持与电视机的连接。当有人想改变频道或者减小音量时,实际操控的是遥控器(引用),再由遥控器来调控电视机(对象)。

此外,即使没有电视机,遥控器亦可独立存在。也就是说,你拥有一个引用,并不需要有一个对象与它关联。因此,如果想操纵一个词或者句子,则可以创建一个String引用:

String s;

2.2 必须由你创建所有对象

一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用new操作符来实现这一目的。new的关键字的意思是“给我一个新对象。”。所以前面的例子可以写成:

String s=new String(“aaa”);

2.2.2 特例:基本类型

在程序设计中经常用到一系列类型,他们需要特殊对待。可以把它们想象成“基本”类型。之所以特殊对待,是因为new将对象存储在“堆”里,故用new创建一个对象-特别是小的、简单的变量,往往不是很有效。因此,对于这些类型,Java采取与C和C++相同的方法。也就是说,不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量之境界存储“值”,并置于堆栈中,因此更加高效。

Java要确定每种基本类型所占存储空间的大小。它们的大小并不像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是Java程序比用其他大多数语言编写的程序更具有可移植性的原因之一。

sv1mWt.png

Java提供了两个用于高精度计算的类:BigInteger和BigDecimal。虽然它们大体上属于“包装器类”的范畴,但二者都没有对应的基本类型。

BigInteger支持任意精度的整数。也就是说,在运算中,可以准确地表达任何大小地整数值,而不会丢失任何信息。

BigDecimal支持任何精度地定点数,例如,可以用它进行精确的货币计算。

2.2.3 Java中的数组

几乎所有的程序设计都支持数组。在C和C++中使用数组是很危险的,因为C和C++中的数组就是内存块。如果一个程序要访问其自身内存块之外的数组,或在数组初始化前使用内存(程序中常见的错误),都会产生难以预料的后果。

Java的主要目标之一是安全性,所以许多在C和C++里困扰程序员的问题在Java里不会再出现。Java确保数组会被初始化,而且不能在它的范围之外被访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的。但由此换来的是安全性和效率的提高,因此付出的代价是值得的。

当创建一个数组对象,实际上就是创建了一个引用数组,并且每个引用都会被初始化为一个特定值,该值拥有自己的关键字null。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,在运行时将会报错。

2.3 永远不需要销毁对象

Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。也就是说,你根本不必担心内存回收的问题。你只需要创建对象,一旦不再需要,它们就会自行消失。

2.4 创建新的数据类型:类

一旦定义了一个类(在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象),就可以在类中设置两种类型的元素:字段(有时被称作数据成员)和方法(有时被称作成员函数)。字段可以时任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型的一种。如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象相关联。

DataOnly data=new DataOnly();

可以给字段赋值,但首先必须知道如何引用一个对象的成员。具体的实现为:在对象引用的名称之后紧接一个句点,然后再接着是对象内部的成员名称:

data.i=47;

data.d=1.1;

若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值。

svNZB6.png

2.5 方法、参数和返回值

Java的方法决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。下面是它最基本的形式:

ReturnType methodName(/* Argument list */){

/* Method body */

}

2.6 static 关键字

通常来说,当创建类时,就是再描述那个类的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。

当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。通常,你必须创建一个对象,并用它来访问数据或方法。因为非static域和方法必须知道它们一起运作的特定对象。

有些面向对象语言采用类数据和类方法两个术语,代表那些数据和方法只是作为整个类,而不是作为类的某个特定对象而存在的。

只须将static关键字放在定义之前,就可以将字段或方法设定为static。例如,下面的代码就生成了一个static字段,并对其进行了初始化:

class StaticTest{

static int i =47;

}

现在,即使你创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这两个对象共享一个i。

引用static变量有两种方法。如前例所示,可以通过一个对象去定位它,如st2.i;也可以通过其类名直接引用,而这对于非静态成员不行。

StaticTest.i++;

使用类名是引用static变量的首选方式,这不仅是因为它强调了变量的static结构,而且在某些情况下它还为编译器进行优化提供了更好的机会。类似逻辑也应用于静态方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值