Java 中的数据类型


2021年8月23日, Learn eTutorial
2411

本教程旨在帮助初学者和中级程序员掌握 Java 编程语言中数据类型的概念和分类。除此之外,您还将探索与数据类型相关的一个重要过程——Java 类型强制转换或数据类型转换。

JAVA 数据类型

在任何编程语言中,数据类型都指定了程序员所需的数据的行为。数据类型告诉编译器要存储在变量或标识符中以执行特定操作的数据的类型或大小。因此,从某种意义上说,为变量定义数据类型限制了变量取任何值的自由度。

由于 Java 是一种静态类型编程语言,因此在使用前用适当的数据类型声明变量的重要性非常显著。让我们举个例子


int age; 
 

这里 age 是一个 int 数据类型的变量,这表示变量 age 应该只持有整数值。

现在让我们来探索 Java 数据类型的不同种类。

Java 数据类型的分类

在 Java 中,数据类型大致分为两类

  1. 原始数据类型:这些是 Java 中预定义的数据类型。Java 有 8 种基本数据类型,即 boolean、char、byte、short、int、long、float 和 double。
  2. 非原始数据类型:这些是由程序员创建的数据类型,并非预定义。由于它们引用对象,它们也被称为引用数据类型或对象数据类型。这包括 String、Arrays、Classes、Interfaces 等。
Java Data Types

原始数据类型

从上图中,我们已经看到了 Java 中的 8 种原始数据类型。这些数据类型是内置的,不能再被分割。因此被称为原始数据类型。让我们来详细探讨每一种数据类型。

整型数据类型

在数学上,整数是不包含任何小数部分的数。整数可以是正数、负数甚至 0,它们共同构成了整数。例如,-20099 等是整数,而 8.5¾ 等则不是。

byteshortintlong 这样的数据类型都属于整型数据类型。

  1. byte 是 8 位有符号二进制补码整数数据类型,其值范围在 -128 到 127 之间。默认情况下,Java 将 byte 值视为 0。这种数据类型用于需要大量节省内存的情况下。
  2. short 是 16 位有符号二进制补码整数数据类型,其值范围在 -32,768 到 32,767 之间,默认值为 0。
  3. int 是 32 位有符号二进制补码整数数据类型,其值范围在 -2³¹ 到 2³¹-1 之间。其默认值为 0。
  4. long 是 64 位有符号二进制补码整数数据类型,其值范围在 -2⁶³ 到 2⁶³ -1 之间。long 数据类型的默认值为 0。当 int 不足以容纳值时,使用 long 数据类型。为了区分 long 变量和 int 变量,long 变量的值应以字母 'L' 结尾。例如,1000000000L。

检查下面的例子,以理解整型数据类型在程序中是如何工作的。

示例:说明整型值


public class DatatypeEx {

    public static void main(String[] args) {

        byte bnum = 126;
        System.out.println(bnum); // prints 126

        short snum = -32768;
        System.out.println(snum); // prints -32768

        int inum = 999999999;
        System.out.println(inum); //prints 999999999

        long lnum = 9999999990 L;
        System.out.println(lnum); //prints 9999999990


    }

}
 

浮点数据类型

浮点数是那些带有小数部分的数,如 3.14、6/7 等。在 Java 中,我们有两种接受带小数点的数字的原始数据类型。它们是

  1. float:是单精度 32 位浮点数。其默认值为 0.0 或 0.0f。
  2. double:是双精度 64 位浮点数。其默认值为 0.0 或 0.0d。
数据类型 数据大小(位) 数据大小(字节) 默认值
float 32 位 4 字节 0.0f
double 64 位 8 字节 0.0d

示例:说明浮点值


public class DatatypeEx {

    public static void main(String[] args) {

        float num1 = 9.9 f;
        System.out.println(num1); // prints 9.9

        double num2 = -3.14;
        System.out.println(num2); // prints -3.14

        float num3 = 9.999990000000000009990;
        System.out.println(num3); //prints error message      

    }

}
 

字符数据类型

字符数据类型处理字符。与其他编程语言不同,Java 使用 Unicode 系统,因此 char 数据类型表示一个 16 位的 Unicode 字符。char 类型的默认值是 ‘\u0000’,这是 Unicode 系统的最小值。char 类型可以取到的最大值是 ‘\uffff’。

数据类型 数据大小(位) 数据大小(字节) 默认值
char 16 位 2 字节 'u0000'

如果您有兴趣了解更多关于 Java 为何使用 Unicode 系统的信息,请访问 Java 的 Unicode 系统。

示例:说明 char 值


public class DatatypeEx {

 public static void main(String[] args) {
  
     char ch1 = '\u0045';
     System.out.println(ch1); // prints E
     
     char ch2 = '\u0065';
     System.out.println(ch2); // prints e
           
 }

}
 

布尔数据类型

布尔是一种特殊的数据类型,它持有两种可能值中的一种,即 TrueFalse。这种数据类型通常在评估条件、比较或逻辑或关系运算时使用。

数据类型 数据大小(位) 数据大小(字节) 默认值
boolean 1 位   false

示例:说明布尔数据类型


public class DatatypeEx {

 public static void main(String[] args) {
  
      boolean b1=(6>9)?True:False;
  System.out.println("Is 6 greater than 9: "+b); // prints False

         boolean b2=(9>3)?True:False;
  System.out.println("Is 9 greater than 3: "+b); // prints True
  
 }

}

 

非原始数据类型

如前所述,非原始数据类型不是基本数据类型,它们是根据程序需求从原始数据类型派生出来的数据类型。换句话说,我们可以说非原始数据类型是用户创建的数据类型。由于非原始数据类型不是由 Java 定义的,因此数据类型的大小不固定,可以是任何长度。与原始数据类型不同,非原始数据类型以大写字母开头。例如,StringArrayClass 等。区分原始数据类型和所谓的引用数据类型的另一个特点是,非原始数据类型可以持有 null 值。

在接下来的教程中,您将学习这些非原始数据类型,如 String、Arrays、Class、Interface 等。

Java 中的类型转换/强制转换

像许多其他编程语言一样,Java 也支持数据类型转换。顾名思义,我们通常可以将类型转换或类型强制转换表述为将一种数据类型转换为另一种数据类型的过程。例如,我们可以将整数数据类型转换为浮点数,反之亦然。转换可以由程序员手动完成,也可以由编译器自动完成。

根据转换策略,在 Java 中,我们有 13 种类型转换。在这 13 种类型中,我们将在这里讨论两种重要的类型转换,即

  1. 拓宽类型转换
  2. 缩窄类型转换
Java Data Types - Type Casting

如果您有兴趣了解更多关于类型转换的信息,请访问 Java 中不同种类的类型转换

拓宽类型转换

拓宽类型转换是自动将较低数据类型(int)转换为较高数据类型(double)的过程。由于这种转换是由编译器自动完成的,因此也称为自动转换隐式转换

Java Data Types - Type Casting

public class DatatypeConv {

 public static void main(String[] args) {
  
      // creating integer type variable 
  int inum = 36;
  System.out.println("Integer Value :"+ inum);
  
  //converting integer to float type variable
  float fnum = inum;
  System.out.println("Float Value :"+fnum);
  
 }

}
 

输出

Integer Value :36
Float Value :36.0

解释:

上面的代码片段显示了将整数转换为浮点数。由于 floatint 的更高数据类型,因此在转换时不需要特定的数据类型声明。编译器会自动将值转换为更高的数据类型,在我们的例子中是 float

由此我们可以推断,当数据类型彼此兼容且目标数据类型的大小大于源数据类型时,就会发生拓宽类型转换。拓宽类型转换确保数据没有任何损失。

缩窄类型转换

缩窄类型转换是将较高数据类型(double)转换为较低数据类型(int)的过程。由于这种转换是由程序员手动完成的,因此也称为显式转换或强制转换

Java Data Types - Type Casting

public class DatatypeConv {

 public static void main(String[] args) {
  
      // creating float type variable 
  float fnum = 14.7f;
  System.out.println("Float value :" +fnum);
  
  //Converting float value to int value
  int inum = (int)fnum;
  System.out.println("Integer value :" +inum);

  
 }

}

 

输出

Float value :14.7
Integer value :14

解释:

这里我们将一个较高数据类型的值转换为一个较低数据类型的值,这意味着缩窄一个数据类型。因此,我们需要明确指定需要转换到的数据类型,在我们的例子中是 int

缩窄类型转换与拓宽类型转换正好相反。由于目标数据的大小小于源数据,数据丢失的可能性非常高。因此,必须手动进行类型转换,否则编译器会报告编译时错误。