曾和儿子分享过所谓计算机程序,都是编写代码进行“数据处理和处理数据”而已。任何编程语言编写何种应用,数据都必须以某种方式表示。掌握变量和常量的用法,可以使代码的可维护性、可读性大大提高。
一、常量
常量就是在程序中固定不变的量,一旦被定义,它的值就不能再被改变。
1、声明常量
在定义常量时需要对常量进行初始化,初始化后,常量的值是不允许再进行改变的。在Java语言中,为了区别常量与变量,常量名称通常用大写字母。声明常量使用final关键字,语法为:
final 数据类型 常量名称 [= 初始化的值 ]
2、常量应用示例
当常量用于一个类的成员变量时,必须给常量赋值,否则会出现编译错误。
如下代码示例,在类中声明一个常量PRICE,并在main()方法中打印它的值。
public class Zoo {
static final float PRICE = 2.5F;
public static void main(String[] args) {
System.out.println("动物园门票价格是:" + PRICE + "元。");
}
}
上面代码中,定义了常量PRICE,并赋给初始值,在主函数中打印PRICE的值。
二、变量
在程序中存在大量的数据来代表程序的状态,其中有些数据的值在程序的运行过程中会发生改变,这种数据被成为变量。在程序中通过改变变量的值来实现程序的逻辑功能。
1、声明变量
在Java语言中,所有的变量在使用前必须先声明,声明多个变量时使用逗号隔开(建议每行声明一个变量),分号结尾,基本格式如下:
类型 变量名 [ = value], 变量名 [ = value], 变量名 [ = value] ;
int x,y,z; // 声明3个int类型变量:x,y,z
int a = 3, b = 4, c = 5; // 声明3个整数a、b、c变量并赋初始值
byte z = 22; // 声明并初始化字节型变量z
String s = "Java example"; // 声明并初始化字符串型变量s
double pi = 3.14; // 声明双精度浮点数变量pi,并赋值
char x = 'a' // 声明字符型变量x,并赋值‘a’,使用单引号
一个知识点:
声明一个变量时,编译程序会在内存里开辟一块足以容纳这个变量的内存空间给它。不管变量的值如何改变,都永远使用相同的内存空间。因此,要学会使用变量,它是一种节省内存的方式。常量是不同于变量的一种类型,它的值是固定的,如整数常量、字符串常量。通常给变量赋值时,会将常量赋值给它。
2、变量的分类
变量是有作用范围的,一旦超出它的范围,就再无法使用这个变量(被分配的内存会给回收)。
按照作用范围进行划分,Java中的变量分为成员变量、局部变量和类变量。
1)成员变量
成员变量声明在一个类中,在方法、构造方法和语句块之外。它的作用范围是整个类,也就是在这个类中都可以访问。当一个对象被实例化之后,每个成员变量的值就跟着确定。
成员变量在对象建立的时候创建,在对象被销毁的时候销毁。成员变量可以直接通过变量名访问,但在静态方法以及其它类中,就要通过类的引用访问。
成员变量的值应该至少被一个方法、构造函数或者语句块引用,使得外部能够通过这些方式获取成员变量的信息。
访问修饰符可以修饰成员变量,成员变量对于类中的方法、构造函数或者语句块是可见的。一般情况下应该把成员变量设为私有(private)。通过使用访问修饰符可以使成员变量对子类可见(public,protected)。
成员变量具有默认值,数值型变量的默认值是0,布尔型变量默认值是false,引用类型变量的默认值是null。
成员变量的值可以在声明时指定,也可以在构造方法中指定。如果没有指定,则使用默认值;如果通过上面方式指定(初始化),则对象创建时,默认值是初始值。
public class MemberVar {
private int age; // 声明私有的成员变量,仅在该类中可见
public void setAge(int a) {
age = a;
}
public void printMember() {
System.out.println("我儿子的年龄是:" + age);
}
public static void main(String[] args) {
MemberVar emp = new MemberVar();
emp.setAge(19);
emp.printMember();;
}
}
上面代码声明的成员变量age,使用了private修饰符,它只能在MemberVar类中访问。但是可以在MemberVar类中定义相关方法,通过此类创建的对象来访问。
2)局部变量
局部变量是在方法、构造函数或者语句块中声明,它们在所在方法、构造方法、语句块被执行的时候创建,当该方法、构造方法、语句块执行完毕后,变量将会被销毁。访问修饰符不能用于局部变量,局部变量只在声明它的方法、构造方法、语句块中可见。
系统不会给局部变量没有默认值,所以局部变量被声明后,必须经过初始化进行赋值后才能使用,否则会出现编译错误。
3)类变量(静态变量)
类变量,也称为静态变量,在类中使用static关键字声明,但必须在方法、构造方法、语句块之外。无论一个类创建多少个对象,类只拥有静态变量的一份拷贝(只在内存中有一个地址指引)。静态变量的访问格式一般是:
类名.类变量名
类变量和成员变量特别相似,一旦声明(未赋值),会有默认值。数值型变量的默认值是0,布尔型变量默认值是false,引用类型变量的默认值是null。
类变量的值可以在声明时指定,也可以在构造函数中指定(赋值)。除此之外,还可以在静态语句块中初始化(使用static 关键字和{} 中定义的代码块,会在类初次加载时运行)。
在当前类中访问类变量(静态成员变量)可以不加类名直接访问,也可以使用“类名.静态成员变量名)方式访问。但是其它类想要访问静态变量,必须使用“类名.静态变量名”来引用。
3、Java中静态变量(类变量)和成员变量的区别
Java中静态变量(类变量)和成员变量的区别是否被static关键字修饰,被static关键字修饰的叫静态变量(类变量),否则即成员变量。两者的区别是:
(1)静态变量在内存中只有一份拷贝(节省内存),JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配及初始化默认值,可以通过类名直接访问。
(2)成员变量是每创建一个对象,就会为成员变量分配一次内存。创建多个对象,成员变量就有多个拷贝,互不影响。成员变量属于每个对象,而静态变量属于这个类创建的所有对象共享。
public class QuBieVar {
private static int staticInt = 0; // 定义静态变量,并赋值0
private int random = 0; // 定义成员变量,并赋值0
public QuBieVar() { // 构造方法中初始花静态变量和成员变量
staticInt++; // 静态变量自加1
random++; // 成员变量自加1
System.out.println("静态变量staticInt的值:" + QuBieVar.staticInt);
System.out.println("成员变量random的值:" + random);
System.out.println("");
}
public static void main(String[] args) {
QuBieVar test1 = new QuBieVar();
QuBieVar test2 = new QuBieVar();
}
}
运行上面代码的结果是:
静态变量staticInt的值:1
成员变量random的值:1
静态变量staticInt的值:2
成员变量random的值:1
在上面代码中,无论创建多少个类QuBieVar的对象,永远都只分配一个staticInt变量,所有对象都共享这个变量(对应的同一个内存地址),所有对象修改这个静态变量,都将发生变化;但是创建的任何类的对象,都会分配一个专属的成员变量random,互不影响,因为被分配在不同的内存,有不同的内存指引。