掘金 后端 ( ) • 2024-04-05 11:18

数据类型

Java是强类型语言,对于每一种数据都给出了明确的类型。不同的数据类型分配了不同的内存空间,所存储的数据大小也是不一样的。

Java中的数据类型可以分为两大类:基本数据类型引用数据类型,如下图:

image.png

基本数据类型

直接存储数据值,它们是直接存储在栈(Stack)上的。

  • 整型(整数默认用 int 类型):
    • byte:8位有符号整数,范围从-128到127。
    • short:16位有符号整数,范围从-32,768到32,767。
    • int:32位有符号整数,范围从-2,147,483,648到2,147,483,647。
    • long:64位有符号整数,范围从-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
  • 浮点型(小数默认用 double 类型):
    • float:32位单精度浮点数。
    • double:64位双精度浮点数,是Java中默认的浮点类型。
  • 字符型
    • char:16位Unicode字符。
  • 布尔型
    • boolean:表示逻辑值,只有两个值truefalse

引用数据类型

存储对象的引用,即指向堆(Heap)上对象的内存地址,对象本身存储在堆上。

  • 类:类是创建对象的模板,对象是类的实例。
  • 接口:接口是一组方法的声明,它可以被类实现。
  • 数组:数组是一种容器,可以存储固定大小的同类型元素集合。
  • 字符串:String是一个不可变的序列化的字符,它是final类,意味着一旦创建,它的内容不能被改变。

特殊类型

  • 空类型
    • void:表示没有返回值的方法或函数类型。它不是基本数据类型,也不是引用数据类型,而是一种特殊的类型,用于指示方法不返回任何值。

数据类型的特点

  • 类型转换:在Java中,可以在不同数据类型之间进行转换,包括隐式类型转换(自动)和显式类型转换(强制)。
  • 类型安全:Java是一种类型安全的编程语言,意味着在编译时会检查数据类型的正确性,防止类型不匹配的错误。

变量

变量是用来存储数据的容器。变量可以存储不同类型的数据,这取决于它们的数据类型。

变量的声明和初始化

变量的声明是告诉编译器变量的名称及类型,而初始化则是给变量赋予一个初始值。在Java中,变量可以在声明时初始化,也可以在声明后再进行初始化。

声明基本类型变量

int number; // 声明一个整型变量
double price; // 声明一个浮点型变量
char letter; // 声明一个字符型变量
boolean isTrue; // 声明一个布尔型变量

初始化并声明基本类型变量

int number = 10; // 初始化一个整型变量为10
long money = 100000000L; // 初始化long类型时,末尾建议添加 L或 l
double price = 3.14; // 初始化一个浮点型变量为3.14
float pei = 3.1415962F; // 初始化float类型时,末尾建议添加 F或f
char letter = 'A'; // 初始化一个字符型变量为'A'
boolean isTrue = true; // 初始化一个布尔型变量为true

声明引用类型变量

String str; // 声明一个字符串引用变量
Object obj; // 声明一个通用对象引用变量

初始化并声明引用类型变量

String str = "Hello, World!"; // 初始化一个字符串引用变量
Object obj = new Object(); // 初始化一个对象引用变量

变量的作用域

变量的作用域定义了程序中可以访问该变量的区域。

  • 局部变量通常在方法或代码块中声明,它们的作用域限定在声明它们的区域内。
  • 全局变量(类变量)通常在类中声明,它们的作用域是整个程序。

变量的生命周期

变量的生命周期是指从变量创建到变量销毁的整个过程。

  • 局部变量的生命周期从声明开始,到所在代码块执行结束时销毁。
  • 全局变量的生命周期从类加载开始,到程序结束或类被卸载时销毁。

变量的命名规则

  • 变量名可以包含字母、数字、下划线,但不能以数字开头。
  • 变量名是区分大小写的,例如 variableVariable 是两个不同的变量。
  • 应避免使用Java中的关键字和保留字作为变量名。

数据类型转换

数据类型转换在Java中是一个重要的概念,它允许将一个数据类型的值转换为另一个数据类型的值。类型转换分为两种:隐式类型转换(自动类型转换)和显式类型转换(强制类型转换)。

隐式类型转换

隐式类型转换是指在表达式中,数据类型的较小范围(数值范围较小)自动转换为较大范围的数据类型。这种转换是自动进行的,不需要程序员手动干预。以下是数据从小到大的排序:

image.png 隐式类型转换-代码示例

int intNum = 99;
double doubleNum = 3.14159;
// 将整型变量赋值给浮点型变量,这里发生了隐式类型转换
// 因为整型(较小范围)被自动转换为浮点型(较大范围)
doubleNum = intNum;
System.out.println("doubleNum = " + doubleNum);

显式类型转换

显式类型转换,又称为强制类型转换。是在Java中手动将一个数据类型转换为另一个数据类型的操作。强制类型转换通常用于将较大范围的数据类型转换为较小范围的数据类型,这可能会导致精度丢失或溢出。

强制类型转换的语法

(目标类型) 表达式;

注意事项

  • 将浮点类型转换为整型时,小数部分会被丢弃。
  • 转换必须在类型兼容的范围内进行,否则会抛出ClassCastException
  • 将对象转换为不相关类类型的对象会导致ClassCastException
  • 强制类型转换可能会导致数据丢失,特别是在从大范围类型转换到小范围类型时。

显式类型转换-代码示例

// 将浮点数转换为整数,小数部分被丢弃
double numDouble = 88.08;
int numInt = (int) numDouble;
System.out.println("numInt = " + numInt);

// 将整数转换为浮点数,可能会导致精度丢失
int numInt2 = 100;
float numFloat = (float) numInt2;
System.out.println("numFloat = " + numFloat);

// 将字符串转换为整数
String intString = "56789";
int numInt3 = Integer.parseInt(intString);
// 使用Integer.parseInt()方法 , 将字符串转换为int类型
System.out.println("numInt3 = " + numInt3);

// 将字符串转换为浮点数
String doubleString = "56.78";
// 使用Double.parseDouble()方法 , 将字符串转换为double类型
double numDouble2 = Double.parseDouble(doubleString);
System.out.println("numDouble2 = " + numDouble2);