企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# Java常量与变量 [TOC] ## 导学 要想要编写规范、可读性高的 Java 程序,就必须对 Java 基本语法有所了解。基本语法是所有编程语言都必须掌握的基础知识,也是整个程序代码不可缺少的重要部分。 一个 Java 程序通常由数据类型、变量、运算符和流程控制语句4部分组成。其中数据类型和运算符不仅定义了语言的规范,还决定了可以执行什么样的操作,变量是用来存储指定类型的数据,其值在程序运行期间是可变的;与变量对应的是常量,其值是固定的。 在之前的课程中,我们提到Java的学习,其实和英语等外语的学习并没有什么差别。那么我们今天就要来学习一下Java中特殊字符及其作用。 ## 标识符 Java 中标识符是为方法、变量或者其他用户定义项定义的名称。**标识符用来对变量、常量、类和方法等进行命名。因此,一个良好的编程习惯要求命名标识符时,应赋予它一个有意义或有用途的名字。** 标识符可以有一个或多个字符。在 Java 语言中,标识符的构成规则如下: * **标识符由数字(0~9)、美元符号($)、下划线(\_)以及Unicode字符集组合构成。** * **标识符各符号之间没有空格。** * **标识符第一个字符不能为数字。** * **标识符不能为关键字和保留字。** * **标识符的命名最好能反映其作用** 例如以下为合法与不合法标识符: * 合法标识符:hello、Hello、$hello2019、\_hello 等。 * 不合法标识符:123c、2com、for、if。 >[danger] 注意:Java 区分大小写,因此 hello 和 Hello 是两个不同的标识符。 > 注意:Java中的标识符也包括关键字 ## 关键字 Java 的关键字对 Java 编译器有特殊的意义,它们用来表示一种数据类型,或者表示程序的结构等。保留字是为 Java 预留的关键字,它们虽然现在没有作为关键字,但在以后的升级版本中有可能作为关键字。 Java 语言目前定义了 51 个关键字,这些关键字不能作为变量名、类名和方法名来使用。 >[info] 数据类型:boolean、int、long、short、byte、float、double、char、class、interface >[warning] 流程控制:if、else、do、while、for、switch、case、default、break、continue、return、try、catch、finally >[info] 修饰符:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native >[warning] 动作:package、import、throw、throws、extends、implments、this、super、instanceof、new >[info] 保留字:true、false、null、goto、const **对于关键字的记忆,大家没有必要死记硬背,而是靠大家在日常的学习中不断的积累** ## 注释 注释是对程序语言的说明,有助于开发者和用户之间的交流,方便理解程序。**注释不是编程语句**,因此编译器忽略。 Java 支持以下三种注释方式: * 单行注释:以双斜杠“//”标识,只能注释一行内容,用在注释信息内容少的地方。 ~~~ public class Test { public static void main(String[] args) { // 这是单行注释 System.out.println("单行注释"); } } ~~~ * 多行注释:包含在“/\*”和“\*/”之间,能注释很多行的内容。 ~~~ public class Test { public static void main(String[] args) { /* * 这是第一行注释 * 这是第二行注释 */ System.out.println("多行注释"); } } ~~~ * 文档注释:包含在“/\*\*”和“\*/”之间,也能注释多行内容,一般用在类、方法和变量上面,用来描述其作用。 ~~~ /** * 这里是文档注释 * @auther dodoke */ public class Test { public static void main(String[] args) { System.out.println("文档注释"); } } ~~~ ## 变量 在之前的学习中,我们学习过JavaScript的变量。但是要**注意区分Java中变量和js中变量的区别**。 ### 什么是变量 在程序的开发过程中,我们经常要对一些数据进行处理,比如一些数学运算,我们要对一些中间的结果进行存储,就需要设置一个新的数来存储该结果。比如例如一个简单的方程,x,y 都是变量,他们的值都是1,求x+y,那么我们就需要一个新的代表来表示最终的结果,比如z=x+y。z就是我们新设置的变量。 由此可知,变量就是初中数学的代数的概念,用来代表一个数据。 >[warning]变量的三个元素:变量类型 变量名 = 变量值 ![](https://img.kancloud.cn/02/58/02584ed6ff2be235b3c84e42f502246c_960x308.png) ### 变量的命名规则 需要注意的是,刚刚我们提到标识符可以用来对变量进行命名,所以变量名也是一个标识符。 所以变量名需要进行满足如下的命名规则: 1. 满足标识符的命名规则 2. 符合驼峰法命名规范 3. 尽量简单,做到见名如意 4. 变量名的长度没有限制,但尽量做到第三条 ### 变量的声明与赋值 在 Java 中,变量分为两种:基本类型变量和引用类型变量。本节课,我们以讨论基本类型的变量为主。变量必须**先声明后使用**,在声明变量的时候,可以给它一个初始值。例如: ~~~ int x = 1; ~~~ 上述语句声明了一个整型 int 类型的变量,名称为 x,初始值为 1。 变量的一个重要特点是可以重新赋值。例如:对变量 x,先赋值100,在赋值200: ~~~ public class Test { public static void main(String[] args) { int x = 100; // 定义int类型变量x,并赋予初始值100(变量的初始化) System.out.println(x); // 打印该变量的值,观察是否为100 x = 200; // 重新赋值为200 System.out.println(x); // 打印该变量的值,观察是否为200 } } ~~~ 注意到第一次定义变量 x 的时候,需要指定变量类型 int,因此使用语句 int x = 100;。而第二次重新赋值的时候,变量 x 已经存在了,不能再重复定义,因此不能指定变量类型 int,必须使用语句 x = 200;。 ## 数据类型 ![](https://img.kancloud.cn/78/0c/780c92bb1f89db659ad157824e4f585d_930x409.png) 基本数据类型是CPU可以直接进行运算的类型。Java 定义了以下几种基本数据类型: * 整数类型:byte、short、int、long * 浮点数类型:float、double * 字符类型:char * 布尔类型:boolean ### 整型 对于整型类型,Java 只定义了带符号的整型,各种整型能表示的最大范围如下: * byte:-128~127 * short:-32768~32767 * int:-2147483648~2147483647 * long:-9223372036854775808~9223372036854775807 >[info] Java 默认的整数类型是 int,例如,128,11 都是 int 型数值。如果要说明一个 long 类型数值,就需要在其后追加字母 l 或者 L,一般使用 F,如 11L 和 128L 都是 long 类型的数值。 ### 浮点数 浮点类型是带有小数部分的数据类型,也叫实型。浮点型数据包括单精度浮点型(float)和双精度浮点型(double),代表有小数精度要求的数字。 >[info] Java 默认的浮点型为 double,例如,11.11 和 1.2345 都是 double 型数值。如果要说明一个 float 类型数值,就需要在其后追加字母 f 或 F,如 11.11f 和 1.2345F 都是 float 类型的常数。 ### 布尔型 布尔类型(boolean)用于对两个数值通过逻辑运算,判断结果是“真”还是“假”。Java 中用保留字 true 和 false 来代表逻辑运算中的“真”和“假”。因此,一个 boolean 类型的变量或表达式只能是取 true 和 false 这两个值中的一个。 ### 字符型 Java 语言中的字符类型(char)使用两个字节的 Unicode 编码表示,它支持世界上所有语言,可以使用**单引号字符**或者**整数**对 char 型赋值。 一般计算机语言使用 ASCII 编码,用一个字节表示一个字符。ASCII 码是 Unicode 码的一个子集,用 Unicode 表示 ASCII 码时,其高字节为 0,它是其前 255 个字符。 Unicode 字符通常用十六进制表示。例如“\\u0000”~“\\u00ff”表示 ASCII 码集。“\\u”表示转义字符,它用来表示其后 4 个十六进制数字是 Unicode 码。 ~~~ public static void main(String[] args) { char a = 'a'; char b = 98; char c = '\u0063'; } ~~~ ### 基本数据类型变量在内存中的存储 变量按照数据类型可以分为基本数据类型和引用数据类型,引用数据类型的包括数组和类等,类定义的变量又称之为对象。 如果按照作用范围来分,则可以分为类级,对象实例级,方法级,块级。本节课程重点介绍方法级的变量如何在内存中进行存储,方法级变量又称之为局部变量。 通常我们可以把内存分为三个区域: ![](https://img.kancloud.cn/69/34/6934e7437d67cc69615bb67633ba32ba_708x432.png) 当前我们在主方法中存储的局部变量是存储在内存的栈区的。 ~~~ int n = 100; //该语句执行的时候,会先在栈区开辟int类型大小的空间(占用4字节,32位二进制的空间) //在开辟完成后,通过赋值等于号,将100存储到开辟的空间中去 //所以此处可以将n,看做100所在的内存空间的别名 ~~~ ### 补充:Unicode编码 在之前的字符型变量的学习中,我们了解到了ASCII码,他也称之为美国标准信息交换代码,用于规定拉丁字母的标准计算机编码,主要用于显示现代英语和其它西欧语言,但是对于中文和其他一些语言是不支持的。为了支持其他语言,所以出现了Unicode编码。 Unicode编码又称为统一码,万国码。其目标是支持世界上所有的字符集。 ## 字符串的简单介绍 字符串比较特殊,**它不属于基本数据类型,它是类!** 但是字符串又比较特殊,它有一些和基本数据类型比较类似的地方,比如它变量的定义形式。 ~~~ String str = "Hello,World!"; ~~~ 字符串是由双引号引起来的0个或多个字符,**注意:字符串允许是空字符串!** ## 类型转换 ### 类型装换 类型转换分为自动类型转换和强制类型转换。 * **自动类型转换** 把某种基本数据类型的值,直接赋值给其他基本数据类型的值 > 如果把范围小的数据,赋值给范围大的数据时,不会出现精度的缺失;反之,则可能会出现精度的缺失。 ![](https://img.kancloud.cn/64/68/6468fdcef349c2c3372fc5244297dcd8_821x398.png) ~~~Java //示例 class Client1 { public static void main(String[] args) { int i = 100; double di = i; //int a = di; System.out.println(di); } } ~~~ 注意: >[danger] 1.上方代码左边转为右边的数据类型是没有问题的; > 2.当把任何基本数据和字符串,进行连接运算的时候,基本数据类型将自动转换为字符串类型。 * **强制数据类型转换** 如果需要把上方代码中的右边,转换为左边时,则成为强制类型转换。 语法:`(targetType)value` 强制类型转换时,需加上()运算符。 **强制类型转换也许会出现精度的缺失或溢出的情况。** ~~~ 示例: int i = 150; byte b = (byte)i; System.out.println(b); int i2 = 100; byte b2 = (byte)i2; System.out.println(b2); String s = "56"; int si = Integer.parseInt(s); System.out.println(si); ~~~ **如果希望把String类型的数据,强制转为基本数据类型,可以使用基本数据对应的包装类实现。** ### 表达式的自动提升 当一个表达式中包含多个基本数据类型的值时,整个算术表达式的数据类型将发生自动提升。 提升规则: 所有的byte/short/char类型将被提升到int; 整个算术表达式的数据类型,将被提升到与表达中最高等级操作数相同的类型。 ~~~ 示例: char t1 = 'a'; short t2 = 100; int t3 = 45; double t4 = 10.5; System.out.println(t1 + t2 + t3 + t4); ~~~ **如果表达式包含字符串,应当把+号,当做字符串连接运算符,而不是加法运算符。** ## 常量 常量是指在程序的整个运行过程中值保持不变的量。在这里要注意常量和常量值是不同的概念,常量值是常量的具体和直观的表现形式,常量是形式化的表现。 * 常量值:常量值又称为字面常量,它是通过数据直接表示的。 * 整型常量值 * 十进制数:如 11、45等; * 二进制数:二进制常数的表示以 0b 开头,如 0b00001010 表示十进制 10。 * 八进制数:八进制常数的表示以 0 开头,如 0125 表示十进制数 85。 * 十六进制数:十六进制常数的表示以 0x 或者 0X 开头,如0x100 表示十进制数 256。 * 浮点型常量值 * 十进制数:由数字和小数点组成,且必须有小数点,如 12.34、98.0。 * 科学计数法:如 1.75e5、32E3,其中 e 或者 E 之前必须有数字,且 e 或 E 之后的数字必须为整数。 * 布尔型常量值:布尔型常量只有两个值,即 false(假)和 true(真)。 * 字符型常量 * 单引号字符:使用单引号引起来的一个字符或者一串转义字符,如 'a','\\u62' 都表示字符a。 * 数值:使用数值来表示,如 65 表示字符 A,97 表示字符 a。 * 常量:常量不同于常量值,它可以在程序中用标识符来代替常量值使用,因此使用前必须先定义。 * 使用 final 关键字来定义常量。 * 声明常量的同时要赋予一个初始值。 * 常量一旦初始化就不可以被修改。 * 为了与变量区别,常量声明一般都用大写字符。 ~~~ final double PI = 3.14159265; ~~~ ## 练习 一、选择 1. 下列属于合法的 Java 标识符是?(多选) ~~~ A. $value B. Void C. class D. 1abc E. my value F.void_class ~~~ 2. 下列哪一个选项不是Java的关键字? ~~~ A. class B. package C. Void D. static ~~~ 3. 下列可以表示数值型数据的数据类型是?(多选) ~~~ A. byte B. float C. boolean D. long ~~~ 4. 关于数据类型的说法错误的是? ~~~ A. 数据类型分为基本数据类型和引用数据类型 B. 数组属于基本数据类型 C. 类属于引用数据类型 D. int和double属于基本数据类型 ~~~ 5. 下列关于赋值运算符的说法正确的是?(多选) ~~~ A. 使用“=”给变量进行赋值 B. 使用“==”给变量进行赋值 C. "="叫作赋值运算符,将运算符右边的值赋给左边的变量 D. "="叫作赋值运算符,将运算符左边的值赋给右边的变量 ~~~ 6. 以下对double类型字面值的表示错误的是? ~~~ A. 1.23 B. 1.23d C. 1.23D D.1.23f ~~~ 7. 以下语句哪个是错误的? ~~~ A. double d=12.3d; B. double d=12.3D; C. float f=1.23f; D.float f=1.23; ~~~ 8. 下面代码运行后的结果为? ![](https://img.kancloud.cn/10/d6/10d6a593eb8f1f8ea473126e218b4200_448x208.png) ~~~ A. A B. 65 C. A 65 D.A A ~~~ 9. 以下字符型字面值中,不合法的是? ~~~ A. '@' B. '&' C. "M" D.'课' ~~~ 10. 以下哪两个是合法的字符串字面值?(多选) ~~~ A. "" B. 'ab' C. 'a' D."\u0067" ~~~ 11. 以下哪两条语句是正确的?(多选) ~~~ A. char ch=65539; B. int n=5.6f; C. double d=1.2f; D. double d=1.23;float f=(float)d; ~~~ 二、编程 1. 分别定义float、double、int类型的数据,并打印输出。 ~~~ public class FloatDemo { public static void main(String[] args) { // 定义一个float类型的变量f1,值为98.4 //定义一个float类型的变量f2,将f1的值赋值给f2 //定义一个整型变量n,值为55 //定义一个double类型的变量d1,值为555.3 //将n的值赋值给d1 } } ~~~ 2. 定义字符型变量,赋值后输出。 ~~~ public class CharTest { public static void main(String[] args) { // 定义字符变量c,并赋值为'S' //输出c的值 //定义字符变量c1,并赋值为78 //输出c1的值 } } ~~~ 3. 定义布尔类型和字符串类型的变量,为它们赋值,并打印输出。 ~~~ public class StringDemo { public static void main(String[] args) { // 定义一个布尔类型的变量flag,赋值为true,并输出 //定义一个字符串类型的变量str,值为"hello world",并输出 //定义一个字符串类型的变量str1,值为空串 //将str的值赋值给str1,并输出 } } ~~~ 4. 定义各种数据类型的变量,为它们赋值,并打印输出。 ~~~ public class TypeExchange { public static void main(String[] args) { // 定义一个整型变量n,值为98 //定义一个char类型的变量ch,将变量n赋值给ch,然后输出ch的值 //定义一个长整型变量var,值为190000000,并输出 //定义一个double类型的变量d,将变量var的值赋值给d } } ~~~ 5. 定义各种数据类型的变量,按要求为它们赋值,并打印输出。 ~~~ public class TypeExchange { public static void main(String[] args) { // 将一个整型字面值67832赋值给char类型变量c //并将c的值输出 //定义一个整型变量n,值为65 //定义一个字符型变量c1,赋值为n,并输出c1的值 //定义一个长整型变量l,值为987654321 //定义一个整型变量i,赋值为l,并输出i的值 //定义一个float类型变量f,将变量l的值赋值给f,并输出f的值 //将float的值f,重新赋值给变量l,并输出l的值 } } ~~~