前言:变量命名规则:
- 变量必须以字母、"_"或"$"开头
- 变量可以包含数字,不能以数字开头
- 除了"_"或"$",变量名不能包含其它特殊字符
- Java区分大小写
- 变量的作用域即变量的有效范围,是程序的一个区域,变量在其作用域内可访问.
- 作用域也决定系统什么时候为变量创建和清除内存.
根据变量在程序中声明的位置,可分为成员变量和局部变量
成员变量
- 成员变量定义在类中,成员变量的作用域在类的范围内
- 可以添加修饰符(public,private,protected,static,final,native)
- 如果没有赋初值,则初值由相应数据类型的默认值决定
- 存放在内存共享区:Java堆
局部变量及方法参数
- 可以定义在方法体中/语句块中/参数列表中,作用域从变量定义部分到方法体/语句块结束
- 变量前不能加控制修饰符和static修饰符
- 局部变量在使用前必须明确赋值(因为没有默认值)
- 存放在内存私有区:虚拟机栈
示例:
public class Scope {
public int x; // 类中定义的成员变量,局部变量默认为0;
public void method(int a) {
int x = 8; // 方法中定义的局部变量
int y;
System.out.println("x="+x);// 输出结果为8,本地局部变量将会把成员变量隐藏
System.out.println("x=" +this.x);// 输出结果为0,如果想在本地方法中使用重名变量,使用this
for ( int i=1;i<a;i++) // 语句块内部定义的局部变量
{ x = x+i;
}
// System.out.println(i);// 编译出错,代码块中定义的局部变量,作用域为语句块
// System.out.println(y);// 编译出错,局部变量没有默认值
System.out.println(a);
}
public static void main(String a[]) {
Scope x = new Scope(); // 局部变量x
x.method(6);
}
}
注意:
在用一作用域中 不能定义两个同名变量;
如果成员变量与局部变量同名,局部变量具有更高优先级,同名访问的是局部变量,如果想调用同名成员变量,则使用this.成员变量名
局部变量又可以分为实例变量、类变量
实例变量
- 所属于对象,没有static修饰
- 存放在堆内存中
- 生存周期和对象的生存期相同
访问形式:
- 在本类中直接访问:变量名
- 通过类的一个对象访问 obj.变量名
类变量(静态变量)
- 所属于类,static修饰
- 存放在本地内存区(早期版本为方法区)
- 静态变量的生存期是整个程序运行期
访问形式:
- 在本类中直接访问:变量名
- 通过类名访问:类名.变量名
- 通过类的一个对象访问 obj.变量名
示例:
class test {
static int x=5;
static { x+=10; }
public static void main(String args[ ]) {
System.out.println("x="+x);
}
static { x=x-5; }
}
注:执行结果:x=10-->所有静态初始化在类的装载时就执行
这里也说一下方法也可以分为实例方法,静态方法:
静态方法(类方法)
- 用static修饰的方法
- 在static方法中只能处理类变量,也可以访问其它static方法
- 在static方法中绝不能直接访问任何归属对象空间的变量或方法
解释:因为静态代码块在类加载时就执行了,所以此时有可能对象还未被加载,因此不能引用
实例方法
- 没有static修饰
- 可以处理类变量,实例变量;
- 可以直接访问实例方法,static方法
解释:因为实例方法执行时,静态代码块已经装载,因此实例方法调用没有太高的限制
示例:
public class TEST {
long a[ ] = new long[10];
public static void main ( String arg[ ] ) {
System.out.println ( a[6] );//会出现编译错误
}
}