二、一切皆对象:论对象的一生一世

一切皆对象

在面向对象程序设计中,所有的行为、数据等都需要基于对象,Java 中一切都被视为对象,因此在操纵对象上可以采用单一固定的语法。

《对象导论:从面向过程到面向对象的转变》那篇文章中,我们知道,对象即为服务提供者、数据的载体。现在我们类比现实世界中的具体事物,来看看一个对象应该具有哪些属性。

首先,我们需要给对象取名字(引用),再则,有的对象长得一样有的则完全不一样,我们需要对它们进行归类(数据类型),一个对象除了有名字和类型,还给它一个存在的空间(存储空间),有了存在的空间之后,考虑对象应该都具有一定的属性和行为(成员对象成员方法),例如一个人有身高体重,会吃饭,跑步等。

当我们有了一个完整的对象后,在程序的世界,可以想象自己是这个世界的上帝,而现在一个完整对象被创造出来,首先你需要使用对象的名字(引用)命令它做它会做的事(调用方法),询问或修改它所具有的属性的值(访问成员变量),有时候命令它做一件事需要给它一定的资源或一些工具(成员方法的参数),而当对象做完一件事时,你可能需要它给你一个反馈(成员方法的返回值)。

对象的创建和存储

Java中,我们使用引用来表示一个对象,例如:

String s;

这里,我们只声明了引用s,而没有给这个引用创建对象,

String s = "abc";
String str = new String("abc");

上述代码表示创建了一个字符串对象,Java 的一个特性:字符串可以用带引号的文本初始化。

思考一下,对象创建完了,那么对象被存放在哪,对象的引用又存放在哪?

Java 中,一共有五个地方可以存储数据:

  1. 寄存器
    位于 CPU 内部的寄存器,是最快的存储区,但是你不能直接控制。
  2. 堆栈
    位于 RAM(随机访问存储器),通过堆栈指针从处理器获得直接支持,通过指针移动来分配内存。是一种快速有效的分配存储的方法,仅次于寄存器。
    在堆栈中,Java 必须知道存储在堆栈内的所有东西的生命周期(思考一下如何确定一个引用的生命周期呢),以便上下移动指针进行内存分配。通常对象的引用存储于堆栈中。

  3. 一种通用的内存池(位于 RAM),所有 Java 对象存储于此。在这里,不需要知道对象的生命周期,当需要一个对象时,通过new来创建,自动在堆中分配空间,相当灵活。代价是我们不知道哪些对象已经没用了,需要使用特定机制进行清理。(Java垃圾回收机制
  4. 常量存储
    常量直接存储在代码中。
  5. 非 RAM 存储
    数据在程序控制范围之外的地方,例如持久化对象流对象。前者将数据转换成存在磁盘等位置的事物,后者将对象转换成字节流发送给其他设备。

对象的类型

Java 中,对象的类型可以分为两种基本类型引用类型,两者的区别是前者存储在堆栈中,后者需要 new 创建对象,对象实体存储在堆中。

Java 中基本类型一共 9 种:boolean,char,byte,short,int,long,float,double,void
重点提一下两个:boolean类型占多少字节没有明确指定,仅定义为字面值truefalsevoid类型没有明确说明是基本类型,但是存储位置在堆栈中。

引用类型则是包括了成员变量成员方法的,我们可以用class来定义一个类型,并且赋予它一定的行为和属性:

class Data{//创建一个类型
	//具有的属性
	int i;
	double d;
	//具有的行为
	int function(String s){
		return s.length();
	}
}
Data data = new Data();//创建 Data 类型的一个对象
int length = data.function("abc");//通知该对象做这个行为,同时给它数据,并接受反馈

注意:类中的成员变量在没有初始化条件下,会有一个默认值。方法体内的局部变量不具备这种性质。

数组
Java 中的数组在编译时期就需要确保被初始化以及不能越界。实现这个机制的代价是消耗少量内存以及下标检查。

如何确定堆栈中元素的生命周期

在 Java 中,引用基本数据类型通常存储在堆栈中,所以,Java 如何才能确切的知道这些引用和基本数据类型变量的生命周期呢?

这里需要引入作用域(scope)这个概念:

{
	int x = 12;
	{
		int q = 96;
	}
	//在这个位置只有变量 x,没有变量 q
}

以花括号为界限,决定了变量的可见性和生命周期。

同样的,对象也存在作用域的限制:

{
	String s = new Sring("abcdef");
}//此处已经没有 s 这个引用了

对于基本类型,因为存储于堆栈,它的生命结束时可以直接在堆栈中抹去,而引用类型除了存在堆栈中的引用,还有堆中的对象,当引用被抹去时,堆中的对象还存在着。

因此,需要 Java 的垃圾回收器对一些没有任何引用的对象进行销毁工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值