本系列可作为JAVA学习系列的笔记,文中提到的一些练习的代码,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。
点赞关注不迷路!您的点赞、关注和收藏是对小编最大的支持和鼓励!
系列文章目录
JAVA学习 DAY2 java程序运行、注意事项、转义字符
JAVA学习 DAY5 变量&数据类型 [万字长文!一篇搞定!]
JAVA学习 DAY7 程序逻辑控制【万字长文!一篇搞定!】
JAVA学习 DAY11 类和对象_续1【万字长文!一篇搞定!】
JAVA学习 DAY12 继承和多态【万字长文!一篇搞定!】
JAVA学习 DAY13 抽象类和接口【万字长文!一篇搞定!】
深度剖析 Java 图书管理系统设计与实现:类、接口与对象的实战应用
拓展文章
Java避坑指南:千万别在构造方法中调用重写的方法!(附代码案例+执行流程全解析)
深入剖析 Java 中的深拷贝与浅拷贝:原理、实现与最佳实践
目录
(2)自动类型转换(Widening Conversion)
(3)强制类型转换(Narrowing Conversion)
前言
小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!
本系列文章可以作为学习JAVA的笔记使用,本文除了小编的笔记,还整理了 宝藏老师 B站up主:韩顺平 的系列视频笔记:【零基础 快速学Java】韩顺平 零基础30天学会Java
一、Java中的变量
变量是Java程序中最基本的存储单元,用于存储数据值。在Java中,每个变量都有特定的类型,决定了变量可以存储的数据种类和大小。变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)。
不论使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如:变量有三个基本要素(类型+名称+值)
1.变量的组成
Java变量由三个部分组成:变量=变量名+值+数据类型
- 变量类型 - 决定变量可以存储的数据类型
- 变量名 - 用于标识变量的唯一名称
- 变量值 - 存储在变量中的数据
2.变量的声明
变量声明的基本语法:(变量必须先声明,后使用,即有顺序,该区域的数据/值可以在同一类型范围内不断变化,变量在同一个作用于内不能重名)
数据类型 变量名 [= 初始值];
示例:
int age; // 声明一个整型变量age
double price; // 声明一个双精度浮点变量price
char grade = 'A'; // 声明并初始化一个字符变量grade
3.Java变量的类型
Java中的变量主要分为两大类:
(1) 基本数据类型变量(原始类型)
| 类型 | 大小 | 范围/描述 | 示例 |
|---|---|---|---|
| byte | 8位 | -128到127 | byte b = 100; |
| short | 16位 | -32,768到32,767 | short s = 1000; |
| int | 32位 | -2^31到2^31-1 | int i = 100000; |
| long | 64位 | -2^63到2^63-1 | long l = 100L; |
| float | 32位 | 单精度浮点数 | float f = 3.14f; |
| double | 64位 | 双精度浮点数 | double d = 3.14; |
| char | 16位 | Unicode字符 | char c = 'A'; |
| boolean | 1位 | true或false | boolean flag = true; |
(2) 引用数据类型变量
- 类类型(如String)
- 接口类型
- 数组类型
示例:
String name = "张三"; // String是类类型
int[] numbers = {1, 2, 3}; // 数组类型
4.变量的命名规则
- 必须以字母、下划线(_)或美元符号($)开头
- 后续可以是字母、数字、下划线或美元符号
- 不能使用Java关键字
- 区分大小写
- 建议使用驼峰命名法(如:studentName)
5.变量的作用域
根据声明位置不同,变量分为:
-
局部变量 - 在方法或代码块内声明
- 必须在使用前初始化
- 只在声明它的方法/代码块内有效
-
实例变量(成员变量) - 在类内但在方法外声明
- 属于对象实例
- 有默认值(数值型为0,布尔型为false,引用型为null)
-
类变量(静态变量) - 使用static关键字声明
- 属于类而非实例
- 可通过类名直接访问
示例:
public class Example {
static int classVar = 10; // 类变量
int instanceVar = 20; // 实例变量
void method() {
int localVar = 30; // 局部变量
System.out.println(localVar);
}
}
6.变量的初始化
Java要求变量在使用前必须初始化:
- 局部变量:必须显式初始化
- 实例变量和类变量:有默认值,但显式初始化是良好实践
7.final变量(常量)
使用final关键字声明的变量只能被赋值一次:
final double PI = 3.14159;
final变量通常用大写字母命名,多个单词用下划线分隔。
8.类型转换
Java支持两种类型转换:
-
自动类型转换(隐式转换) - 小类型转大类型
int i = 100; long l = i; // 自动转换 -
强制类型转换(显式转换) - 大类型转小类型
double d = 100.04; long l = (long)d; // 强制转换,值为100
理解和使用变量是Java编程的基础,合理选择变量类型和命名规范对编写可读性高、效率好的代码至关重要。
9.程序中“+”的使用
(1)当左右两边都是数值型时,则做加法运算
(2)当左右两边有一方为字符串时,则做拼接运算
(3)运算顺序,都是从左到右
(4)代码示例
public class add{
public static void main(String args[]){
System.out.println(100+98);//198
System.out.println("100"+98);//10098
System.out.println(100+3+"hello");//103hello
System.out.println("hello"+100+3);//hell1003
}
}

二、数据变量类型 详解
1.Java中的整数类型
Java提供了四种整数类型变量,用于存储不同范围的整数值。这些类型在内存占用和数值范围上有所不同,程序员可以根据实际需求选择合适的类型。
(1)四种整数类型
-
byte(字节型) 1byte=8 bit
- 大小:8位(1字节)
- 范围:-128 到 127
- 默认值:0
- 用途:节省空间,处理二进制数据
-
short(短整型)
- 大小:16位(2字节)
- 范围:-32,768 到 32,767
- 默认值:0
- 用途:较少使用,特定场合节省空间
-
int(整型)
- 大小:32位(4字节)
- 范围:-2,147,483,648 到 2,147,483,647
- 默认值:0
- 用途:最常用的整数类型
-
long(长整型)
- 大小:64位(8字节)
- 范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
- 默认值:0L
- 用途:需要大范围整数时使用
(2)声明和初始化示例
byte b = 100; // 字节型
short s = 1000; // 短整型
int i = 100000; // 整型(最常用)
long l = 10000000000L; // 长整型(注意L后缀)
(3)使用注意事项
-
字面量表示:
- 默认整数字面量是int类型
- 长整型需要在数字后加L或l(推荐大写L)
-
类型转换:
- 小范围类型可以自动转换为大范围类型(如byte→int)
- 大范围类型转小范围类型需要强制转换,可能丢失精度
int a = 100; byte b = (byte)a; // 强制转换 -
运算规则:
- 整数运算结果至少是int类型
- byte/short/char参与运算时自动提升为int
byte x = 10; byte y = 20; int z = x + y; // 结果是int类型 -
溢出问题:
- 超出类型范围的值会导致溢出(循环)
- 需要特别注意边界情况
int max = Integer.MAX_VALUE; // 2147483647 int overflow = max + 1; // 变成-2147483648
(4)实际应用建议
- 大多数情况下使用int类型即可
- 处理大文件或网络数据时考虑使用byte
- 需要存储很大数值时使用long
- 在数组或集合中存储大量数值时,根据范围选择合适类型可以节省内存
整数类型是Java编程中最基础也是使用最频繁的数据类型,理解它们的特性和区别对于编写高效、正确的Java程序至关重要。
2.Java中的浮点类型
Java提供了两种浮点类型来表示带小数部分的数值,用于处理科学计算、财务计算等需要高精度小数的场景。
(1)两种浮点类型
① float(单精度浮点型)
- 大小:32位(4字节)
- 范围:约±3.40282347E+38F(6-7位有效数字)
- 默认值:0.0f
- 后缀:必须使用'f'或'F'后缀
- 精度:约6-7位十进制数字
- 用途:节省空间时使用,但通常推荐使用double
② double(双精度浮点型)
- 大小:64位(8字节)
- 范围:约±1.79769313486231570E+308(15位有效数字)
- 默认值:0.0d
- 后缀:可选的'd'或'D'后缀(默认浮点字面量就是double)
- 精度:约15位十进制数字
- 用途:Java默认的浮点类型,推荐使用
(2)声明和初始化示例
float f1 = 3.14f; // 必须加f后缀
float f2 = 1.23e4f; // 科学计数法表示
double d1 = 3.1415926; // 默认是double
double d2 = 1.23e-4; // 科学计数法
(3)浮点数的特殊值
Java浮点类型支持几个特殊值:
- 正无穷大:
Double.POSITIVE_INFINITY - 负无穷大:
Double.NEGATIVE_INFINITY - NaN(非数字):
Double.NaN
double inf = 1.0/0.0; // 正无穷大
double negInf = -1.0/0.0; // 负无穷大
double nan = 0.0/0.0; // NaN
(4)浮点运算的特点
-
精度问题:
- 浮点数不能精确表示所有十进制小数
- 比较时应避免直接使用==,而应检查差值是否在允许范围内
// 不推荐 if (d1 == d2) {...} // 推荐方式 final double EPSILON = 1e-10; if (Math.abs(d1 - d2) < EPSILON) {...} -
运算规则:
- 涉及float和double的运算,结果自动提升为double
- 整数与浮点数运算,整数自动转换为浮点数
-
舍入误差:
- 浮点运算可能产生舍入误差
- 对精度要求高的计算应考虑使用BigDecimal
(5)使用建议
- 默认选择double:除非有特殊内存限制,否则优先使用double
- 避免直接比较:使用阈值比较代替直接相等比较
- 财务计算:使用BigDecimal代替浮点类型
- 科学计算:注意数值范围和精度限制
- 格式化输出:使用DecimalFormat控制输出格式
double price = 19.99;
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(price)); // 输出: 19.99
浮点类型是Java中处理实数的重要工具,理解其特性和限制对于编写正确的数值计算程序至关重要。
3.Java中的字符类型(char)
(1)基本概念
Java中的字符类型char用于表示单个Unicode字符,它是Java的原始数据类型之一。
(2)主要特点:
- 大小:16位(2字节)
- 范围:0到65,535(\u0000到\uffff)
- 默认值:'\u0000'(空字符)
- Unicode支持:可以表示大多数世界语言的字符
(3)声明和初始化
char c1 = 'A'; // 使用单引号表示字符字面量
char c2 = 65; // 使用ASCII码值
char c3 = '\u0041'; // 使用Unicode转义序列
char c4 = '\n'; // 转义字符(换行符)
(4)转义字符
Java支持以下常用转义字符:
| 转义序列 | 描述 |
|---|---|
\n | 换行符 |
\t | 制表符 |
\r | 回车符 |
\\ | 反斜杠 |
\' | 单引号 |
\" | 双引号 |
\b | 退格符 |
\f | 换页符 |
(5)字符运算
char类型可以参与数值运算,因为它在底层存储的是Unicode码点值:
char c = 'A';
int code = c; // 获取字符的Unicode码点值(65)
char nextChar = (char)(c + 1); // 结果为'B'
(6)特殊注意事项
-
与String的区别:
char是原始类型,String是对象类型char使用单引号,String使用双引号
-
char与int的转换:
char c = '9'; int numericValue = c - '0'; // 将字符数字转换为数值9 -
Unicode补充字符:
- 基本多语言平面(BMP)字符可以直接用char表示
- 辅助字符(码点大于0xFFFF)需要使用两个char(代理对)表示
(7)实际应用示例
字符遍历
String str = "Hello";
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
System.out.println(ch);
}
字符分类检查
char ch = 'A';
if (Character.isLetter(ch)) {
System.out.println("这是一个字母");
}
if (Character.isDigit(ch)) {
System.out.println("这是一个数字");
}
大小写转换
char lower = Character.toLowerCase('A'); // 'a'
char upper = Character.toUpperCase('a'); // 'A'
Java的char类型为处理文本数据提供了基础支持,特别是在需要处理单个字符或进行字符级操作时非常有用。理解char的特性对于正确处理文本输入输出、字符串操作等任务至关重要。
4.Java中的布尔类型(boolean)
(1)基本概念
布尔类型是Java中最简单的数据类型,用于表示逻辑值,只有两个可能的取值:
- true:表示逻辑真
- false:表示逻辑假
(2)主要特点:
- 大小:Java规范没有明确规定boolean的大小,通常JVM实现使用1位或1字节
- 默认值:false(对于类成员变量)
- 用途:主要用于条件判断和控制流程
(3)声明和初始化
boolean isJavaFun = true; // 声明并初始化为true
boolean isRaining = false; // 声明并初始化为false
boolean isAdult; // 声明,默认值为false(如果是类成员变量)
(4)布尔运算
Java提供了多种布尔运算符:
1. 逻辑运算符
&&:逻辑与(短路与)||:逻辑或(短路或)!:逻辑非
boolean a = true;
boolean b = false;
boolean andResult = a && b; // false
boolean orResult = a || b; // true
boolean notResult = !a; // false
2. 比较运算符
==:等于!=:不等于>,<,>=,<=:数值比较(结果为boolean)
int x = 5;
int y = 10;
boolean isEqual = (x == y); // false
boolean isGreater = (x > y); // false
(5)特殊注意事项
-
与C/C++的区别:
- Java中的boolean不能转换为其他类型(如int)
- 不能使用0/1代替false/true
// 错误示例(在C/C++中可以,但在Java中不行) // int flag = 1; // if (flag) {...} // 正确写法 boolean flag = true; if (flag) {...} -
短路特性:
&&和||具有短路特性- 第一个操作数能确定结果时,不会计算第二个操作数
if (obj != null && obj.isValid()) { // 如果obj为null,不会调用isValid()方法 } -
布尔表达式:
- 所有条件表达式的结果都是boolean类型
- 三目运算符中也使用boolean条件
int age = 20; String status = (age >= 18) ? "成人" : "未成年";
(6)实际应用示例
条件控制
boolean hasPermission = checkPermission();
if (hasPermission) {
// 执行有权限的操作
} else {
// 提示无权限
}
循环控制
boolean isRunning = true;
while (isRunning) {
// 执行某些操作
isRunning = shouldContinue(); // 根据条件更新布尔值
}
方法返回值
public boolean isEvenNumber(int num) {
return num % 2 == 0;
}
标志位使用
boolean dataLoaded = false;
// ...
if (!dataLoaded) {
loadData();
dataLoaded = true;
}
布尔类型虽然简单,但在Java编程中无处不在,是控制程序流程的基础。正确使用布尔类型可以使代码逻辑更加清晰,条件判断更加明确。
5.Java中的类型转换:自动类型转换与强制类型转换
(1)类型转换概述
Java作为强类型语言,在不同数据类型之间进行转换时需要遵循特定规则。类型转换主要分为两种:
- 自动类型转换(隐式转换) - 由编译器自动完成
- 强制类型转换(显式转换) - 需要程序员明确指定
(2)自动类型转换(Widening Conversion)
① 基本概念
当满足以下条件时,Java会自动进行类型转换:
- 两种数据类型兼容
- 目标类型范围大于源类型范围
②转换规则(按方向)
byte → short → int → long → float → double
↑
char
③ 具体示例
int i = 100;
long l = i; // 自动转换:int → long
float f = l; // 自动转换:long → float
double d = f; // 自动转换:float → double
char c = 'A';
int charToInt = c; // 自动转换:char → int(得到Unicode值65)
④特殊情况
- 整数到浮点数:可能损失精度(如很大的long转float)
long bigNum = 123456789012345L;
float f = bigNum; // 可能丢失精度
(3)强制类型转换(Narrowing Conversion)
①基本概念
当需要将大范围类型转换为小范围类型时,必须使用强制类型转换:
目标类型 变量名 = (目标类型)值;
②主要风险
- 数据溢出:值超出目标类型范围
- 精度丢失:浮点数转整数时小数部分被截断
③ 具体示例
double d = 100.04;
long l = (long)d; // 结果为100(小数部分丢失)
int i = (int)l; // 强制转换:long → int
byte b = (byte)257; // 结果为1(257-256=1,因为byte范围是-128~127)
④特殊转换
- 浮点数与整数:
float f = 3.14f;
int i = (int)f; // 结果为3(直接截断小数部分)
- char与数值类型:
int i = 65;
char c = (char)i; // 结果为'A'
(4)类型转换规则总结
①自动转换适用场景
- 整数到更大范围的整数
- 整数到浮点数
- 浮点数到更大范围的浮点数
- char到int/long/float/double
② 需要强制转换的场景
- 大范围类型转小范围类型
- 浮点数转整数
- 数值类型与char之间的双向转换
- 不兼容类型之间的转换(如数值与boolean)
(5)实际应用建议
①避免不必要的强制转换:可能引发精度损失或溢出
②注意运算时的自动提升:
byte a = 10;
byte b = 20;
byte c = (byte)(a + b); // 需要强制转换,因为运算结果默认为int
③处理大数值时特别小心:
long bigNum = 3000000000L;
int i = (int)bigNum; // 结果为-1294967296(溢出)
④使用类型检查方法:
double d = 100.0;
if (d >= Integer.MIN_VALUE && d <= Integer.MAX_VALUE) {
int i = (int)d;
}
(6)特殊类型转换案例
字符串与数值转换:
// String转数值
String numStr = "123";
int num = Integer.parseInt(numStr);
// 数值转String
String s = String.valueOf(123);
包装类转换(自动装箱/拆箱):
Integer obj = 100; // 自动装箱(int → Integer)
int val = obj; // 自动拆箱(Integer → int)
理解并正确应用类型转换是Java编程的基础,合理使用可以增强代码灵活性,不当使用则可能导致难以发现的错误。
6.ASCII码、Unicode编码与UTF-8编码详解
(1)ASCII码(美国信息交换标准代码)
①基本概念
ASCII(American Standard Code for Information Interchange)是最早的字符编码标准,诞生于1960年代。
② 核心特性
- 编码范围:7位二进制(实际使用8位存储,最高位为0)
- 字符数量:128个(0-127)
- 编码空间:
- 0-31:控制字符(如换行、回车等)
- 32-126:可打印字符(字母、数字、标点等)
- 127:删除控制字符
③典型ASCII码示例
| 十进制 | 字符 | 说明 |
|---|---|---|
| 65 | A | 大写字母A |
| 97 | a | 小写字母a |
| 48 | 0 | 数字0 |
| 32 | 空格 |
④局限性
- 仅支持英语字符
- 无法表示其他语言字符(如中文、日文等)
(2)Unicode编码(统一码)
①基本概念
Unicode是为解决ASCII局限性而开发的国际字符编码标准,目标是包含全世界所有书写系统的字符。
②核心特性
- 编码空间:理论上支持1,114,112个码位(目前使用17个平面,每个平面65,536个字符)
- 编码方式:
- 码点(Code Point):U+十六进制数(如U+0041表示'A')
- 分为17个平面(Plane),基本多语言平面(BMP,Plane 0)包含最常用字符
③Unicode版本发展
- 最新版本:Unicode 15.0(2022年发布)
- 已编码字符:超过14万个(包括各种文字、符号、表情等)
④ 编码示例
| 码点 | 字符 | 说明 |
|---|---|---|
| U+0041 | A | 拉丁大写A |
| U+4E2D | 中 | 中文"中" |
| U+1F600 | 😀 | 笑脸表情 |
⑤ 存储实现
Unicode本身只是字符集,具体存储实现由UTF-8、UTF-16等编码方案决定。
(3)UTF-8编码(Unicode转换格式8位)
① 基本概念
UTF-8是Unicode的可变长度字符编码,由Ken Thompson和Rob Pike于1992年创建。
②核心特性
- 兼容性:完全兼容ASCII(ASCII字符UTF-8编码不变)
- 变长设计:使用1-4个字节表示一个字符
- 前缀码设计:通过首字节前缀区分编码长度
③ 编码规则
| Unicode码点范围 | UTF-8编码格式 |
|---|---|
| U+0000 - U+007F | 0xxxxxxx(1字节,与ASCII相同) |
| U+0080 - U+07FF | 110xxxxx 10xxxxxx(2字节) |
| U+0800 - U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx(3字节) |
| U+10000 - U+10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx(4字节) |
④ 编码示例
| 字符 | Unicode码点 | UTF-8编码(十六进制) |
|---|---|---|
| A | U+0041 | 41 |
| 中 | U+4E2D | E4 B8 AD |
| 😀 | U+1F600 | F0 9F 98 80 |
⑤优势
- 对ASCII字符高效(1字节)
- 无字节序问题(不需要BOM)
- 容错能力强
- 已成为互联网首选编码(超过98%的网页使用UTF-8)
(4)三种编码的关系与比较
①演进关系:
ASCII → 扩展ASCII(ISO-8859等)→ Unicode → UTF-8/UTF-16
②对比表:
| 特性 | ASCII | Unicode | UTF-8 |
|---|---|---|---|
| 诞生时间 | 1960年代 | 1991年 | 1992年 |
| 编码范围 | 0-127 | 0-1,114,111 | 与Unicode相同 |
| 最小单位 | 1字节 | 抽象码点 | 1-4字节 |
| 英语效率 | 100% | 200%(UTF-16) | 100% |
| 中文效率 | 不支持 | 200%(UTF-16) | 150% |
| 扩展性 | 无 | 极强 | 极强 |
(6)实际应用
①Java中的编码处理
// 字符串与字节数组转换
String str = "中文ABC";
byte[] utf8Bytes = str.getBytes(StandardCharsets.UTF_8); // 按UTF-8编码
String decodedStr = new String(utf8Bytes, "UTF-8"); // UTF-8解码
// 获取字符的Unicode码点
char c = '中';
int codePoint = (int)c; // 获得Unicode码点
② 编码识别与转换
- 文件编码识别:使用工具检测(如Linux的
file命令) - 编码转换示例(Linux):
iconv -f GBK -t UTF-8 input.txt > output.txt
③编程注意事项
- 始终明确指定编码(避免依赖平台默认编码)
- 处理文本文件时注意BOM头(UTF-8通常不需要)
- 数据库连接设置正确编码(如MySQL的
characterEncoding=UTF-8)
理解这些编码标准对于处理国际化文本、网络通信和文件存储至关重要,特别是在开发多语言支持的应用程序时。UTF-8因其高效性和兼容性,已成为现代软件开发的事实标准。
三、总结
Java变量是存储数据的基本单元,由类型、名称和值组成,分为基本类型(如int、double、boolean等)和引用类型(如String、数组)。根据作用域,变量分为局部变量(方法内)、实例变量(对象内)和类变量(static修饰)。命名需遵循规则(如驼峰命名法),final变量为常量。类型转换包括自动转换(小范围转大范围)和强制转换(可能丢失精度)。此外,字符编码涉及ASCII(英文)、Unicode(全球字符)和UTF-8(变长编码,兼容ASCII)。合理使用变量和数据类型是编写高效Java程序的关键。
489

被折叠的 条评论
为什么被折叠?



