内容纲要

  1. 类型转换
    1.1 隐式转换(自动类型提升)
    1.2 强制类型转换
    1.3 类型转换案例分析
  2. 键盘录入
  3. 标识符
  4. 小结

类型转换

在 Java 中,不同数据类型的变量进行运算或赋值时,经常涉及 类型转换。转换分为两类:

  • 隐式转换:自动发生,小范围类型 → 大范围类型
  • 强制转换:手动干预,大范围类型 → 小范围类型

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

概念: 将取值范围小的数据类型赋值给取值范围大的数据类型,可以直接赋值,系统会自动完成类型提升

基本规则:“小的给大的,可以直接给”

int a = 10;
double b = a;   // int → double,自动提升 
System.out.println(b);  // 输出 10.0 

这里 int(4 字节)赋值给 double(8 字节)时,10 被自动提升为 10.0,整个过程对开发者透明,称为 隐式转换

数据类型从小到大级别(内存占用与表示范围):

byte → short / char → int → long → float → double 

注意:float 虽只占 4 字节,但能表示的数据范围比 long(8 字节)更大,因为浮点数采用科学记数法存储,牺牲精度换取范围

运算细节:当一个小的数据类型与大的数据类型一起运算时,小的会先提升为大的类型,然后进行运算

int a = 10;
double b = 12.3;
double c = a + b;  // a 提升为 10.0,运算后结果 22.3 

特殊规则:byte、short、char 这三种类型在参与运算时,无论是否存在更高类型,都会先提升为 int,然后再计算

byte a = 10;
byte b = 20;
int c = a + b;   // 正确,结果为 int 
// byte c = a + b; // 编译错误,a+b 结果为 int,不能直接赋值给 byte 

直接提升

byte/short/char

int

long

float

double

2 )强制类型转换

概念:将取值范围大的数据或变量赋值给取值范围小的类型时,不能直接赋值,必须使用 强制转换语法

格式:目标类型 变量名 = (目标类型) 值/变量;

int a = 10;
byte b = (byte) a;   // 强制转换:int → byte 

精度损失问题:当大类型数据超出小类型范围,或浮点数转整数时,会发生精度丢失(直接截断,不是四舍五入)

double num1 = 12.9;
int num2 = (int) num1;   // 结果为 12,小数点后全部丢失 

比喻:将 8 升桶里的水倒入 4 升桶,如果超过容量就会洒出——精度损失

建议:在程序中尽量减少强制转换的使用,避免不可预期的数据损失

3 )类型转换案例分析

请判断以下代码是否存在问题,如有请指出并修正

byte a = 3;
byte b = 4;
byte c = a + b;
byte d = 3 + 4;

错误定位:第三行 byte c = a + b; 会出现编译错误

错误原因 :a 和 b 均为 byte 类型,根据特殊规则,运算时会先各自提升为 int,然后执行 int + int,结果也是 int。把 int 赋值给 byte(大 → 小),属于非法操作,需要强制转换。

修正方案 :先将 a + b 整体用括号提升优先级,再对运算结果进行强转:

byte c = (byte) (a + b);  // 正确 

为什么不报错:byte d = 3 + 4;

  • Java 存在 常量优化机制。编译时,3 + 4 会被立即计算为 7,然后判断 7 是否在 byte 范围内(-128~127):
  • 在范围内 → 编译通过,直接赋值。
  • 超出范围 → 编译失败。
byte d = 300 + 4;  // 编译错误,304 超出 byte 范围 

同理,long num = 1234567890; 不加 L 可能会报错,因为整数常量默认是 int;如果数值超出 int 范围,必须加 L 后缀:

long big = 12345678901L;  // 必须加 L 

键盘录入

为什么需要键盘录入?

  • 之前我们赋值的变量都是直接在代码中写死的,例如 int a = 10;
  • 若想让数据由用户在运行时输入,就需要使用 Scanner 实现键盘录入,使程序更灵活

实现步骤(固定模式,初学者可先记住):

1 ) 导包:必须在类定义之上

import java.util.Scanner;

2 ) 创建 Scanner 对象

Scanner sc = new Scanner(System.in);

其中 sc 是变量名,可以自定义,其余为固定格式。

3 ) 接收数据

int a = sc.nextInt();  // 接收整数 

变量名 a 可自定义。

4 )完整示例:

import java.util.Scanner;
 
public class Demo1Scanner {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个整数:");
        int a = sc.nextInt();
        System.out.println("你输入的是:" + a);
    }
}

当程序运行到 sc.nextInt() 时,会暂停并等待用户在控制台输入数据,按下回车后,输入值被赋值给变量 a,后续可自由使用。

程序 控制台 用户 程序 控制台 用户 输出提示“请输入一个整数:” 显示提示,等待输入 输入 20 并回车 传递 "20" int a = 20 输出 “你输入的是:20”

标识符

1 ) 什么是标识符?

标识符就是程序员在编写代码时给 类、方法、变量 等自定义的名字。

2 )组成规则

合法的标识符只能由以下字符组成:

  • 数字 0~9
  • 字母 A~Za~z
  • 下划线 _ 和美元符号 $

3 ) 注意事项

  • 不能以数字开头(如 2b ❌)
  • 不能是 Java 关键字(如 class、public 等小写关键字 ❌)
  • 严格区分大小写(Class ✅,因首字母大写,不是关键字)

4 ) 常见命名约定(Java 江湖规矩)

命名法 规则 应用场景 示例
小驼峰 单单词:全小写;多单词:第一个单词首字母小写,其余单词首字母大写 变量、方法 name, firstName
大驼峰 每个单词首字母都大写 Student, GoodStudent

遵守命名约定可大幅提高代码可读性,避免写出 aaaaaaabbbbbbbb 这种令人迷惑的名字

小结

  • 隐式转换:小类型自动提升为大类型,注意 byte/short/char 参与运算时必先提升为 int
  • 强制转换:大类型→小类型需 (目标类型) 强转,可能发生精度损失
  • 常量优化:编译时将对常量表达式求值并检查范围,合理利用可简化代码
  • 键盘录入:通过 Scanner + nextInt() 实现用户交互,让变量值动态化
  • 标识符:自定义名称必须遵守规则,并遵循驼峰命名约定,提升代码质量
Logo

CANN开发者社区旨在汇聚广大开发者,围绕CANN架构重构、算子开发、部署应用优化等核心方向,展开深度交流与思想碰撞,携手共同促进CANN开放生态突破!

更多推荐