一般来说,所有的程序设计语言都需要定义常量(Constant)。所谓常量,就是固定不变的量,其一旦被定义并赋初值后,它的值就不能再被改变。
1.声明常量
在Java语言中,主要是利用关键字final来进行定义常量的,声明常量的语法为:
final 数据类型 常量名称 [=值];
常量名称通常使用大写字母,但不是硬性要求,仅仅是编码习惯。值得注意的是,虽然Java中有关键字const,但目前并没有被Java正式启用。const是C++中定义常量的关键字。
常量标识符和变量标识符规定一样,可由任意顺序的大小写字母、数字、下划线( _ )和美元符号( $ )等组成,标识符不能以数字开头,也不能是Java中的保留关键字。
此外,在定义常量时,需注意如下两点:
(1)必须要在常量声明时对其进行初始化,否则会出现编译错误。常量一旦初始化后,就无法再次对这个常量进行赋值。
(2)final 关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰 “ 对象引用 ” 或者方法。
2.常量示例(加粗字体为定义常量)
行数 | 代码 |
01 | //在Java中定义常量 |
02 | public class Test |
03 | { |
04 | static final int HOUR = 24;//定义一个静态常量 |
05 | public static void main(String[] args) |
06 | { |
07 | System.out.println("一天有:" + HOUR + "个小时"); |
08 | } |
09 | } |
注意:static final int HOUR = 24;这句中的static是Java的关键字。只有加了static才能被main函数引用。
变量是利用声明的方式,将内存中的某个内存块保留下来以供程序使用,其内的值是可变的。可声明的变量数据类型有整型(int)、字符型(char)、浮点型(float或double),也可以是其他的数据类型(如自定义的数据类型——类)。在英语中,数据类型的“type”和类的“class”本身就是一组同义词,所以二者在地位上是对等的。
1.声明变量
声明变量有两个作用。
(1)指定在内存中分配空间大小。
变量在声明时,可以同时给予初始化(即赋予初始值)。
(2)规定这个变量所能接受的运算。
例如:整数数据类型int只能接受加、减、乘、除(+,-,*,/)等运算符。
其实在本质上,“类”就是在诸如整型、浮点型等基本数据“不够用”时,用户自定义的一种数据类型(User—Difined Type,UDT)。正是有了类型的区分,各个不同类型的变量就可以根据其类型所规定的操作范围“各司其职”。
因此,任何一个变量在声明时必须给予它一个类型,而在相同的作用范围内,变量还必须有个独一无二的名称。
注意:变量的值永远以最后更新的值为准。
扩展:声明一个变量时,编译程序会在内存里开辟一块足以容纳此变量的内存空间给它。不管该变量的值如何改变,都永远使用相同的内存空间。常量是不同于变量的一种类型,它的值是固定的,通常给变量赋值时,会将常量赋值给变量。
2.变量的命名规则
变量也是一种标识符,所以它也遵循标识符的命名规则。规则如下:
命名规则 |
(1)变量名可由任意顺序的大小写字母、数字、下划线( _ )和美元符号( $ )等组成。 |
(2)变量名不能以数字开头。 |
(3)变量名不能是Java中的保留关键字。 |
3.变量的作用范围
变量是有作用范围(Scope)的,作用范围有时也称作用域。一旦超出变量的作用范围,就无法再使用这个变量。
按作用范围进行划分,变量分为成员变量和局部变量。
(1)成员变量(加粗字体为定义的成员变量)
在类体重定义的变量为成员变量。它的作用范围为整个类,也就是说在这个类中都可以访问到定义的这个成员变量。
行号 | 代码 |
01 | //定义类中的成员变量 |
02 | public class Test |
03 | { |
04 | static int num = 1; //定义一个成员变量 |
05 | public staitc void main(String[] args) |
06 | { |
07 | System.out.println("成员变量num的值是:" + num); |
08 | } |
09 | } |
(2)局部变量(加粗字体为定义的局部变量)
在一个函数(或称方法)或函数内代码块(code block)中定义的变量称为局部变量,局部变量在函数或代码块被执行时创建,在函数或代码块结束时被销毁。局部变量在进行取值操作前必须被初始化或赋值操作,否则会出现编译错误。
Java存在块级作用域,在程序中任意大括号包装的代码块中定义的变量,它的生命仅仅存在于程序运行改代码块时。当跳出方法体(method body)之外,该变量就不能被使用了。
行号 | 代码 |
01 | //定义类中的局部变量 |
02 | public class Test |
03 | { |
04 | //局部变量声明在方法体内! |
05 | public staitc void main(String[] args) |
06 | { |
07 | for(int i = 0; i<=10; i++) |
08 | { |
09 | int num = 0; |
10 | num = num + i; |
11 | System.out.println("i = " + i + ",sum = " + sum); |
12 | } |
13 | } |
14 | } |
块(block)作用范围除了用for(while)循环或方法体的左右花括号{ }来界定外,还可以直接用花括号{ }来定义“块”,也就是说,出了这个“块”,它的生命周期就终结了。
一般来说,所有变量都遵循“先声明,后使用”的原则。这是因为变量只有“先声明”,它才能在内存中“存在”,之后才能被其他方法所“感知”并使用,但是存在于类中成员变量(不再任何方法内),它们的作用范围是整个类范围(class level),在编译器的“内部协调”下,变量只要作为类中的数据成员被声明了,就可以在类内部的任何地方使用,无需满足“先声明,后使用”的原则。
1.Java中作用范围是禁止嵌套的,而在C/C++中则是允许的。
在Java中,在方法(函数)内定义的变量,其作用范围(包括方法的参数)是从它定义的地方开始,到它所作用范围终结的位置处结束。例如:在一个for循环体中定义了变量 i ,那么在这个 for 循环内不能再有同名变量,但出了 for 循环之后,是可以再次定义的。这就是作用域不能嵌套的意思。
而在C/C++中,作用域可以嵌套,甚至无限制地嵌套下去,这里每对大括号之间就是一个独立的作用域,内嵌套的同名变量覆盖外嵌套的同名变量。
如下所示:
C/C++语法允许作用域嵌套 | Java语法不允许作用域嵌套 |
Fun() | Fun() |
{ | { |
int num = 1; | int num = 1; |
{ | { |
int num = 2; | int num = 2; |
//正确输出num = 2,内嵌套的局部变量优先 | //编译错误:和{ }外的变量num的作用域重叠 |
cout<<" i= "< | System.out.println(" i= " + i); |
} | } |
} | } |
2.Java中类与方法中变量作用域可以嵌套
在Java中,类与方法之间作用域是可以嵌套的,可以把整个类看做一个大的作用域,它定义的字段(或称数据成员)可被方法中的同名字段所屏蔽,其行为类似于上表左侧的C/C++的作用域嵌套。
如下所示:
行号 | 代码 |
01 | public class Test |
02 | { |
03 | public staitc void main(String[] args) |
04 | { |
05 | int x = 1; |
06 | System.out.println("x=" + x); |
07 | } |
08 | private int x; |
09 | } |
第05行所定义的 x ,作为类 Test 的数据成员,它的作用域是整个类,即从第 02 行到第 08 行之间,这个范围包括了第 03 行到第 07 行,而这个区域内的 main 方法,其内部也定义了一个名为 x 的变量,在这个范围内,第 08 行定义的变量 x 被第 05 行定义的变量 x 所覆盖。
不要将心情的起伏带到学习或工作当中!加油,Java!