Java编程思想 第二章:一切都是对象

1. 用引用操作对象

在Java中一切都是对象,但操纵标识符的是对象的一个“引用”。可以将这一情形想象是电视机与遥控器的关系。电视机是一个对象,遥控器是对象的引用,我们在房间里拿着遥控器不管在哪里都可以操控电视机对象。此外,脱离电视机对象,遥控器引用也是可以独立存在的。因此有如下代码:

String s;

这里只是创建了一个引用,并没有创建对象,如果此时向s发送消息的话,会报出运行时异常的错误,因为我们并没有给这个引用指定对象,前文我们说到消息的传递都是基于对象的。所以我们在声明引用的时候要进行初始化:

String s="abc";

2.必须由你创建所有对象

我们创建了一个操作对象的引用,通常希望它可以与一个对象进行关联。Java中更通用的做法是使用new关键字创建一个对象。new关键字的意思是“给我一个新的对象”,因此上文的例子可以写成:

String s = new String("abc");

表示给我一个String类型的对象,并且初始化值为“abc”

当我们创建好对象时,他们是怎么样进行内存分配的呢?程序在计算机中,有如下五个地方可以存储数据:

  1. 寄存器:这是最快的存储区,他与其他存储区不同的地方在于他在处理器的内部。同时他的数量也是非常有限的,因此他也是根据需求进行分配,你基本不能自己控制他进行内存分配。
  2. 堆栈:位于通用RAM(随机存储器)中,通过堆栈指针可以从处理器得到支持,指针向下移动分配新内存,指针向上移动回收内存。这是一种快速有效的分配内存方式,仅次于寄存器。创建程序时,Java系统必须知道处于堆栈中的所有项的确切声明周期,以便堆栈指针的移动。这一操作限制了程序的灵活性,虽然Java中某些数据存储在堆栈中,比如对象的引用,但是Java对象并不存在堆栈中。
  3. 堆:一种同样位于RAM中的内存池,用于存放所有的Java对象,堆不同于堆栈的好处在于编译器不需要提前知道对象的确切声明周期,因此灵活性很高。当需要一个对象的时候,只需要new一段代码,会自动的分配所需要的内存。当然这种分配的效率要比使用堆栈的低。
  4. 常量存储:常量值通常存在程序代码内部,这样做使得他们永远不会被改变。在部分嵌入式系统中,常量本身会与其他部分分离,这种情况通常将常量存储在ROM(只读存储器)中。
  5. 非RAM存储:数据可以完全存储在程序之外,那么他可以完全不受程序的控制,即便程序没有启动也可以存在。比如文件流对象和持久化对象。文件流通常是被发送给另一台机器,持久化对象通常存储在硬盘中。

在这里插入图片描述

所有的数值类型都有正负号,所以Java中不存在无符号类型。

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

char c = ‘x’;
Character ch = new Character(c);
也可以这样用:
Character ch = new Character(‘x’);
Java SE5的自动包装功能可以自动的将基本类型转换为包装器类型:
Character ch = ‘x’;
也可以反向转换:
char c = ch;
  • Java里面自动包装的特性

3.永远不需要销毁对象

Java语言与其他语言都有作用域的概念,作用域决定了在其内部定义的变量名的可见性和生命周期。作用域为对应的花括号区间内部。Java对象与其他的基本类型不同,他可以存活于作用域之外。如:

String s = new String("x");

引用s在对应的作用域终点就消失了,然而,s指向的String对象仍然占据内存空间,我们无法在作用域之外访问这个对象,因为它的唯一的引用已经超出了作用域的范围,后面会讲述程序的执行过程中,如何传递和复制对象的引用。Java中,只要你需要,对象会一直存在,Java自带了垃圾回收器,用来监视new创建的对象,并辨别那些不会再引用的对象,从而释放内存供其他对象使用。所以在Java中不必担心忘了释放对象的内存。

4. 创建新的数据类型:类

Java中会为类当中(不是类中的不算哦)的基本类型成员提供一个默认值,以确保这个基本数据类型可以有效的进行初始化,防止程序出现错误,当然这个初始化的值可能不符合程序需求,需要自己明确的进行初始化。如果不是在类中的基本类型变量,那么它初始化的值是随机的。具体默认初始化的值如下:
在这里插入图片描述

扫描二维码关注公众号,回复: 4471868 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_21125183/article/details/84892603
今日推荐