Java必备基础知识:变量和数据类型

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

文章目录

在Java编程中,变量和数据类型是最基础、最核心的概念之一。理解变量的定义、数据类型的特点以及它们之间的转换规则,是编写高效、健壮代码的前提。本文系统介绍Java变量的三要素(名称、类型、值)、8种基本数据类型及其存储范围,深入讲解自动类型转换与强制类型转换的区别,并详细解析基本数据类型与String的相互转换方法,帮助初学者扎实掌握Java数据类型的使用,为后续面向对象编程和复杂算法打下基础。


一、什么是变量?

变量是Java程序中最基本的存储单元,它是用来存储数据值的容器。在程序运行过程中,变量的值可以改变,因此被称为"变量"。

可以把变量想象成一个贴有标签的盒子:

  • 盒子:内存中的存储空间

  • 标签:变量名

  • 盒子里装的东西:变量的值

变量的三要素

每个Java变量都有三个基本属性:

  1. 变量名 - 标识变量的名称

  2. 数据类型 - 决定变量可以存储什么类型的数据

  3. 变量值 - 变量中存储的具体数据

变量的声明与初始化

变量声明语法

数据类型 变量名

例如:

int age;        // 声明一个整型变量age
double price;   // 声明一个双精度浮点型变量price
String name;    // 声明一个字符串变量name

变量初始化

变量声明后可以立即赋值,也可以在后面赋值,但一定是先赋值后使用!

// 声明时直接初始化
int count = 10;

// 先声明后赋值
int score;
score = 100;

变量的命名规则

  1. 必须以字母、下划线(_)或美元符号($)开头

  2. 后面可以跟字母、数字、下划线或美元符号

  3. 不能使用关键字(比如 int)作为变量名

  4. 区分大小写

  5. 建议使用有意义的名称(推荐使用驼峰命名法)

 例如:

//好的变量名能体现出其代表的含义
int studentAge;
double accountBalance;
String firstName;

//以下是不太恰当的变量名
int a;          // 无意义
double 123abc;   // 以数字开头
String class;    // 使用关键字

变量的作用域

变量的作用域指的是变量在程序中可以被访问的范围,变量在同一个作用域内不能重名:

  1. 类变量(静态变量) - 使用static声明,属于类,所有实例共享

  2. 实例变量 - 在类中声明,但在方法、构造方法或块之外

  3. 局部变量 - 在方法、构造方法或块中声明

public class VariableExample {
    // 类变量
    static int classVar = 10;
    
    // 实例变量
    String instanceVar = "Hello";
    
    public void method() {
        // 局部变量
        int localVar = 20;
        System.out.println(localVar);
    }
}

常量

在Java中,使用final关键字声明常量:

final double PI = 3.14159;
final int MAX_USERS = 100;

常量命名通常全部大写,单词间用下划线分隔。

类型转换

Java中有时需要进行类型转换:

  1. 自动类型转换(隐式转换):小类型转大类型

    int i = 100;
    long l = i;  // 自动转换为long类型
  2. 强制类型转换(显式转换):大类型转小类型

    double d = 100.04;
    int i = (int)d;  // 强制转换为int,值为100

二、数据类型

Java的8种基本数据类型

数据类型大小默认值取值范围示例
byte1字节0-128 ~ 127byte b = 100;
short2字节0-32,768 ~ 32,767short s = 1000;
int4字节0-2³¹ ~ 2³¹-1int i = 100000;
long8字节0L-2⁶³ ~ 2⁶³-1long l = 100000L;
float4字节0.0f约±3.4e38float f = 3.14f;
double8字节0.0d约±1.7e308double d = 3.1415926;
char2字节'\u0000'0 ~ 65,535char c = 'A';
boolean1位falsetrue/falseboolean flag = true;

这里补充程序中 + 号的使用:

  1. 当左右两边都是数值时,则做加法运算
  2. 当左右两边有一方为字符串时,则做字符串拼接运算
  3. 当表达式中有多个+运算时,程序会从左到右计算,根据当前的操作数类型决定是加法还是拼接
    System.out.println(10 + 20 + "30");  // 输出"3030"
    // 解释:先计算10+20=30(数值加法),然后30+"30"→"3030"(字符串拼接)
    
    System.out.println("10" + 20 + 30);  // 输出"102030"
    // 解释:先"10"+20→"1020"(字符串拼接),然后"1020"+30→"102030"

 例如:

public class PlusOperatorDemo {
    public static void main(String[] args) {
        int apples = 5;
        int oranges = 3;
        double price = 2.99;
        
        // 数值加法
        int totalFruits = apples + oranges;  // 8
        
        // 字符串拼接
        String cart = "购物车中有" + apples + "个苹果和" + oranges + "个橙子";
        // "购物车中有5个苹果和3个橙子"
        
        // 混合运算
        String receipt = "总价: $" + (apples + oranges) * price;
        // "总价: $23.92" (先计算5+3=8,然后8*2.99=23.92,最后拼接字符串)
        
        System.out.println(cart);
        System.out.println(receipt);
    }
}

注意:

  1. 使用括号可以改变运算顺序

  2. 当需要先进行数值计算再拼接时,应该用括号明确优先级

  3. 字符串拼接会创建新的字符串对象,在循环中大量拼接时应考虑使用StringBuilder

整数数据类型

数据类型大小默认值取值范围示例
byte1字节0-128 ~ 127byte b = 100;
short2字节0-32,768 ~ 32,767short s = 1000;
int4字节0-2³¹ ~ 2³¹-1int i = 100000;
long8字节0L-2⁶³ ~ 2⁶³-1long l = 100000L;

整数类型顾名思义就是用于存放整数的,比如11,58,938等。

int n1 = 18;//四个字节
long n3 = 18;//八个字节

这里的几个变量都被赋值18,但是因为数据类型不同,实则每个变量所被分配到的内存空间大小是不同的。

注意事项:

  • Java的具体数值默认是 int 型,声明 long 型常量须后加‘l’或‘L’。
    int n = 5;//4个字节
    long m = 5L;//8个字节
  •  能用int时不必要用long,除非int不足以表示大数时才用long。

浮点数据类型

数据类型大小默认值取值范围示例
单精度float4字节0.0f约±3.4e38float f = 3.14f;
双精度double8字节0.0d约±1.7e308double d = 3.1415926;

浮点数在机器中的存放形式:浮点数 = 符号位 + 指数位 + 尾数位

浮点数的声明和初始化

// float类型声明
float price = 12.99f;  // 必须加f后缀
float temperature = 98.6F;

// double类型声明
double pi = 3.141592653589793;
double distance = 1.495978707e8;  // 科学计数法表示地球到太阳的距离(1.495978707×10⁸ km)

浮点数的精度问题

由于计算时浮点数的尾数位可能会丢失,所以有了浮点数的精度问题。

System.out.println(0.1 + 0.2);  // 输出0.30000000000000004,而不是0.3

注意事项

1、浮点数不是确切数而是近似数,所以我们要避免直接比较浮点数

// 错误的比较方式
if (a == b) { ... }

// 正确的比较方式(允许微小误差)
final float EPSILON = 0.00001f;
if (Math.abs(a - b) < EPSILON) { ... }

2、 大数与小数相加可能丢失精度:

double big = 1.0e20;
double small = 1.0;
System.out.println(big + small == big);  // 输出true,因为small被忽略了

字符型

char是Java中的基本数据类型,用于存储单个字符,占用2个字节(16位),使用Unicode编码表示字符,范围是\u0000\uffff(即0-65535)。char的本质是一个整数,输出的时候,是unicode码对应的字符。

字符型变量的声明和初始化

// 基本声明方式
char c1 = 'A';  // 使用单引号包裹单个字符
char c2 = '中'; // 可以存储中文字符
char c3 = '\n'; // 转义字符
char c4 = 97;   // 直接使用Unicode值,97对应小写字母'a'

上面提到char的本质是一个整数,笔者曾经有一个困惑的点,这里给到大家一个案例,大家可以思考二者的不同之处和输出:

//案例一
char c = 'A' + 1;  
System.out.println("c = " + c); 

//案例二
char c = 'A';
System.out.println(c + 1);  

 现在我们来顺一下二者的计算过程:

  • 案例一:首先计算 c 的值时,会先将 'A' 提升为 int 类型(65),然后执行加法运算得到66,最后将结果 int 类型的66隐式转换回 char 类型(因为左侧是 char 变量),对应字符 'B'。
  • 案例二:算术运算时将 char 类型的值自动提升为 int 类型,println()方法接收到的是一个int类型的值66,所以直接输出数字66

所以案例一输出 'B',案例二输出66。

布尔类型

布尔类型(boolean)是Java中的一种基本数据类型,用于表示逻辑值,只有两个可能的取值:

  • true - 表示"真"

  • false - 表示"假"

特点

  1. 大小:Java规范没有明确规定boolean类型的大小,不同JVM实现可能不同

  2. 默认值:成员变量的默认值是false,局部变量必须显式初始化

  3. 取值范围:只能是truefalse,不能用0或1代替

使用示例:

boolean isSunny = true;
if (isSunny) {
    System.out.println("今天天气晴朗");
} else {
    System.out.println("今天不是晴天");
}

类型转换

Java中的基本数据类型转换分为两种主要类型:自动类型转换(隐式转换)强制类型转换(显式转换)。以下是详细的转换规则和示例说明。

一、自动类型转换(隐式转换)

1. 数值类型的自动转换规则

当满足以下条件时,Java会自动进行类型转换:

  • 转换方向是从小类型到大类型

  • 转换不会导致数据丢失精度

类型从小到大顺序
byte → short/char → int → long → float → double

byte b = 10;
short s = b;    // byte → short
int i = s;      // short → int
long l = i;     // int → long
float f = l;    // long → float
double d = f;   // float → double

2. char的特殊转换规则

char可以自动转换为intlongfloatdouble,但不能自动转换为byteshort

3. 表达式中的自动提升

在表达式中,所有操作数会自动提升为较大的类型,然后再进行计算:

byte b = 10;
short s = 20;
int result = b + s;  // byte和short都提升为int

二、强制类型转换(显式转换)

当需要从大类型转换为小类型时,必须使用强制类型转换,语法是在值前加上(目标类型)

1. 数值类型的强制转换

double d = 3.14;
int i = (int)d;     // 强制转换为int,值为3(截断小数部分)

long l = 300L;
short s = (short)l; // 强制转换为short

2. 可能的数据丢失

强制转换可能导致数据溢出或精度丢失:

int i = 128;
byte b = (byte)i;   // 结果为-128(溢出)

3. char的特殊强制转换

int i = 65;
char c = (char)i;   // 强制转换为char,值为'A'

基本数据类型和String类型的转换

 1、基本类型转String类型:

        第一种是使用空字符串连接(但不推荐)

int i = 123;
String s = "" + i;  // 得到"123"

        第二种是使用String.valueOf()方法

int i = 123;
String s1 = String.valueOf(i);  // 得到"123"

boolean b = true;
String s3 = String.valueOf(b);  // 得到"true"

        第三种是使用基本数据类型包装类的toString()方法

float f = 12.34f;
String s2 = Float.toString(f);    // 得到"12.34"

  2、String类型转基本类型:

        1. 使用包装类的parseXxx()方法

String s1 = "123";
int i = Integer.parseInt(s1);  // 123

String s3 = "true";
boolean b = Boolean.parseBoolean(s3);  // true

这里有一个Boolean的特殊处理,即Boolean.parseBoolean()不区分大小写,但只有"true"返回true,其他任何字符串都返回false。

        2. 使用包装类的valueOf()方法(返回包装类对象,可自动拆箱)

String s1 = "123";
int i = Integer.valueOf(s1);  // 123 (自动拆箱)

看到这里或许有小伙伴会疑惑什么是“包装类”、“装箱”和“拆箱”,这个问题会在专栏后续中讲解,这里只做一个简单的解释以便理解。

包装类是 Java 为每种基本数据类型提供的对应的对象表示形式,它们将基本类型"包装"成对象,存放在java.lang包中。包装类使得基本类型有对象的特性,比如调用方法、进行类型转换等。下面是基本类型和包装类的对照表:

基本类型包装类示例
byteByteByte.valueOf("1")
shortShortShort.parseShort("2")
intIntegerInteger.parseInt("3")
longLongLong.valueOf("4L")
floatFloatFloat.parseFloat("5.5")
doubleDoubleDouble.valueOf("6.6")
charCharacterCharacter.toUpperCase('a')
booleanBooleanBoolean.TRUE

我们再来简单理解一下装箱和拆箱,做一个通俗比喻,想象你有一个普通的玩具(基本类型),现在你想把它放进一个精美的包装盒里(包装类),这就是装箱。反过来,从盒子里拿出玩具,就是拆箱。而我们这样做的目的主要有两个:1是集合需要,比如ArrayList只能存"盒子"(对象),不能直接存"玩具"(基本类型),2是可以有null值(我们知道基本类型是不能为null的,但是盒子可以是空的)。

我们可以看看下面的例子:

// 装箱(基本类型 → 包装类)
int num = 10;          // 基本类型
Integer boxedNum = num; // 自动装箱

// 拆箱(包装类 → 基本类型)
Integer boxedNum = 20;  // 包装类
int num = boxedNum;     // 自动拆箱

// 集合例子
ArrayList<Integer> list = new ArrayList<>();
list.add(5);  // 自动把数字5装箱成Integer

但是一定要注意如果盒子是空的,拆箱会报错!!并且,用 == 对盒子进行比较时是对盒子比较而不是对盒子里的东西进行比较!

/* 首先我们明确int的存储范围是-128~127,
当直接赋值或使用 Integer.valueOf()
在这个范围内时,Java 不会创建新对象,而是复用缓存的对象。
如果超出这个范围,则创建新的 Integer 对象。
*/
Integer c = 200;  // 200 超出缓存范围,新建一个 Integer 对象
Integer d = 200;  // 又新建一个 Integer 对象
System.out.println(c == d); // false(c 和 d 是不同的对象)

总结

本文介绍了Java变量和数据类型的核心知识,包括变量的声明与初始化、8种基本数据类型的存储范围及使用场景。讲解了类型转换的两种方式——自动类型转换(小类型转大类型)和强制类型转换(大类型转小类型,可能丢失精度),并演示了基本数据类型与String的相互转换方法。这些看似基础的知识,实则是构建复杂程序的基石。就像建筑师要熟悉各种材料的特性一样,程序员也必须深刻理解数据类型的本质。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值