Java 入门基础:关键字、数据类型与类型转换

发布时间:2026/11/5 3:37:46

Java 入门基础:关键字、数据类型与类型转换 以 JDK 8 为基准将关键字与标识符、数据类型体系、类型转换、String、运算符、控制台输入与随机数分层组织。示例均经编译验证标注「完整示例」的代码可直接运行资料核对日期2026-11-04。先修能读写简单的 C 程序理解变量、分支与循环即可。本文不涉及面向对象、集合与异常处理这些内容属于后续篇章。目录一、适用范围语法相近运行模型不同二、关键字与标识符三、数据类型体系四、类型转换五、String 类型六、运算符七、控制台输入八、随机数九、练习与要点回顾示例约定。标注「完整示例」的代码块可保存为同名.java文件直接编译运行类名与文件名需一致标注「片段」的代码需放入方法体或类体不能单独作为源文件。全部示例在 JDK 8 下编译通过JDK 11 及以上的写法会单独注明。一、适用范围语法相近运行模型不同从 C 迁移到 Java语法层面的跨度不大分支、循环、算术与比较运算符的形式基本一致。真正的差异在运行模型以及由运行模型派生出的类型规则。初学阶段最容易产生落差的两处恰好都在「写法」而非「概念」上其一是入口方法与输出语句的冗长一个System.out.println的长度超过printf数倍且System、out的大小写均不可变动其二是public、class、static等修饰成分在入门阶段尚未有对应的语义支撑只能先作为固定形式记忆待面向对象部分再回头解释。这两点不构成理解障碍但会直接影响编码速度。维度CJava执行方式编译为目标机器指令直接执行编译为字节码由 JVM 解释或即时编译执行内存释放手动申请与释放由垃圾回收器管理语言层面无法主动释放指针支持指针运算与任意地址访问无指针以引用替代禁止地址运算跨平台方式源码级可移植需按平台重新编译字节码跨平台依赖对应平台的 JVM程序入口int main(int argc, char** argv)public static void main(String[] args)输出printf 格式符System.out.println按变量实际类型输出两处最容易被低估的限制入口方法的形式固定。public、static、void与String[]四个要素缺一不可static的作用是让 JVM 无需创建对象即可调用String[] args用于接收命令行参数。大小写敏感。System与system是两个完全不同的标识符System.out中的out必须小写。// 完整示例Hello.java public class Hello { public static void main(String[] args) { int n 10; System.out.println(n); // 不需要格式符println 会按 int 类型输出 } }println的重载方法覆盖了全部基本类型与String/Object因此无需显式声明输出格式这一便利的代价是输出格式的精细控制不如printf后者在 Java 中同样可用。二、关键字与标识符2.1 关键字的界定关键字是被 Java 语言赋予特殊含义、具有专门用途的单词全部由小写字母构成。Java 17 共 67 个关键字按用途可分为以下几类。用途关键字访问控制publicprotectedprivate类与对象classinterfaceextendsimplementsnewthissuperinstanceof修饰符staticfinalabstractsynchronizedvolatiletransientnativestrictfp流程控制ifelseswitchcasedefaultforwhiledobreakcontinuereturn异常处理trycatchfinallythrowthrowsassert数据类型byteshortintlongfloatdoublecharbooleanvoid包与引用packageimport字面量truefalsenull另有goto与const两个保留字在 Java 中不起任何作用但同样禁止用作标识符。_作为单独标识符在 Java 9 起也被禁止。关键字的具体语义分散在后续各章此处只需建立「哪些词不能用」的边界。2.2 标识符的构成规则凡是由程序员命名的成分——包、类、接口、方法、变量、常量——统称标识符。硬性规则共五条违反任一条即编译失败。只能由字母、数字、下划线_、美元符$组成。不能以数字开头。不能是关键字或保留字。区分大小写。不能包含空格或其他符号。int age 18; // 合法 int _count 0; // 合法但下划线开头通常保留给生成代码 int $price 9; // 合法但不建议在业务代码中使用 // int 2sum 0; // 编译错误以数字开头 // int my age 18; // 编译错误含空格 // int class 1; // 编译错误关键字需要补充的是Java 标识符在语法上允许使用 Unicode 字母因此中文变量名可以编译通过。但这类写法在协作与工具链中会带来检索与编码问题工程实践中不使用。2.3 禁止数字开头的原因这条规则不是风格偏好而是为了消除词法分析的歧义。若允许标识符以数字开头下列两行将无法区分int 123L 12; // 假设合法 long l 123L; // 此处的 123L 是「整数 123 加 long 后缀」还是「标识符 123L」编译器无法同时接受两种解释long l 123L一行里l的值到底是整数 123还是变量123L所对应的取值 12两种读法都成立语言就无法确定语义。禁止数字开头后123L仅有「整数加后缀」一种含义词法分析得以唯一确定。2.4 命名规范规则由编译器强制规范由团队约定。后者不遵守不会报错但会影响可读性与协作成本。成分规范形态示例包全小写多单词连写通常以域名倒序开头xxxyyyzzzjava.lang、com.atguigu.bean类、接口大驼峰每个单词首字母大写XxxYyyZzzHelloWorld、String、System变量、方法小驼峰首单词小写其后单词首字母大写xxxYyyZzzage、name、bookName、main、binarySearch、getName常量全大写多单词以下划线连接XXX_YYY_ZZZMAX_VALUE、PI、DEFAULT_CAPACITY规范本身不含技术约束但对阅读顺序影响明显大写开头提示这是一个类型小写开头提示这是一个值或动作。IDE 的检查项与代码审查规则大多基于这套约定。三、数据类型体系3.1 基本类型与引用类型的划分Java 是强类型语言变量在声明时确定类型之后不改变。全部类型归为两支。基本类型共 8 种变量本身直接存储值。引用类型数组、类、接口、枚举、注解、记录。变量存储的是对象在堆上的地址。这一区分决定了两点行为差异基本类型的赋值复制的是值本身引用类型的赋值复制的是地址两个变量会指向同一个对象基本类型不能为null引用类型可以。3.2 八种基本类型的参数类型字节位数取值范围默认值包装类byte18-128 ~ 1270Byteshort216-32768 ~ 327670Shortint432-2147483648 ~ 21474836470Integerlong864-2^63 ~ 2^63-10LLongfloat432约 ±3.4×10^386~7 位有效数字0.0fFloatdouble864约 ±1.7×10^30815~16 位有效数字0.0dDoublechar2160 ~ 65535\u0000Characterboolean——true/falsefalseBoolean字节宽度与取值范围在判断溢出、理解类型提升顺序时必需应当作为基础记忆项。boolean的字节数在 Java 语言规范中未作规定单个变量在 JVM 中通常占用一个 4 字节的栈槽在boolean[]数组中按 1 字节存储。规范只保证其取值为true或false。更值得注意的是底层的表示方式Java 虚拟机中没有任何专门供boolean使用的字节码指令语言层面的boolean值在编译之后一律用虚拟机的int类型代替true记为 1false记为 0。这一约定出自《Java 虚拟机规范Java SE 8 版》它解释了为什么boolean的宽度无法从语言层面给出确定值也解释了为什么boolean与整数之间仍然不允许隐式互转——限制在编译期而不在虚拟机。3.3 字面量的默认类型三条规则决定后续绝大多数类型转换问题字面量默认类型例外整数int超出int范围必须加L否则编译错误小数double赋给float必须加F字符char—long l1 123L; // 标准写法 long l2 123; // 合法int 的 123 提升为 long // long l3 123123123123; // 编译错误该字面量被视为 int超出范围 long l4 123123123123L; // 合法 float f1 12.3F; // 合法 // float f2 12.3; // 编译错误12.3 是 double不能自动转为 float float f3 (float) 12.3; // 合法强转可能损失精度long允许省略后缀而float不允许原因在于方向不同123本是int赋给long属于窄转宽的自动提升12.3本是double赋给float属于宽转窄必须显式声明。整理成一句话——后缀的作用是改变字面量本身的类型强转的作用是改变赋值时的类型两者不可互相替代。后缀建议使用大写L小写l与数字1在多数等宽字体中难以区分。3.4 byte 的定位byte的取值范围只有 -128 ~ 127作为数值类型几乎没有运算价值。它存在的原因是表示一个字节的原始数据而非参与算术。场景使用 byte 的原因文件读写InputStream.read()的返回值与缓冲区元素类型均为byte网络传输协议按字节定义字段图像处理单个颜色通道的取值范围恰为 0 ~ 255加解密密文以字节序列表示由此可以给出一条划分原则常规数值计算使用int底层字节数据使用byte。C 语言没有独立的字节类型通常以char或unsigned char代替Java 将两者职责分开。3.5 浮点数的精度限制二进制无法精确表示大多数十进制小数0.1与0.2均为近似值。System.out.println(0.1 0.2); // 0.30000000000000004 System.out.println(0.1 0.2 0.3); // false因此浮点数不能用判断相等正确做法是比较差值是否小于允许误差// 片段 double a 0.1 0.2; boolean equal Math.abs(a - 0.3) 1e-9;涉及金额、库存、计量等要求精确的场合应使用BigDecimal// 片段需要 import java.math.BigDecimal; BigDecimal x new BigDecimal(0.1); BigDecimal y new BigDecimal(0.2); System.out.println(x.add(y)); // 0.3BigDecimal应以字符串构造。以double构造会把近似误差一并带入new BigDecimal(0.1)的结果是0.1000000000000000055511151231257827...。3.6 char 类型char占 2 字节C 中为 1 字节采用 Unicode 编码因此一个char可以容纳一个汉字。由此产生一个限制char只能表示基本多文种平面BMP内的字符超出该平面的字符如部分 emoji需要两个char表示即代理对。三种表现形式形式写法示例单字符单引号括起char c A;Unicode 转义\u 四位十六进制char c \u0023;即#转义字符\ 特定字母char c \n;常用转义字符转义含义Unicode\n换行\u000a\t制表符\u0009\r回车\u000d\b退格\u0008\\反斜线\u005c\单引号\u0027\双引号\u0022单引号与双引号不可混用a是chara是String两者类型不同不能相互赋值。char参与数值运算时按其 Unicode 码点处理运算结果的类型是int// 片段 char c a; System.out.println(c 1); // 98 System.out.println((char) (c 1)); // b // char d c 1; // 编译错误结果是 int3.7 boolean 类型取值只有true与false不存在以 0 和非 0 代替的写法这一点与 C 不同。它的用途集中在流程控制if条件语句、while循环语句、for循环语句、do-while循环语句四类语句的条件位置都要求boolean类型的表达式。// 片段 boolean isFlag true; if (isFlag) { /* true 分支 */ } else { /* false 分支 */ } // boolean b 1; // 编译错误 // if (1) { } // 编译错误条件必须是 boolean判断布尔变量时不应写成 true。除冗余外还容易误写为赋值表达式// if (isFlag true) { } // 冗余 // if (isFlag true) { } // 赋值表达式值为 true条件恒成立 if (isFlag) { } if (!isFlag) { }if (isFlag true)属于赋值而非比较编译可以通过部分编译器会给出警告运行时条件恒为真。这类错误不会报错只会产生错误行为因此直接书写变量本身是唯一稳妥的写法——Less is More。反过来任何结果为boolean的表达式都可以直接赋给boolean变量写成boolean bo1 (判断语句);的形式无需先写if语句// 片段 int score 76; boolean passed score 60; // true boolean both passed score 80; // true System.out.println(both); // 变量本身就承载了判断结果这种写法把判断结果保存下来供后续多次使用比反复书写同一条件表达式更清晰也便于在调试时观察中间结果。3.8 引用类型与指针的差别引用变量存放对象地址与 C 指针形式相近但有三处限制不能进行地址运算不存在p。不能与整数相互转换。不能指向任意内存只能指向由new创建或字面量引用的对象。这三条限制取消了 C 中大量未定义行为的来源也是 Java 在内存安全上优于 C 的原因。四、类型转换除boolean外的 7 种基本类型可以相互转换方式有两种自动类型提升与强制类型转换。4.1 自动类型提升的方向规则容量小的类型自动转换为容量大的类型无需任何语法标记。byte → short → int → long → float → double ↑ char需要说明两点char只向上提升为int不与byte、short互转。虽然后者位数不大于char但char无符号而short有符号语义不同规范不允许自动转换。long可以提升为float尽管float只有 32 位。原因是浮点类型的表示范围远大于整数类型提升不会溢出代价是可能损失精度超过 2^24 的整数转为float后末位可能不准确。4.2 二元运算中的类型提升Java 规定byte、short、char参与二元运算前先各自提升为int。// 片段 byte b1 10, b2 20; int sum b1 b2; // 合法 // byte sum2 b1 b2; // 编译错误结果为 int short s 1; // s s 1; // 编译错误s 1 是 int s 1; // 合法复合赋值隐含强制转换这条规则解释了为什么对byte、short的算术操作几乎总要强转也解释了s 1与s s 1为何不等价。4.3 强制类型转换形式为(目标类型) 值是自动提升的逆运算可能损失精度或溢出。应用到变量声明上完整写法为数据类型1 变量名 (数据类型1) 被强转的数据值; // 括号中的类型须不宽于原值的类型括号位置决定了转换发生在哪一步这一点的实际影响见 4.4。// 片段 int i (int) 3.99; // 3小数部分直接截断不四舍五入 int big 200; byte b (byte) big; // -56溢出回绕200转为byte得-56的原因byte仅保留低 8 位200的二进制为11001000按有符号数解读即为-56。强制转换不检查范围溢出不抛异常这是强转最主要的风险来源。需要四舍五入时应使用Math.round()其返回值为long。4.4 三类典型错误其一整数除法先求值再转型。// 片段 int i 1, j 2; double d1 (double) (i / j); // 0.0先算 i/j 0再转 double double d2 (double) i / j; // 0.5先将 i 转为 double再除括号位置决定运算顺序。其二字面量后缀缺失。// 片段 // long l 12345678901; // 编译错误超出 int 范围 long l 12345678901L; // float f 12.3; // 编译错误12.3 是 double float f 12.3F;其三char运算后未回转。// 片段 char a A; // char b a 1; // 编译错误结果是 int char b (char) (a 1); // B4.5 复合赋值是例外、-、*、/等复合赋值运算内部包含隐式强制转换因此下列写法合法// 片段 byte b 1; b 1; // 等价于 b (byte)(b 1) b; // 自增同样含隐式转换这一例外仅适用于复合赋值与自增自减普通赋值不享受该待遇。理解这一点可以避免把b与b b 1视为完全等价。五、String 类型5.1 引用语义String是引用类型不属于 8 种基本类型也是入门阶段唯一会频繁使用的对象类型。// 片段 String s 软件创新实验室; String empty ; // 长度为 0 的对象 String none null; // 不指向任何对象与null差别明确前者是有效对象可调用方法并得到长度 0后者不指向对象调用任何方法都会抛出NullPointerException。判断时应分别处理// 片段 if (s ! null s.length() 0) { } if (s ! null !s.isEmpty()) { }5.2 加号的两种含义在 Java 中承担两种运算由操作数类型决定情况含义两边均为数值算术加法至少一边为String字符串拼接// 片段 System.out.println( 1 2); // 12从左至右结合先得到 1 再拼 2 System.out.println( (1 2)); // 3括号改变结合顺序 int num 10; boolean b1 true; String s1 abc; String s2 s1 num b1; // abc10true // String s3 num b1 s1; // 编译错误int 不能与 boolean 相加 String s4 num (b1 s1); // 合法括号内先拼为 trueabc拼接的结合顺序是从左至右一旦左操作数变为String后续全部按拼接处理。这是 1 2得到12的原因。5.3 与数值之间的转换String不能通过强制转换变为数值类型// 片段 String str 123; // int num (int) str; // 编译错误 int num Integer.parseInt(str); // 正确借助包装类反向转换有三种方式行为一致String.valueOf(num)、Integer.toString(num)、 num。其中String.valueOf对null安全会返回字符串null而直接对null调用toString()会抛异常。六、运算符算术、比较、赋值运算符的形式与 C 一致不再展开。以下四组存在差异或不直观之处。6.1 逻辑运算符与短路操作数必须是boolean结果也是boolean。运算符名称规则是否短路逻辑与两边均为 true 时为 true否短路与同上是左侧为 false 时不计算右侧\|逻辑或任一边为 true 时为 true否\|\|短路或同上是左侧为 true 时不计算右侧!逻辑非取反—^逻辑异或两边不同为 true相同为 false否短路与否直接影响空值判断的正确性// 片段 if (str ! null str.length() 0) { } // 安全str 为 null 时右侧不执行 if (str ! null str.length() 0) { } // 危险右侧照常执行抛 NullPointerException这是与之间唯一具有实质影响的区别。业务代码中应统一使用与||。^异或的判据是「两边相异则为真」常用于开关翻转对整数使用时则按位异或见 6.5。6.2 比较运算符不能连写// if (3 x 6) { } // 编译错误 if (x 3 x 6) { } // 正确原因3 x的结果是booleanboolean与整数之间无比较运算表达式无法继续求值。这一点与数学写法直觉相反但规则明确。6.3 三元运算符// 片段 int a 10, b 20; int max a b ? a : b; String parity a % 2 0 ? 偶数 : 奇数;条件必须是boolean。两个分支的表达式类型需要兼容若一边是int、一边是double整个表达式提升为double若一边是基本类型、一边是其包装类会发生自动拆箱此时若包装类为null将抛出NullPointerException。后者是三元运算符最常见的隐蔽问题。6.4 自增自减前置与后置的区别在于取值时机// 片段 int i 5; int a i; // a 5随后 i 6 int b i; // i 先自增为 7b 7// 片段 int i 1; i i; // i 仍为 1最后一行需要拆解执行顺序先取i的值 1 压栈再执行i自增为 2最后将栈中的 1 赋回i。结果为 1。此类表达式不应出现在实际代码中一个语句只完成一个动作是可读性的基本要求。6.5 位运算与逻辑运算的符号重合、|、^、~同时是位运算符作用于整数时按二进制位运算// 片段 int m 6 3; // 2 110 011 010 int n 6 | 3; // 7 110 | 011 111 int k 6 ^ 3; // 5 110 ^ 011 101 int r ~6; // -7 按位取反含符号位 int sh 1 4; // 16 左移四位等价于乘 2^4运算类型由操作数决定两侧均为boolean时按逻辑运算均为整数时按位运算。、为有符号移位为无符号右移右移位数超过 31 时按n % 32处理左移不会抛出异常。七、控制台输入7.1 四个步骤使用Scanner从键盘读取数据需依次完成导包、创建对象、调用方法、关闭资源。// 完整示例ScannerDemo.java import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scanner new Scanner(System.in); // System.in 为标准输入流 System.out.print(请输入年龄); int age scanner.nextInt(); System.out.println(年龄 age); scanner.close(); // 释放底层资源 } }System.in的类型是InputStreamScanner在其上封装了类型解析能力。close()关闭的是System.in本身因此关闭后同一进程内不应再次使用System.in这一点在多处创建Scanner时需注意。7.2 按类型读取的方法方法读取内容nextInt()intnextLong()longnextDouble()doublenextFloat()floatnextBoolean()booleannext()一个单词StringnextLine()一整行Stringnext().charAt(0)一个字符Scanner没有nextChar()方法。读取单个字符需先按字符串接收再取首字符// 片段 char gender scanner.next().charAt(0);若输入为空字符串charAt(0)将抛出StringIndexOutOfBoundsException因此该写法隐含「至少输入一个字符」的前提。7.3 综合示例一次录入多种类型需求录入用户的网名、年龄、体重、是否单身、性别随后统一输出。五种输入分别对应String、int、double、boolean、char正好覆盖上表的全部类型。// 完整示例ScannerTest1.java import java.util.Scanner; public class ScannerTest1 { public static void main(String[] args) { // 创建 Scanner 对象。Scanner 是引用类型全名为 java.util.Scanner // new Scanner(System.in) 是一个 new 表达式结果是一个对象 // System.in 默认代表键盘输入。 Scanner scanner new Scanner(System.in); System.out.println(欢迎光临你好我好交友网站); System.out.print(请输入你的网名); String name scanner.next(); System.out.print(请输入你的年龄); int age scanner.nextInt(); System.out.print(请输入你的体重); double weight scanner.nextDouble(); System.out.print(你是否单身true/false); boolean isSingle scanner.nextBoolean(); System.out.print(请输入你的性别); char gender scanner.next().charAt(0); // 先按字符串接收再取下标 0 的字符 System.out.println(你的基本情况如下); System.out.println(网名 name \n年龄 age \n体重 weight \n单身 isSingle \n性别 gender); scanner.close(); // 关闭资源 } }这段代码有五处值得注意对象与变量的关系。Scanner scanner new Scanner(System.in)中scanner是引用类型的变量赋给它的值是一个对象。引用类型的变量因此也被称为对象名日常表述中直接称作「scanner 对象」。new表达式的含义。new Scanner(System.in)的求值结果是一个对象对象存放在堆上变量中保存的是指向它的地址。这一机制在面向对象部分展开此处只需知道等式右边必然带有new。方法名与类型的对应。nextInt()对应intnextDouble()对应doublenextBoolean()对应boolean方法名中的类型必须与实际接收的变量一致写错会在运行期抛异常。字符的读取方式。Scanner没有nextChar()char只能先按字符串读入再取首字符charAt(0)的下标从 0 开始。String的拼接输出。末尾一行把六个值拼成一个字符串\n用于换行若改用println逐行输出需要六条语句。boolean一项要求输入true或false输入1、0、是、否都会抛出InputMismatchException原因见 3.7boolean不接受整数替代。7.4 类型不匹配输入内容与所需类型不符时nextInt()等方法抛出InputMismatchException程序终止。稳妥做法是先判断再读取// 片段 if (scanner.hasNextInt()) { int n scanner.nextInt(); } else { System.out.println(输入的不是整数); scanner.next(); // 丢弃错误输入避免死循环 }hasNextXxx()与nextXxx()成对使用是处理不可信输入的标准写法。循环读取时若不丢弃错误输入条件判断会反复命中同一段内容形成死循环。7.5 换行符残留这是入门阶段最常见的输入问题。// 片段 System.out.print(请输入年龄); int age scanner.nextInt(); // 输入 18 并回车 System.out.print(请输入名字); String name scanner.nextLine(); // 得到空字符串nextInt()读取数字后停止于第一个非数字字符即回车符该字符仍留在缓冲区。nextLine()从当前位置读到行尾遇到这个残留的回车立即返回结果为空串。处理方式是在两者之间插入一次nextLine()消费该换行符// 片段 int age scanner.nextInt(); scanner.nextLine(); // 消费残留的换行符 String name scanner.nextLine();另一种做法是全程统一使用nextLine()读取再自行转换类型可彻底回避该问题代价是需要处理转换异常。7.6 next 与 nextLine 的差别方法终止条件能否读取空格next()空白字符空格、Tab、换行否只能读到一个词nextLine()仅换行符是读取整行// 片段输入hello world String a scanner.next(); // hello String b scanner.next(); // world // 若改用 nextLine()则一次得到 hello world按词处理使用next()按行处理使用nextLine()。混合使用两者时必须考虑 7.5 所述的残留问题。八、随机数8.1 值域Math.random()返回[0, 1)区间的double含 0 不含 1。// 片段 double value Math.random(); // 0.0 value 1.0该方法的随机源为java.util.Random的共享实例首次调用时初始化。需要可复现的随机序列或更高性能时应显式创建Random对象并指定种子。8.2 区间映射目标写法[0, 100)的小数Math.random() * 100[0, 99]的整数(int) (Math.random() * 100)[5, 104]的整数(int) (Math.random() * 100) 5[a, b]的整数(int) (Math.random() * (b - a 1)) a通用公式的推导b - a 1是区间内整数个数乘以[0,1)的随机数得到[0, 个数)(int)截断后落在[0, 个数-1]加上a平移至[a, b]。8.3 边界说明公式成立的前提是截断而非四舍五入。若改用Math.round()两端值的出现概率会变为其他值的一半分布不再均匀。// 完整示例MathRandomTest.java public class MathRandomTest { public static void main(String[] args) { System.out.println(Math.random()); int dice (int) (Math.random() * 6) 1; // [1, 6] System.out.println(dice); int n (int) (Math.random() * (20 - 10 1)) 10; // [10, 20] System.out.println(n); } }上式产生的是伪随机数不具备密码学安全性。涉及令牌、验证码等场景应使用java.security.SecureRandom。九、练习与要点回顾9.1 练习声明byte、short、int、long各一个分别赋边界值打印输出确认范围。使用强制转换验证(byte) 200、(short) 70000、(int) 3.99的结果并解释成因。不使用第三个变量通过异或交换两个整数说明其成立条件。用Scanner依次读取姓名、年龄、身高要求年龄读完后姓名不得为空串。生成[1, 100]的随机整数连续生成 10000 次统计各数值出现次数是否接近均匀。9.2 要点回顾主题结论类型划分8 种基本类型存值引用类型存地址基本类型不能为 null字面量默认整数默认int小数默认double超范围或窄类型必须加后缀类型提升byte/short/char参与运算先升intchar不与byte、short互转强制转换截断而非四舍五入溢出静默回绕不抛异常复合赋值等隐含强转是b b 1编译失败而b 1通过的原因的双义一旦出现String即转为拼接且从左至右结合浮点比较不能用金额计算用BigDecimal且以字符串构造逻辑运算统一用/||/|不短路会引发 NPE输入nextInt()后接nextLine()需先消费换行符随机数[a, b]用(int)(Math.random()*(b-a1))a前提是截断掌握以上十条入门阶段的类型与表达式问题基本可以覆盖。下一篇进入面向对象类与对象、成员变量与方法、封装与构造器。
延伸阅读

更多相关文章

2026/11/5 3:32:46

三次握手 四次挥手还不会?用tcpdump分析给你看

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 3:32:46

FreeTube 护眼模式快速上手:60 秒切深色,夜间把蓝光调舒服

FreeTube 护眼模式快速上手:60 秒切深色,夜间把蓝光调舒服 FreeTube 是个开源、把隐私放在第一位的 YouTube 客户端。想让它对眼睛友好点,不用折腾半天:跟着下面的顺序走,60 秒就能切到深色,再花几分钟把夜…

2026/11/5 3:32:46

【RHCA+】mpstat命令(监控CPU)

“ 目录:RHCA -> 12 系统监控 -> 22 mpstat命令(监控CPU) ”查看CPU负载;语法格式:mpstat [参数] [刷新延时] [刷新次数]参数作用-P指定要查看的CPU核心ALL:表示所有CPU-V查看版本刷新延时刷新时间间…

2026/11/5 5:02:55

ADS122U04IPWR+PIC18LF4525:工业温度采集方案详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 5:02:55

工业级温度测量:ADS122U04+STM32F405RG高精度信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 5:02:55

S7-200 SMART PLC实现Modbus RTU总线数据侦听与故障诊断

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 5:02:55

工业温度测量方案:ADS122U04IPWR与PIC18F47Q10高精度RTD采集实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 4:57:55

Django+Vue网上书店系统:订单状态机与库存并发控制实战

网上书店这个选题,每年毕业季都有人做,但真正能拿得出手的没几个。我见过太多"图书商城"项目,前端页面花里胡哨,点进去购物车是写死的假数据,下单按钮弹个alert就算完事;也见过论文里把"高并…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑