一说到数据类型,我们就会想到int,char,double等,那今天我们就详细总结一下它们的适用范围和使用。本文的思维架构:
变量 |
(1)what?-概念和分类
概念:变量相当于一个有名字的容器,里面装的是各种不同类型的数据。
分类:
(1)根据其引用的数据类型的不同,分为基础类型变量和引用类型的变量。关于两者的区别和内存分析,在本文的后面会提到。
(2)根据变量的作用范围不同,分为成员变量和局部变量。两者的区别是:成员变量是在类范围内定义的变量,作用范围是类内部;局部变量是在一个方法内定义的变量,作用范围是方法内部。
public class book{
//成员变量
public int a=1;
//在此处不能使用b
public void say(){
//局部变量
int b=2;
//在此处能使用a
}
}
(2)why?-为什么要用变量
个人理解,变量就相当于在内存中“占地为王”,画一块区域,就代表了变量a。以后程序要是想对变量a赋值,则把数据放到此区域里。如果想读取变量a的值,就访问此内存区域即可。可见,编程就是对内存中的数据进行访问和修改的过程。
不同的是,各变量所在的内存是不一样的。如果是局部变量,其是在栈上分配内存的。解释一下原因,栈是线程私有的,其里面的方法随着调用结束而消亡,则在方法内定义的局部变量也会随着消亡。
而成员变量是在堆内分配内存的。堆是线程公有的,不会随着某个方法的消亡而消亡。
(3)how?-怎么用
变量的定义语法:
变量类型 变量名 [=初始值]
举例:
int a=0;
此时的int就是变量类型,也就是今天要重点讲的数据类型。数据类型分为基本类型和引用类型两种。
基本类型 |
基本类型分为4类8种,其中有几个重要的,已用红色标出,其内存大小也已列出。
(1)int
如果我们要定义一个整数类型的变量,可以用byte、short、int、long来修饰,不过用的最多的是int。比如 int a=1。
值得注意的是,如果想定义一个long类型的变量,需要在数字后面加上“l”或“L”。就像以下的代码是错误的:
long a=9999999999999
应该写成:
long a=9999999999999L
(2)char
//定义一个字符值
char a='美'
既然提到字符值,那就顺便说一下怎么定义一个字符串:
//定义一个字符串
String b="沧海月明珠有泪,蓝田日暖玉生烟。"
可见,定义字符值需要用单引号,定义字符串需要用双引号。
(3)double
说完整数,我们来说说小数。float和double可用于表示小数,double比float更精确一点,如果还需要更精确,可以使用BigDecimal类。这个类会在后续的常用类中讲到。
//定义double类型的变量
double a=3.14
//为了便于数位数,可以借助于下划线。整数和浮点数均可以这样写
double a=3.141_592_6
(3)boolean
boolean类型就是我们所说的“真假”。“这个颜色是不是红色”,只有真、假两种可能。
//定义a的值为true
boolean a=true;
引用类型 |
引用类型包括类,接口,数组等。之所以叫做引用类型,是因为访问其值时,需要借助“指针”。
(1)引用类型和基本类型的内存分析对比
在上图中,橘色部分为基本类型变量,其余部分为引用类型变量。可以看出,如果想访问基本类型变量的值,直接访问栈中内存即可。如果要访问引用变量的属性值,还需根据地址去堆中寻找。
(2)String
之所以将String拿出来讲,是因为人们易把String当成基本类型,这是错误的。String属于常用类,类是属于引用类型的,所以String属于引用类型。
在本文的前面部分,我们已经说过了String类的定义:
String b=“沧海月明珠有泪,蓝田日暖玉生烟。”
除此之外,如果是想将基本类型变为字符串,直接和“”进行连接运算即可。
String a=5+“”;
类型转换 |
类型转换就是修改变量的数据类型。有自动类型转换和强制类型转换两种。
(1)自动类型转换(小到大)
还以“变量图”为例,如果将小杯子的水倒入到大杯子里,是能盛下的,如果相反,则水会溢出来。同理,如果是将所占内存小的类型转换为所占内存大的类型,则可以自动转换过去。
//将int类型转换为double类型
int a=1;
double b=a;
(2)强制类型转换(大到小)
就像水会溢出来丢失一样,如果进行强制类型转换,数据的精度也有可能丢失。比如将一个double类型的数据转为int类型,则小数部分会丢失。下面的代码b的值为3。
//将一个double类型的转换为int类型
double a=3.14;
int b=(int)a;
包装类型 |
(1)what?
包装类就是将8个基本类型的值包装成对象使用。除了int和char,其余的都是将其首字母大写即可。
基本类型 | 包装类 |
---|---|
int | Integer |
char | Character |
double | Double |
…… | …… |
(2)why?
将基本类型“包装起来”,使它变成了对象,也就有了属性和方法,就可以对其进行更多的操作。
(3)how?
在JDK1.5之后,就可以进行自动拆装箱操作了。所谓自动装箱,就是把一个基本类型变量直接赋值给对应的包装类变量。
//装箱,int变为Integer
Integer a=5;
拆箱则相反:
//拆箱,将Integer变为int类型
int b=a;
小结 |
本文细致讲解了变量的概念,基本类型的使用,基本类型和引用类型的内存分析对比,自动类型转换和强制类型转换,自动拆装箱等。