1、常量和变量的定义
不管是常量还是变量,都是储存数据的,都会存在内存中的一块存储区域;
常量:它所代表的这个内存区域里的值,是在运行期间不能改变的;
变量:它所代表的这个内存区域里的值,是在运行期间可以改变的;
2、常量的分类
1)字面常量:在代码中写死的; <>如例:final int a=10 中的10,即实际值;
2)声明的常量:声明时用到的字符;<>如例:final int a=10 中的a;
3、变量的分类
按数据类型分:
1)基本数据类型的变量:储存的是数据值;
2)引用数据类型的变量:储存的是地址值,指向另一块储存区域;
按声明位置分:
1)成员变量:在类的{}中,在方法、代码块、构造器外面;
成员变量又分两种:
静态变量:用static修饰,随着类的加载而加载,整个类及类的实例都可用;
非静态变量:没有static修饰,随着对象的生成而加载,类的每个实例可用;
2)局部变量:
①在方法的形参列表、方法体{}内;
②构造器的形参列表、构造器{}内;
③代码块内;
注意:在方法、代码块、构造器外都可以声明成员变量,但不能写其他执行语句;
4、成员变量和局部变量的区别
A:静态变量
B:非静态变量
C:局部变量
1)声明位置不同;
2)变量在内存中的分配的位置不同:
A:静态变量:在方法区中;
B:非静态变量:在堆中;
C:局部变量:在栈中;
3)初始化方式不同:
A:静态变量:①在类加载时加载,如果没有显式赋值,则有默认值;
②也可在静态、非静态代码块,构造器、静态、非静态方法、内部类、内部接口中多次赋值;
③重新赋值以后影响全局该变量的值;(图1:静态变量的赋值)
B:非静态变量:①在新建对象前加载,如果没有显式,则有默认值;
②可在非静态代码块,构造器,非静态方法,非静态内部类、非静态内部接口中多次赋值;
③不能在静态代码块、静态方法中赋值;
原因:因为静态随着类加载,不一定会新建对象;
④重新赋值不影响其他对象,自影响该对象;(图2:非静态变量的赋值)
C:局部变量:在方法、构造器、代码块、内部类、内部接口被加载或调用时赋值;如果没有显式赋值会报错,没有默认赋值;(图3:局部变量的赋值)(图4:内部类、内部接口中赋值)
4)生命周期不同:
A:静态变量:随着类加载而加载,和类的生命周期一样长,只要类没被卸载就一直存在;
B:非静态变量:在新建对象之前加载,和对象的生命周期一样长,而且每个对象是独立的;
C:局部变量:随着方法、代码块、构造器的调用而加载,运行结束就回收;每一次方法调
用是独立的,而且不同线程调用也是独立的;
5)作用域不同:
A:静态变量:在整个类、类的实例中都能调用,在一个地方重新赋值会影响这个类及类的实例;
B:非静态变量:在整个类的非静态成员中都能调用,在静态成员中无法调用;在一个实例中重新赋值不影响其他实例中的该非静态变量;
C:局部变量:作用域窄,从声明开始,到方法、代码块、构造器或者一个循环结构中、运行结束;
6)修饰符
A:静态变量:权限修饰符、static、final、...
B:非静态变量:权限修饰符、final、...
C:局部变量:只有一个修饰符:final;默认是不带修饰符的(不是缺省)