在Java中提供了两种数据类型:原始类型和引用类型。 本文主要针对这两种类型进行说明,便于在实际开发过程中正确选择合适的数据类型。
1. 原始类型
Java中的原始类型是不同于类的基本数据类型,包括如下8种基本类型:double、float、byte、short、int、long、char、boolean。这8种 原始类型直接存储在Java的内存栈中,数据本身的值也是存储在栈中,即当声明了一个原始类型时,就在栈中为类型本身申请了存储。
同时,Java为每个原始类型提供了对应的封装类型,分别如下:
原始类型 | 封装类 |
double | Double |
float | Float |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
boolean | Boolean |
Java中针对原始数据类型提供了对应的封装类,因为在类中可以定义一些必要的方法,用于实现基本数据类型的数值与可打印字符串之间的转换,以及一些其他的实用程序方法;
另外,有些数据结构库类只能操作对象,而不支持基本数据类型的变量,包装类提供一种便利的方式,能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。
2. 引用类型
引用类型和原始类型的行为完全不同,分别具有不同的语义,并且具有不同的特征和用法,它们包括:大小和速度问题,使用原始类型无须调用 new,也无须创建对象,这节省了时间和空间。另外,对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
下面用一段简单的代码看看原始类型和引用类型在实际编码中的区别:
package DataType;
public class Demo1 {
public static void main(String args[]){
int a = 1; //原始类型
int b = 2; //原始类型
Point pOne = new Point(5,5); //引用类型
Point pTwo = new Point(6,6); //引用类型
System.out.println("Before : a =" + a);
System.out.println("Before : b =" + b);
System.out.println("Before : pOne =" + pOne.toString());
System.out.println("Before : pTwo =" + pTwo.toString());
a = b; //将b赋值给a
a++; //a自增
pOne = pTwo; //将pTwo 赋值给pOne
pOne.setX(10); //重置pOne中的值
pOne.setY(10);
System.out.println("After : a =" + a);
System.out.println("After : b =" + b);
System.out.println("After : pOne =" + pOne.toString());
System.out.println("After : pTwo =" + pTwo.toString());
}
}
注:省略了Point类的相关代码,其很简单,就两个int变量,和其对应的set\get方法,以及构造函数等。
首先看看输出结果,如下:
Before : a =1
Before : b =2
Before : pOne =Point [x=5, y=5]
Before : pTwo =Point [x=6, y=6]
After : a =3
After : b =2
After : pOne =Point [x=10, y=10]
After : pTwo =Point [x=10, y=10]
从结果中看出,重新赋值后,a和b的值输出结果,在意料之中;而程序中真的pOne和pTwo,仅改变了pOne的值,为什么输出结果中pTwo也改变了,并且跟pOne一致呢?
这就是由于原始类型和引用类型的存储结构不一致导致的,其实,针对“=”本身,对这两种数据类型是没有本质区别的,都是"="左右的值等于右边的值,但不同的是,针对引用类型,赋值符“=”改变的是对象引用,而不是对象本身,也就是说当程序执行完下面这句之后,
<strong>pOne = pTwo;</strong>
pOne和pTwo,均指向了同一个对象,因此对pOne的任何操作,同时也会影响到pTwo。