变量(按作用域划分变量类型)
类中方法外的变量是成员变量,类中方法内的变量是局部变量
- 成员变量
- 类变量(static)
- 实例变量
- 局部变量
- 形参(方法签名)
- 方法局部变量
- 代码块局部变量
- 类代码块
- 实例代码块
类变量与成员变量的区别
- 生命周期
类变量是类加载过程中的准备阶段就已经分配内存了,直至类被销毁,类变量的内存才会释放。而实例变量是在类的实例创建(创建对象)时存在直至实例被销毁
- 访问方式
访问类变量的方式有两种:类.类变量、实例.类变量。除了类本身可以对类变量进行修改外,类的实例也会对类变量进行修改,且其他实例也会看到变化。
访问实例变量的方式就只有一种:实例.实例变量。每个实例的实例变量都不对其他实例可见。
局部变量知识点
类代码块在实例代码块被加载之前就已经加载了,原因与类变量和实例变量的区别相似,类代码块是在在类加载过程中就已经被加载了,而实例变量是在类加载之后、对象初始化过程中才加载。
下面示例,可以做一个变量的知识点补充
package VAR.demo01;/** 变量:成员变量 局部变量=================*局部变量:形参(方法签名) 方法局部变量 代码块局部变量=================* 代码块局部变量,即类中定义好的代码块* 类代码块和实例代码块* 类代码块在实例代码块被加载之前就已经加载了** */public class Test{ static int a = 100;//成员变量 类变量(static) a int b = 200;//成员变量 实例变量 b //局部变量 代码块局部变量 我是实例代码块 c { int c = 400; System.out.println(c); } //局部变量 代码块局部变量 我是类代码块 d static{ int d = 500; System.out.println(d); } //局部变量 形参(方法签名) f public void test(int f){ int e = 300;//局部变量 方法局部变量 e System.out.println(e); System.out.println(f); } public static void main(String[] args){ Test t = new Test(); System.out.println(a); System.out.println(t.b); t.test(600); /* * 输出结果 * d 500 * c 400 * a 100 * b 200 * e 300 * f 600 * */ }}
还有一点要注意:
成员变量,如果没有赋值,会有默认赋值
局部变量,如果没有赋值,需要手动赋值才能使用
package VAR.demo01;/** 变量:成员变量 局部变量=================*局部变量:形参(方法签名) 方法局部变量 代码块局部变量=================* 代码块局部变量,即类中定义好的代码块* 类代码块和实例代码块* 类代码块在实例代码块被加载之前就已经加载了** */public class TestDefault { static int a = 100;//成员变量 类变量(static) a 无需赋值 int b = 200;//成员变量 实例变量 b 无需赋值 public static void main(String[] args){ int c=300;//局部变量 方法局部变量 c 需要手动赋值才能使用 TestDefault t = new TestDefault(); System.out.println(a); System.out.println(t.b); System.out.println(c); /* * 输出结果 * a 100 * b 200 * c 300 * */ }}
局部变量不赋值的话,编译器会报错
![8880d4165f2dfccd2d427dc4078440bc.png](https://img-blog.csdnimg.cn/img_convert/8880d4165f2dfccd2d427dc4078440bc.png)
![5d42dfb3f25cc2b146b96ec00f2b2ee8.png](https://img-blog.csdnimg.cn/img_convert/5d42dfb3f25cc2b146b96ec00f2b2ee8.png)
局部变量c没有赋值,编译报错
![128264486b348a7ec131adc4242eaa16.png](https://img-blog.csdnimg.cn/img_convert/128264486b348a7ec131adc4242eaa16.png)
局部变量c没有赋值,javac编译器报错