数据类型分为两大类:基本类型(Primitive Types)和引用类型(Reference Types)。在 Java 中有效地使用这两种类型,可以帮助编写更高效、更清晰、更易于维护的代码。

1、基本类型(Primitive Types)

基本类型直接存储值,因此它们在内存中占用固定大小的空间,并且访问这些值的速度非常快,它们不是对象,因此在使用时不会引用任何对象。字符串在 Java 中是一个引用类型,而不是基本类型。它实际上是一个不可变的字符序列。

数据类型

类型

存储空间大小

取值范围

默认值

布尔型

boolean

由 JVM 实现决定。

在大多数情况下,

占用一个字节的存储空间。

true/false

false

字节型

byte

1个字节

-128——127

0

整型

int

4个字节

-2^31——2^31-1

0

短整型

short

2个字节

-2^15——2^15-1

0

长整型

long

8个字节

-2^63——2^63-1

0

字符型

char

2个字节

\u0000

\u0000

单精度浮点型

float

4个字节

-2^128——2^128

0.0F

双精度浮点型

double

8个字节

-2^1024——2^1024

0.0D

public class Main {
  public static void main(String[] args) {
     // 整数类型
    byte b = 100;
    short s = 1000;
    int i = 100000;
    long l = 10000000000L;
    // 浮点类型
    float f = 234.5f;
    double d = 123.456;
    // 字符类型
    char ch = 'A';
    // 布尔类型
    boolean bool = true;
    // 打印变量值
    System.out.println("byte value: " + b);
    System.out.println("short value: " + s);
    System.out.println("int value: " + i);
    System.out.println("long value: " + l);
    System.out.println("float value: " + f);
    System.out.println("double value: " + d);
    System.out.println("char value: " + ch);
    System.out.println("boolean value: " + bool);
    System.exit(0); //success
  }
}

2、引用类型(Reference Types)

引用类型(Reference Types)是指基于类的实例(对象),它们不直接存储值,而是存储对内存中对象的引用(内存地址)。引用类型包括类(Class)、接口(Interface)、数组(Array)等。

public class Main {
  public static void main(String[] args) {
    Car myCar = new Car(); // 创建 Car 类的对象
    myCar.color = "Red";   // 访问字段
    myCar.drive();         // 调用方法
    System.exit(0); //success
  }
}
// 定义一个类
class Car {
    String color;
    void drive() {
        System.out.println("Driving");
    }
}

3、引用类型和基本类型的区别

基本类型直接存储数据值,而引用类型存储对数据的引用(即内存地址)。引用类型的默认值是 null,而基本类型的默认值取决于具体类型(例如,int 的默认值是 0boolean 的默认值是 false)。对象(引用类型)存储在堆内存中,而基本类型通常存储在栈内存中。

public class Main {
  public static void main(String[] args) {
        // 基本类型示例
        int a = 10;
        int b = a;
        b = 30;

        System.out.println("基本类型:");
        System.out.println("a (int): " + a); // 输出 10
        System.out.println("b (int): " + b); // 输出 30

        // 引用类型示例
        class MyObject {
            int value;
        }

        MyObject obj1 = new MyObject();
        obj1.value = 10;

        MyObject obj2 = obj1;
        obj2.value = 30;

        System.out.println("\n引用类型:");
        System.out.println("obj1.value: " + obj1.value); // 输出 30
        System.out.println("obj2.value: " + obj2.value); // 输出 30
  }
}

4、基本类型的类型转换

基本类型的类型转换分为两种:自动类型转换(隐式转换)和强制类型转换(显式转换)。

1)自动类型转换(隐式转换)

自动类型转换是由编译器自动完成的,通常发生在将一种较小的数据类型赋值给较大的数据类型时。在 Java 中,数据类型的大小从小到大依次是:byte < short < int < long < float < double

public class Main {
  public static void main(String[] args) {
      // 自动类型转换示例
      int i1 = 100;
      long l1 = i1;  // 自动类型转换从 int 到 long
      float f1 = l1; // 自动类型转换从 long 到 float
      System.out.println("自动类型转换:");
      System.out.println("int to long: " + l1);
      System.out.println("long to float: " + f1);
       
  }
}

2)强制类型转换(显式转换)

强制类型转换需要明确指示编译器进行转换,通常用于将较大的数据类型转换为较小的数据类型。这可能导致数据精度的损失或溢出。

public class Main {
  public static void main(String[] args) {       
      // 强制类型转换示例
      double d = 100.04;
      long l2 = (long) d;  // 强制类型转换从 double 到 long
      int i2 = (int) l2;   // 强制类型转换从 long 到 int
      System.out.println("强制类型转换:");
      System.out.println("double to long: " + l2);
      System.out.println("long to int: " + i2);
  }
}

推荐文档