1、成员变量定义:【修饰符】 属性类型 属性名 【=属性值】
【修饰符】:成员变量的上一级单元为类,所以修饰符public、protected(父子类访问权限)、private(同一个类的访问权限)、省略的话默认包访问权限
【属性类型】:基本类型、引用类型
【属性名】:第一个单词首字母小写,其他单词首字母大写。
a.类成员变量(static修饰的成员变量)
生命周期:类准备阶段开始存在,直到系统完全销毁这个类(也就是说这个变量是类的全局变量,对象访问此变量时互相影响)。
内存分配:分配在堆,并且只分配一块内存块,由垃圾回收器来控制回收。
初始化:加载类时默认初始化,也可以通过静态初始化块或定义处显式初始化。
调用方式:类名.变量、实例.变量(实际上还是调用类的成员变量,这样导致降低可读性,不建议使用)
final(不可变)修饰符:必须在静态初始化块或变量定义处显式初始化,否则出错。
b.实例成员变量(非static修饰的成员变量)
内存分配:分配在堆,并且不同的对象分配不同的内存块,由垃圾回收器来控制回收。
初始化:创建对象时默认初始化,也可以通过普通初始化块或定义出或构造方法进行显式初始化。
调用方式:实例.变量
final(不可变)修饰符:必须在普通初始化块或变量定义处或构造方法中显式初始化,并且只能够初始化一次,否则出错。
c.成员变量默认的初始值
基本类型:byte、short、int、long默认为0
基本类型:float、double默认为0.0
基本类型:char默认为\u0000
基本类型:boolean默认为false
引用类型:默认为null
2、局部变量定义:变量类型 变量名 【=变量值】
【变量类型】:基本类型、引用类型
【变量名】:第一个单词首字母小写,其他单词首字母大写。
a.局部变量
生命周期:
形参:整个方法内有效
局部变量:变量定义处开始,直到方法结束。
代码块局部变量:变量定义处开始,直到代码块结束。
内存分配: 在栈中分配内存,随方法结束或者代码块结束销毁。
基本类型变量:存放变量的值
引用类型变量:存放指向该类型对象的地址
初始化:必须进行显式初始化后,才能够使用此变量
调用方式:
首先查找方法内的局部变量、然后查找本来的成员变量、然后查找父类的成员变量...最后查找根类的成员变量。
变量冲突时访问:this.成员变量(访问本类的成员变量)、super.成员变量(访问父类的成员变量)来解决与局部变量的冲突。
final修饰局部变量:只能够进行一次初始化
基本类型:不能够对基本类型进行重新赋值,因此基本类型变量的值不会被改变。
引用类型:只保存引用的一个地址,因此只是引用的地址不会被改变,而引用的这个对象是完全可以被改变的。
final修饰符(宏替换规则,也就是编译时期final定义的变量用常量来替换):
a.必须要用final来修饰
b.在变量定义处进行初始化
c.在编译时期就能够确定其值(如常量、基本算术表达式、字符串连接运算,不能够访问普通变量,调用方式)
基本类型常量池、字符串常量池。
String a ="java"; 执行此语句之后,系统的字符串池中就会缓存一个字符串java
String b = "java"; 系统会在字符串池中查找java字符串,如果找到则b直接指向此内存块,所以 a==b 将会返回true
使用规则:
定义变量时,尽量缩小变量的作用范围,否则
a.增大了变量的生存空间,这将导致更大的内存开销
b.扩大了变量的作用域,这不利于提高程序的内聚性。
如下几种情况使用成员变量
a.类或实例固有的属性
b.保存类或实例运行时的状态
c.多个方法之间进行共享
案例参考《JAVA疯狂讲义》