JAVA-基本程序设计结构(变量、常量、数据类型)
1.变量
1.变量概念
变量是程序的基本组成单位。无论是何种高级语言,变量都是其程序的基本组成单位。
变量相当于内存中一个数据存储空间的表示,通过变量名可以访问到变量值。
变量使用步骤:声明变量—赋值—使用
注意:
-
变量表示内存中的一个存储区域[不同的变量,类型不同,占据的空间大小不同。 例如:int—4字节 double—8字节]
-
该区域有自己的名称[变量名]和类型[数据类型]
-
变量必须先声明,后使用,即有顺序
-
该区域的数据可以在同一类型范围内不断变化
-
变量在同一个作用域内不能重名
-
变量 = 变量名+值+数据类型
2.声明变量
1. 声明一个变量时,先指定变量的类型,然后是变量名。
类型 变量名; 例如 double salary;
2. 声明是一个完整的 Java 语句,所有的 Java 语句都以分号结束,所以在声明变量时分号是必须的。
3. 作为变量名的标识符由 字母、数字、货币符号以及“标点连接符”组成,首字符不能为数字。
- 字母——一种语言中表示字母的任何Unicode字符
- 标点连接符——下划线(_)、波浪线以及其他一些符号
4. 标识符的字母区分大小写(例如 main与Main为不同标识符),长度基本没有限制。
5. 不能使用关键字作为变量名
6. 可以在一行中声明多个变量
3.初始化变量
1. 声明一个变量后,必须用赋值语句显式地初始化变量,不可以使用未初始化的变量值。
2. 赋值: 变量 = 值
3. 在 Java 中可以将声明放在代码中的任何地方,但必须在使用该变量的前面。
PS:从 Java10 开始,对于局部变量,如果可以从变量的初始值推断出它的类型,就不需要再声明类型,只需要使用关键字 var 而无须指定类型。
4.常量
1. 在 Java 中,可以使用关键字final 指示常量。
关键字 final 表示这个变量只能被赋值一次。一旦赋值,就不能在更改了。一般,常量名使用全部大写比较流行。
PS:为常量赋值会报错
例如:
public class Constants { public static void main(String[] args) { final double CM_PER_INCH = 2.54; double paperWidth = 8.5; double paperHeight = 11; System.out.println("Paper size in centimeters:" + paperWidth * CM_PER_INCH + " by " + paperHeight * CM_PER_INCH); } }
2. 可以使用关键字 static final 设置一个类常量
类常量:可以一个类的多个方法中使用的常量
例如:
public class Constants2 { public static final double CM_PER_INCH = 2.54; public static void main(String[] args) { double paperWidth = 8.5; double paperHeight = 11; System.out.println("Paper size in centimeters:" + paperWidth * CM_PER_INCH + " by " + paperHeight * CM_PER_INCH); } }
类常量的定义位于 main 方法之外。 目的是,同一个类的其他方法也可以使用这个常量。
如果一个常量被声明为 public ,那么其他类的方法也可以使用这个常量。
5.枚举类型
可以自定义枚举类型来解决一个变量只包含有限的一组值的问题。枚举类型包括有限个命名值。
(初版待更新)
2.基本数据类型
Java 是一种强类型语言,必须为每一个变量声明一个明确的类型,在内存中分配不同的大小内存空间(字节)。
在 Java 中,一共有8种基本类型,其中有4种整形、2种浮点型、1种字节型 char(用于表示Unicode编码的代码单元) 和1种用于表示真值的 boolean 类型。
1.整形
1.整形用于表示没有小数部分的数,可以是负数。
类型 | 存储需求 | 取值范围 |
int[整型] | 4字节 | -2 147 483 648 ~ 2 147 483 647(略高于20亿) |
short[短整型] | 2字节 | -32 768 ~ 32 767 |
long[长整型] | 8字节 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 |
byte[字节] | 1字节 | -128 ~ 127 |
2.在Java中,整型的范围与运行Java代码的机器无关,各种数据类型的取值范围和字段长度是固定的,不受具体OS[操作系统]的影响(可移植性)
3.Java的整形常量默认为 int 型,声明 long 型常量须后加 'l' 或 'L'
4.Java程序中变量常声明为int型,除非不足以表示大数,才用long
5.bit:计算机中最小的存储单位 byte(字节):计算机中基本存储单元
1 byte = 8 bit
6.Java没有无符号(unsigned)形式的 int、long、short 或 byte 类型
2.浮点类型
1.浮点类型用于表示有小数部分的数值(可正可负)
类型 | 存储类型 | 取值范围 |
float[单精度] | 4字节 | 大约 ± 3.402 823 47 x 10³⁸(6 ~ 7 位有效数字) |
double[双精度] | 8字节 | 大约 ± 1.797 693 134 862 315 70 x 10³⁰⁸(15 位有效数字) |
- 浮点数在机器中的存放形式为:浮点数 = 符号位 + 指数位 + 尾数位
- 尾数部分可能丢失,造成精度损失(小数都是近似值)
2.在Java中,浮点型的取值范围和字段长度是固定的,不受具体OS[操作系统]的影响(可移植性)
3.Java 的浮点型常量默认为double型,声明 float 型常量须后加 'f' 或 'F'(也可以在double型数值后面添加 'D' 或 'd')
4.浮点类型常量有两种表示形式
- 十进制形式
- 科学计数法形式:5.12e2[5.12*10的2次方] 5.12E-2[5.12/10的2次方](+为乘、-为除、e和E均可)
可以使用十六进制表示浮点数的字面量。在十六进制法中,使用p表示指数,而不是e(指数采用十六进制,指数采用十进制)
例如: 0.125 = 2⁻³ 可以写为 0x1.0p-3
5.通常情况下使用double型,double型比float型更精确,double数字精确度是float型的两倍
6.所有的浮点数都遵循 IEEE 754规范。有3个特殊的浮点数值表示溢出和出错情况
- 正无穷大
- 负无穷大
- NaN(不是一个数)
例如:一个正整数除以 0 的结果为正无穷大。 计算 0/0 或者负数的平方根结果为NaN
PS:Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY 和 Double.NaN(以及相应的Float类型常量)分别表示这个三个特殊的值
不能用以下方式检测一个特定结果是否等于Double.NaN:
if ( x == Double.NaN )
所有的NaN值都认为是不同的。可以用 Double.isNaN 方法来判断:
if ( Double.isNaN(x) )
7.浮点数值不适用于无法接受舍入误差的精确计算。这种舍入误差的主要原因是浮点数采用二进制,而二进制系统中无法精确地表示分数1/10
如果需要精确地计算,不允许有舍入误差,则应该使用 BigDecimal 类
当我们对运算结果是小数的进行判断时,要小心应该是以两个数值的差值的绝对值,在某个精度范围内判断
如果是直接查询得到的小数或者直接赋值,可以判断相等
3.字符类型
1.char类型[2字节]可以表示单个字符。有些Unicode字符可以用一个char值描述,一些Unicode字符则需要两个char值。
2.char类型的字面量值要用单引号括起来。char类型的值可以表示为十六进制值,其范围从 \u0000 ~ \uFFFF
3.Java中还允许使用转义字符 '\' 来将其后的字符转变为特殊字符型常量。Unicode 转义序列会在解析代码之前处理。
4.在Java中,char的本质是一个整数,在输出时,是Unicode码对应的字符。
5.可以直接给char赋一个整数,然后输出时,会按照对应的Unicode字符输出
6.char类型可以进行运算,相当于一个整数,因为其有对应的Unicode码
PS:字符类型本质探讨
1.字符型存储到计算机中,需要将字符对应的码值(整数)找出来
存储:'a' ==> 码值 97 ==> 二进制 ==> 存储
读取:二进制 ==> 97 ==> 'a' ==> 显示
2.字符和码值的对应关系是通过字符编码表决定的
- ASCII(ASCII编码表 一个字节表示,一共128个字符,实际上一个字节可以表示256个字符,只用128个)
ASCII码一共规定了128个字符的编码,只占用了一个字节的后面7位,最前面一位统一规定为0
缺点:不能表示所有字符 - Unicode(Unicode编码表 固定大小的编码 使用两个字节来表示字符,字母和汉字统一都是占用两个字节,这样浪费空间)
Unicode将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,使用Unicode没有乱码问题
缺点:一个英文字母和一个汉字都占用2个字节,这对于存储空间来说是浪费
2的16次方为 65536,编码最多为65536个字符
编码 0-127 的字符是与ASCII的编码一样,所以Unicode码兼容ASCII码 - utf-8(编码表,大小可变的编码表 字母使用1个字节,汉字使用3个字节)
UTF-8 是在互联网上使用最广的一种 Unicode 的实现方式
UTF-8 是一种变长的编码方式。它可以使用 1- 6 个字节表示一个符号,根据不同的符号而变化字节长度 - gbk(可以表示汉字,而且范围广,字母使用1个字节,汉字2个字节)
- gb2312(可以表示汉字,gb2312 < gbk)
- big5 码(繁体中文,台湾,香港)
4.布尔类型
1.布尔类型也叫boolean类型,boolean类型数据只允许取值true和false,无null。boolean类型占1字节。
2.boolean类型适用于逻辑运算,一般用于程序流程控制
- if条件控制语句
- while循环控制语句
- do-while循环控制语句
- for循环控制语句
3.在Java中,整形值和布尔值之间不能进行相互转换。不可以用0或非0的整数替代false和true。
5.自动类型转换
自动类型转换:当Java程序在进行赋值或者运算时,精度小的类型会自动转为精度大的类型
数据类型转换规则
黑色箭头,无信息丢失的转换
绿色箭头,可能有精度损失的转换
1.自动类型转换使用细节:
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
当用一个二元运算符连接两个值时(列如 n+f,n为整数,f为浮点数),先将两个操作数转为同一类型 - 当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之会进行自动类型转换
- (byte,short)和char之间不会相互自动转换
当把数值赋值给byte时,先判断该数是否在byte范围内,如果是就可以进行赋值
在使用变量赋值对目标时,要先判断变量类型是否可以转换到目标类型
-
byte b1 = 10; //对,byte取值范围为 -128 ~ 127
- byte a1 = 1000; //错,byte取值范围为 -128 ~ 127
- int n2 =1; //对
- byte b2 = n2; //错,变量赋值要判断其类型,n2为int型
- char c1 = b1; //错,byte不能自动转为char型
-
- byte,short,char 三者可以进行计算,在计算时首先转换为int型
- short s2 = b1 + s1; //错,b1 + s1 ==> int + int = int,而s2为short
- byte b3 = b1 + b2; //错,b1 + b2 ==> int + int = int,而b3为byte
- int t1 = b1 + s1; //对
- boolean不参与转换
- 自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
6.强制类型转换
强制类型转换是自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。语法格式为:[强制转换符-圆括号]() + 变量名 例如:double n =9.99; int x = (int) n;
1.强制类型转换会造成信息损失——精度降低或溢出
2.强制类型转换通过截断小数部分将浮点值转换为整型
如果想用舍入(round)一个浮点数来得到最接近的整数,可以使用 Math.round 方法
PS:在调用round时,仍需要使用强制类型转换(int)。原因是 round 方法的返回值类型是 long 类型。
3.如果试图将一个数从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会阶段成一个完全不同的值。 例如:(byte) 实际上会得到 44
4.强制转换符只针对最近的操作数有效,往往会使用小括号提升优先级
int x = (int)10 * 3.5 + 6 * 1.5; //错
int x = (int)(10 * 3.5 + 6 * 1.5); //对
5.char类型可以保存int的常量值,但不能保存int的变量值,需要强制转换
char c1 = 100; //对
int x = 10; //对
char c2 = x; //错
char c3 = (char)x; //对
6.byte,short,char 类型在计算时当做int类型处理
7.基本数据类型和String类型转换
1.基本数据类型转String类型
语法:将基本类型的值+"" 即可
2.String类型转基本数据类型
语法:通过基本类型的包装类调用parseXX方法 即可
整型(int)—— Integer.parseInt()
长整型(long)—— Long.parseLong()
短整型(short)—— Short.parseShort()
字节(byte)—— Byte.parseByte()
单精度(float)—— Float.parseFloat()
双精度(double)—— Double.parseDouble()
布尔类型(boolean)—— Boolean.parseBoolean()
3.在将String类型转成基本数据类型时,要确保String类型能够转成有效的数据。
可以将"123" ——> 123整数,但是不可以把"Hellow"转成一个整数
4.如果格式处理不正确,会抛出异常,程序会终止
8.+号的使用
1.当+左右都是数值型时,做加法运算
2.当+左右有一方为字符串,做拼接运算
3.运算顺序为从左到右
参考资料:
JAVA核心技术卷I
bilibili韩顺平:https://space.bilibili.com/651245581
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?