概述
简单的说,变量就是一个与可更改的值相关联的一个名字或名称,比如int i = 0;
这是声明一个名称为 i
的变量,并且与之关联的值是0
,int
则是变量的数据类类型,表示这个i
变量可以关联一个整数值,或者说赋值一个整数。
声明变量
声明一个变量的语法格式如下:[修饰符] 数据类型 变量名 [ = 初始值] [,变量名 [ = 初始值]…];
Tip:[] 中为可选项,因为在 Java 中可以先声明变量,之后在赋值。
- 我们可以只声明变量,然后再给变量赋值。如:
int num;
…num = 1;
,数据类型我们后面会详细介绍,现在只需要知道num
就赋值一个int
(正数值)类型的值,并在之后的代码中把变量num
赋值为1
。 - 也可以声明变量的同时并给变量赋值。如:
char ch = 'A';
声明字符变量ch
,并把变量ch
赋值为'A'
,或者说把'A'
赋值给变量ch
。
标识符
变量命名、类的命名都属于标识符,所以就统一介绍标识符的命名规则及使用规范。
标识符的命名规则(必须):
- 标识符必须以字母、下划线(_)、数字或美元($)组成;
- 标识符必须由字母、下划线(_)或美元($)开头,不能由数字开头;
- 标识符不能是关键字或者保留字;
- 标识符中不能有空格;
- 标识符没有长度限制;
- 标识符对大小写敏感。
标识符的使用规范(约定成俗,不是必须但建议):
- 表示类名的标识符:每个单词的首字母大写,如
Book
,JavaBook
- 表示方法和变量的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”,如
read()
,readBook()
表示常量的标识符:全部单词大写,用下划线分隔,如
BASE_URL
,PI
Java 的变量类型
变量根据声明的位置不同可以分为:
局部变量
- 成员变量
- 静态成员变量(类变量)
- 实例成员变量(实例变量)
- 在方法体中声明的变量以及方法的每一个参数变量都是局部变量。
- 在方法体外,类体内声明的变量称为成员变量。
- 成员变量声明时如果使用static关键字修饰的称为静态成员变量(简称静态变量或类变量)
如果没有static关键字修饰则称为实例成员变量(简称实例变量)
实例变量
声明在方法体外,类体之内,没有用
**static**
关键字修饰的变量。
顾名思义,实例变量是属于实例对象的,对于每个实例对象,都拥有自己的实例变量副本,它们互不影响,相互隔离。public class InstanceVariable {
/**
* 成员变量(实例变量) var
*/
String var = "initValue";
/**
* main 方法输出结果
*
* obj1.var:initValue
* obj2.var:initValue
* obj3.var:initValue
* 用 obj2 改变 var 的值
* 再分别访问实例变量
* obj1.var:initValue
* obj2.var:newValue
* obj3.var:initValue
*/
public static void main(String[] args) {
// 创建 3 个对象
InstanceVariable obj1 = new InstanceVariable();
InstanceVariable obj2 = new InstanceVariable();
InstanceVariable obj3 = new InstanceVariable();
// 访问 实例变量 var
System.out.println("obj1.var:" + obj1.var);
System.out.println("obj2.var:" + obj2.var);
System.out.println("obj3.var:" + obj3.var);
System.out.println("用 obj2 改变 var 的值");
obj2.var = "newValue";
System.out.println("再分别访问实例变量");
System.out.println("obj1.var:" + obj1.var);
// 只有 obj2.var 的值改变
System.out.println("obj2.var:" + obj2.var);
System.out.println("obj3.var:" + obj3.var);
//实例变量不能通过类名访问,以下代表会报错,因为实例变量属于实例对象,每个对象都有自己变量副本,互不影响
// System.out.println("StaticVariable.staticVar:" + InstanceVariable.staticVar);
}
}
如上代码所示,创建 3 个对象,并且创建对象时实例变量都被赋值为
initValue
,然后修改对象obj2
的实例变量var
的值为"newValue"
,可以看到其他对象的值不会改变,只会改变对象obj2
的变量值。
所以实例变量属于实例对象,对象直接相互隔离,各对象维护自己的变量副本。静态变量
声明在方法体外,类体之内,并且用
**static**
关键字修饰的变量。
静态变量也可以叫做类变量,静态变量属于类,对于类的每个实例都共享这一个变量。
比如我创建三个类的实例对象去访问一个静态变量,得到的结果是一样的,并且我通过其中一个实例对这个静态变量进行修改,同样会反馈给其他对象。public class StaticVariable {
/**
* 声明一个静态变量 staticVar (静态变量声明 是用 static 关键字修饰变量即可)
*/
static String staticVar = "initValue";
/**
* main 方法输出结果:
*
* obj1.staticVar:initValue
* obj2.staticVar:initValue
* obj3.staticVar:initValue
* 用其中一个对象修改静态变量
* 再分别访问静态变量
* obj1.staticVar:newValue
* obj2.staticVar:newValue
* obj3.staticVar:newValue
* 最后,我们可以直接用类名访问静态变量,如下
* StaticVariable.staticVar:newValue
*/
public static void main(String[] args) {
// 创建 3 个对象
StaticVariable obj1 = new StaticVariable();
StaticVariable obj2 = new StaticVariable();
StaticVariable obj3 = new StaticVariable();
// 访问 静态变量 staticVar (其实不推荐用对象访问静态变量,用 【类名.静态变量名】 方式更好)
System.out.println("obj1.staticVar:" + obj1.staticVar);
System.out.println("obj2.staticVar:" + obj2.staticVar);
System.out.println("obj3.staticVar:" + obj3.staticVar);
System.out.println("用其中一个对象修改静态变量");
obj2.staticVar = "newValue";
System.out.println("再分别访问静态变量");
System.out.println("obj1.staticVar:" + obj1.staticVar);
System.out.println("obj2.staticVar:" + obj2.staticVar);
System.out.println("obj3.staticVar:" + obj3.staticVar);
System.out.println("最后,我们可以直接用类名访问静态变量,如下");
System.out.println("StaticVariable.staticVar:" + StaticVariable.staticVar);
}
}
如上代码所示,无论用什么对象访问静态变量得到的结果是相同的,所以我们访问静态变量是不推荐使用对象访问,直接用
类名.静态变量名
访问,也只有静态变量可以这样用类名访问。局部变量
在类的方法体中声明的以及方法的每一个参数都是局部变量。
它们的作用域仅限与方法中,这意味着出了方法,就无法访问到方法中的局部变量。
以下代码我会声明一个与局部变量名称相同的成员变量,来演示局部变量的作用域。public class LocalVariable {
String var = "成员变量";
void method(){
String var = "方法内变量";
System.out.println(var);
}
/**
* main 方法输出结果:
*
* 调用一下方法,会打印方法里的变量 var :方法内变量
* 打印类的变量 var :成员变量
*/
public static void main(String[] args) {
LocalVariable obj = new LocalVariable();
System.out.print("调用一下方法,会打印方法里的变量 var :");
obj.method();
System.out.println("打印类的变量 var :" + obj.var);
// 可见方法之外访问不到方法内的局部变量,
//但方法内可以访问外部的成员,这会用到 this 关键字,我们留点悬念以后再说
}
}
变量类型一览表
| 局部变量、成员变量、静态变量的区别 | | | | | —- | —- | —- | —- | | 类型 | 声明位置 | 从属于 | 生命周期 | | 局部变量 | 方法或语句块内部 | 方法/语句块 | 从声明位置开始,直到方法或语句块执行完毕,局部变量消失 | | 成员变量
(实例变量) | 类内部,方法外部 | 对象 | 对象创建,成员变量也跟着创建。
对象消失,成员变量也跟着消失; | | 静态变量
(类变量) | 类内部,static修饰 | 类 | 类被加载,静态变量就有效;
类被卸载,静态变量消失。 |
常量
常量通常指的是一个固定的值,例如:1、 2、 3、 ‘a’、 ‘b’、 true、 false、 “helloWorld” 等。
在Java语言中,利用关键字 final
修饰变量来定义一个常量。
常量一旦被初始化后不能再更改其值。