一切都是对象

用引用操纵对象

在Java中,一切都被视为对象,因此可采用单一固定的语法。尽管一切都看作对象,但操纵的标识符实际上是对象的一个引用(reference)

String s;

这里所创建的只是引用,并不是对象,此时s并没有与任何事物相关联(没有初始化)。

必须由你创建所有对象

一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用new操作符来实现这一目的。

储存到什么地方

有五个不同的地方可以存储数据。

寄存器

这是最快的存储区,位于处理器内部。不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。

堆栈

位于通用RAM(随机访问控制器)中,但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期。以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些Java数据存储于堆栈中 --- 特别是堆栈的引用,但是Java对象并不存储于其中。

一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈之处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配空间存储有很大的灵活性。这种灵活性要付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行储存分配需要更多的时间。

常量存储

常量值通常直接存放在程序代码内部,这样做是安全的。有时,在嵌入式系统中,常量本身会和其他部分隔离开,在这种情况下,可以将其存放在ROM中。

非RAM存储

如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。两个基本的例子就是流对象和持久化对象。

特例:基本类型

在程序设计时经常遇到一系列类型,需要特殊对待。可以把它们想象成基本类型。之所以特殊对待,是因为new将对象存储在堆里,故用new创建一个对象,特别是小而简单的对象,往往不是很有效。

对于这些基本类型,不用new来创建变量,而是创建一个并非是引用的自动变量。这个变量直接存储值,并置于堆栈中,因此更加高效。

Java中基本类型所占储存空间大小是固定的,不会随机器硬件架构变化而变化。

基本类型

大小

最小值

最大值

包装器类型

boolean

-

-

-

Boolean

char

16-bit

Unicode 0

Unicode 2^16-1

Character

byte

8 bits

-128

+127

Byte

short

16 bits

-2^15

2^15-1

Short

int

32 bits

-2^31

+2^31-1

Integer

long

64 bits

-2^63

+2^63-1

Long

float

32 bits

IEEE754

IEEE754

Float

double

64 bits

IEEE754

IEEE754

Double

void

-

-

-

Void

所有数值类型都有正负号,所以不要去寻找无符号的数值类型。

基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本类型。

public class TIJ001 {
    public static void main(String args[]) {
          // 基本类型和包装类的互相转换
        char c = 'x';
        Character ch = new Character(c);
        Character ch1 = new Character('x');
        Character ch2 = 'x';
        char c2= ch;
    }
}

高精度数字

Java提供两个用于高精度计算的类:BigInteger 和 BigDecimal。两个类包含的方法,提供的操作与对基本类型所能执行的操作相似。也就是说,能作用于int或float的操作,也同样能作用于 BigInteger 和 BigDecimal。只不过必须以方法调用方式渠道运算符方式来实现。

BigInteger支持任意精度的整数。

BigDecimal支持任意精度的定点数。

数组

Java确保数组会被初始化,而且不能在它的范围之外被访问。当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值有自己的关键字null。

还可以创建用来存放基本类型的数组,编译器也能确保这种数组的初始化,并把数组所占内存全部置零。

永远不需要销毁对象

作用域

作用域决定了其内定义的变量名的可见性和生命周期。

Java是一种自由格式(free-form)的语言,所以,空格、制表符、换行都不会影响程序的执行结果。

{
      int x = 12;
      {
          int x = 96;    // illegal
      }
}

C和C++里将一个较大作用域的变量“隐藏”起来的做法,在Java中是不允许的。

对象的作用域

Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。所以假如你采用代码:

{
      String s = new String("a string");
}

引用s在作用域终点就消失了。然而,s指向的String对象仍继续占据内存空间。

创建新的数据类型:类

class ATypeName {
      /* Class body goes here. */
}

字段和方法

一旦定义了一个类,就可以在类中设置两种类型的元素:字段(数据成员)和方法(成员函数)。

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

基本类型

默认值

boolean

false

char

'\u0000' (null)

byte

(byte)0

short

(short)0

int

0

long

0L

float

0.0f

double

0.0d

当变量作为类的成员时,Java才确保给定其默认值,以确保那些是基本类型的成员变量得到初始化。

上述确保初始化的方法并不使用于局部变量。

方法、参数和返回值

Java中的方法只能作为类的一部分来创建。方法只有通过对象才能被调用,而这个对象必须能执行这个方法调用。这种调用方法的行为通常被称为发送消息给对象

最后更新于

这有帮助吗?