一说到数据类型,我们就会想到int,char,double等,那今天我们就详细总结一下它们的适用范围和使用。本文的思维架构:

Java中的数据域是指什么_引用类型

变量

(1)what?-概念和分类

概念:变量相当于一个有名字的容器,里面装的是各种不同类型的数据。

Java中的数据域是指什么_Java中的数据域是指什么_02


分类:

(1)根据其引用的数据类型的不同,分为基础类型变量和引用类型的变量。关于两者的区别和内存分析,在本文的后面会提到。

(2)根据变量的作用范围不同,分为成员变量和局部变量。两者的区别是:成员变量是在类范围内定义的变量,作用范围是类内部;局部变量是在一个方法内定义的变量,作用范围是方法内部。

public class book{
    //成员变量
   public int a=1;
    //在此处不能使用b
    
   public void say(){
      //局部变量
     int b=2;
      //在此处能使用a
   }
}

(2)why?-为什么要用变量

个人理解,变量就相当于在内存中“占地为王”,画一块区域,就代表了变量a。以后程序要是想对变量a赋值,则把数据放到此区域里。如果想读取变量a的值,就访问此内存区域即可。可见,编程就是对内存中的数据进行访问和修改的过程。

不同的是,各变量所在的内存是不一样的。如果是局部变量,其是在栈上分配内存的。解释一下原因,栈是线程私有的,其里面的方法随着调用结束而消亡,则在方法内定义的局部变量也会随着消亡。

而成员变量是在堆内分配内存的。堆是线程公有的,不会随着某个方法的消亡而消亡。

Java中的数据域是指什么_类型转换_03

(3)how?-怎么用

变量的定义语法:

变量类型 变量名 [=初始值]

举例:

int a=0;

此时的int就是变量类型,也就是今天要重点讲的数据类型。数据类型分为基本类型和引用类型两种。

基本类型

基本类型分为4类8种,其中有几个重要的,已用红色标出,其内存大小也已列出。

Java中的数据域是指什么_基本类型_04

(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)引用类型和基本类型的内存分析对比

Java中的数据域是指什么_类型转换_05


在上图中,橘色部分为基本类型变量,其余部分为引用类型变量。可以看出,如果想访问基本类型变量的值,直接访问栈中内存即可。如果要访问引用变量的属性值,还需根据地址去堆中寻找。

(2)String

之所以将String拿出来讲,是因为人们易把String当成基本类型,这是错误的。String属于常用类,类是属于引用类型的,所以String属于引用类型。
在本文的前面部分,我们已经说过了String类的定义:

String b=“沧海月明珠有泪,蓝田日暖玉生烟。”

除此之外,如果是想将基本类型变为字符串,直接和“”进行连接运算即可。

String a=5+“”;

类型转换

类型转换就是修改变量的数据类型。有自动类型转换和强制类型转换两种。

(1)自动类型转换(小到大)

Java中的数据域是指什么_类型转换_06


还以“变量图”为例,如果将小杯子的水倒入到大杯子里,是能盛下的,如果相反,则水会溢出来。同理,如果是将所占内存小的类型转换为所占内存大的类型,则可以自动转换过去。

//将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;

小结

本文细致讲解了变量的概念,基本类型的使用,基本类型和引用类型的内存分析对比,自动类型转换和强制类型转换,自动拆装箱等。