常量(Constant)
1、定义
所谓常量,就是固定不变的量,其一旦被定义并初始化,它的值就不能再改变。
2、常量声明
在Java语言中,常用关键字final声明常量,语法如下:
// 方法1,推荐使用
final 数据类型 常量名 = 常量值;
// 方法2
final 数据类型 常量名;
常量名 = 常量值;
注
(1)常量名和前面讲到的标识符(标识符、关键字与保留字)的命名规则一样,可由任意顺序的大小写字母、数字、下划线(_)和美元符号($)等组成,标识符不能以数字开头,亦不能是Java中的保留关键字。
(2)常量通常用使用大写字母,单词之间用下划线连接,但这不是硬性要求,仅是一个习惯。
(3)虽然Java中有关键字const,但目前并没有被Java正式启用。
(4)在定义常量时,必须要对其进行初始化,否则会出现编译错误。常量一旦初始化后就不能再改变其值。
(5)final关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰引用数据类型的方法等。
【示例】
public class DefineConstant {
public static void main(String[] args) {
final int YEAR = 365;
System.out.println(YEAR);
}
}
【结果】
如果你想对YEAR进行修改,如下:
public class DefineConstant {
public static void main(String[] args) {
final int YEAR = 365;
System.out.println(YEAR);
YEAR = 366; // 错误, 常量值不能修改
System.out.println(YEAR);
}
}
【结果】
变量
1、定义
在程序运行期间同,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识,这些内存单元称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
2、变量声明
语法如下:
// 方法1
数据类型 变量名 = 变量值;
// 方法2
数据类型 变量名;
变量名 = 变量值;
// 例:
int num = 47;
注
(1)变量都遵循“先声明,后使用”的原则。
(2)变量使用时,可以声明变量的同时进行初始化,也可以先声明后赋值。
(3)变量中每次只能赋一个值,但可以修改多次。
(4)变量名和前面讲到的标识符(标识符、关键字与保留字)的命名规则一样,可由任意顺序的大小写字母、数字、下划线(_)和美元符号($)等组成,标识符不能以数字开头,亦不能是Java中的保留关键字。
(5)变量名的第一个单词首字母小写,从第二个单词开始每
个单词首字母大写。例如:lineNumber、getLineNumber。但这不是硬性要求,仅是一个习惯。
(6)声明变量的作用之一便是指定在内存中分配空间的大小。
3、变量作用域
变量是有作用范围(Scope)的,也即作用域。一旦超出变量的作用域,就无法再使用这个变量。
按作用域范围划分,变量分为成员变量和局部变量。
(1)成员变量
在类体内定义的变量称为成员变量,它的作用域是整个类,也就是说在这个类中都可以访问到定义的这个成员变量。
【例】
public class Demo {
static int i = 47; // 定义一个成员变量,作用域是整个类Demo
public static void main(String[] args) {
System.out.println(i);
}
}
【结果】
(2)局部变量
在一个方法或方法内代码块中定义的变量称为局部变量,局部变量在方法或代码块被执行时创建,在方法或代码块结束时被销毁。局部变量在进行取值前必须被初始化,否则会编译错误。
Java存在块级作用域,在程序中任意大括号包装的代码中定义的变量,它的生命仅仅存在于程序运行该代码块时。例如:for循环、while循环、方法或方法的参数列表里。在循环里声明的变量只要跳出循环,这个变量便不能再使用。同样,方法或方法的参数列表里定义的局部变量,当跳出方法体之外,该变量也不能使用了。
【示例】
public class LocalVar {
public static void main(String[] args) { // main方法参数列表定义的局部变量args
int sum = 0; // main方法体内定义的局部变量sum
for(int i = 1; i < 5; i++) // for循环体内定义的局部变量i
sum += i;
System.out.println(sum);
}
}
【结果】
【结果分析】
在范例中,就有3种定义局部变量的方式。在第3行,在静态方法main参数列表中定义的局部变量args,它的作用范围就是整个main方法体:以3行的左花括号“{”开始,以第8行的“} ”结束。
在第4行,在main方法体内,定义了局部变量sum。它的作用范围从当前行(4行)到以第8行的“}”为止。
在第5行,把局部变量i声明在for循环里,它的有效范围仅在for循环内(5~6行),只要一离开这个循环,变量i便无法使用。
相对而言,变量sum的有效作用范围从第4行开始,到第8行结束,for循环也属于变量sum的有效范围,因此sum在for循环内也是可用的。
【局部变量在块作用域的应用】
public class LocalVar {
static int x = 10;
public static void main(String[] args) {
int outer = 1;
{ // 直接用{}来定义块
int inner = 2;
System.out.println("inner = " + inner);
System.out.println("outer = " + outer);
}
int inner = 3;
System.out.println("inner = " + inner);
System.out.println("outer = " + outer);
System.out.println("In class lecer, x = " + x);
}
}
【结果】
注:块作用域除了用for等循环或方法体的左右大括号来界定外,还可以直接用大括号{}来定义“块”。
【变量块作用域的嵌套】
- Java中作用范围是禁止嵌套的,而在C/C++中则是允许的。
在Java中,在方法(函数)内定义的变量,其作用范围(包括方法的参数)是从它定义的地方开始,到它所作用范围终结的位置处结束。如在方法的开始处定义了一个变量i,那么直到该方法结束处,都不能再定义另一个同名变量i。再如,如果在一个for循环体中定义了变量i,那么在这个for循环内不能再有同名变量,但出了for循环之后,是可以再次定义的。这就是作用域不能嵌套的意思。
而在C/C++中,作用域可以嵌套,甚至无限制地嵌套下去,这里每对大括号之间就是一个独立的作用域,内嵌套的同名变量覆盖外迁套的同名变量。如下表所示。
- Java中类与方法中变量作用域可以嵌套
在Java中,类与方法之间作用域是可以嵌套的,可以把整个类看做一个大的作用域,它定义的字段(或称数据成员)可被方法中的同名字段所屏蔽,其行为类似于上表左侧所示的C/C++的作用域嵌套。如下:
public class LocalVar {
static int x = 10;
public static void main(String[] args) {
int x = 20;
System.out.println(x); // 局部变量覆盖成员变量
}
}
【结果】