java 数据类型

Java的数据类型可以分为两大类:基本数据类型和引用数据类型。为了实现数据类型的统一,我们做出如下约定:数据类型后紧跟的标识符我们统一称为变量名(基本数据类型定义的称为变量,引用数据类型声明的称为引用)。

类型名  变量名;此种语句称为声明。

变量名 = 内容;此种语句称为赋值。

我们先了解一下.class文件在内存中是如何存储的。.class文件加载到内存时引用数据会存放在堆中,变量存放在栈中(栈是后进先出的顺序表或者链表,因此局部变量有效性最高,生存周期最短),常量存放在数据区(data segment),代码存放在代码段(code segment)。

因此我们对数据类型的应用可以归结到以下几点:

1、数据类型后紧跟一个变量名,表示在声明一个变量名;

2、所有变量名都是先声明、后赋值、再使用(即不能使用未初始化的变量和无效引用);

3、变量名本质都是地址,他们的内容都存储在栈中;

4、方法(功能模块)的返回值是数据类型或者void;

5、参数表只能是空或者这样的参数表:数据类型  形式参数,数据类型  形式参数,……

6、在参数传递过程中,传递的始终是变量名对应空间中的内容,即都是栈中的内容;

在下面对基本数据类型和引用数据类型进行讨论,我们会发现他们都会遵循上面的规律,尽管他们略有不同。


一、基本数据类型

通常认为包含8种:byte、short、int、long、float、double、char、boolean。此处以int为例进行分析。

如:int i;int为数据类型,i称为变量。此处我们声明了一个整型的数据类型。但是由于int在空间分配上是已知的,因此在程序执行到此语句时会在栈中给i分配一个4字节的空间,将此空间取了一个名字叫i,i表示的就是这片空间的首地址。因此我们通常将此语句称为定义一个变量i。定义后内容为空。

所谓首地址有这样一个概念:内存空间按照每字节存储,每字节为一块,4字节就是连续4小块组成的内存空间。首地址就是4字节数的低字节所在空间的物理地址。由于这4个字节是一个整体,我们通常认为这片空间取名就叫i。实际上i表示的是低字节的物理地址。当然我们不会去了解这个物理地址。而对于计算机而言,它并不认识i这个变量,只能通过i代表的物理地址去找到i的内容。

i = 1;给定义的变量i赋值为1。此处就是给变量赋值。通常我们会将这两个语句写在一起:int i = 1;即在定义一个变量i的同时给他赋值为1,我们可以称之为变量的初始化。i中保存的就是1这个数字。

二、引用数据类型

引用数据类型包含类和数组。二者本质上是一样的,这里将通过类来讨论。类创建的叫对象,而指向对象的变量名就称为引用。如下面这个例子:

Class a;其中Class是一个类,a就是我们声明的一个引用。此处我们声明了一个引用。前面我们讲到class文件加载到内存中的存储方式,基本数据类型在定义时就分配了内存空间, 并且是存储在栈中,但是我们需创建的对象空间大小不明,并且引用数据应当存储在堆中,那么在这一步我们会分配内存空间吗?事实上引用声明时不会给对象在分配内存空间,但是会在中给引用分配一个4字节的内存空间(字节数通常跟操作系统和硬件结构有关)。这样一来就和基本数据类型的定义是一致的。此时声明的引用称为无效引用,同样不能使用。所谓无效引用就是这个变量名并没有保存内容(没有保存内容不等于null)。
a = new Class();给声明的引用赋值。这和基本数据类型是一致的。

我们先看一下a = new Class();的过程。这个过程大致分为两步:

1、创建一个Class对象;

2、将对象的首地址保存在引用a中;

我们也可以像基本数据类型一样,将他们合起来写:Class a = new Class();它的含义是创建一个对象,并将对象的首地址赋给引用a。那么这个步奏大致为3步:

1、在中开辟一片空间,并取名为a,a中只能保存地址,不能保存其他基本数据类型;

2、在中开辟一片连续空间,保存对象内容;

3、将堆中对象的首地址保存在a中;

如此我们就分清楚了对象和引用的概念:

对象:是类的实例,它在内存堆中占据一片连续的空间,它的存储空间没有名字。

引用:变量名,存储的内容是对象的首地址,位于栈中,引用就是给存储空间取的名字。

一旦涉及对象,为了避免混淆,通常我们会将引用和对象的关系称为指向,即引用指向某个对象。


基本数据类型和引用数据类型的区别:

变量和引用的本质:在上文分析的时候,我们知道其本质都是地址——某个连续内存空间的首地址(包括一字节存储也可以看为是首地址,因为它只有一个内存地址)。但又有很大的差别。

1、存储内容不同。基本数据类型定义的变量保存的是字面值,引用数据类型保存的是地址值。

2、数据调用不同。变量可以直接操作使用,引用必须是调用成员。变量的有效值可以直接使用变量名而得到,而引用的有效值是引用指向的对象的成员,所以需要通过引用成员的方式调用有效值。数组元素调用:数组名[下标],对象成员调用:引用.成员名。直接使用引用是没有意义的(没有重写toString)。像这样的语句:Dog da;da= new Dog();System.out.println(da); 输出结果就是:Dog@2a139a55。

3、运算不同。引用中的存储的内容除了能够被赋值以外,在变量中可以使用的其他任何运算符,在引用中都不可用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值