变量的分类
- 成员变量:修饰符(public、protected、private、final、static、volatile、transient)
- 类变量 (有static修饰)存储(方法区), 该类的所有对象的类变量是共享的
- 在当前类中“类名.”(有时类名.可以省略),在其他类中“类名.”或“对象名.”访问
- 实例变量 (没有static修饰)存储(堆), 每一个对象的实例变量是独立的
- 在当前类中“this.”(有时this.可以缺省),在其他类中“对象名.”访问
- 类变量 (有static修饰)存储(方法区), 该类的所有对象的类变量是共享的
- 局部变量:存储(栈),修饰符(final)
- 局部变量与实例变量重名 : 在实例变量前面加“this.”
- 局部变量与类变量重名 : 在类变量前面加“类名.”
代码块的执行
- 非静态代码块的执行:每次创建实例对象都会执行
- 静态代码块的执行:只执行一次,即使后面再有该类的实例化也不会再执行
public class Variate {
/**
* 变量的分类
* 成员变量:修饰符(public、protected、private、final、static、volatile、transient)
* 类变量 (有static修饰)存储(方法区), 该类的所有对象的类变量是共享的
* 在当前类中“类名.”(有时类名.可以省略),在其他类中“类名.”或“对象名.”访问
* 实例变量 (没有static修饰)存储(堆), 每一个对象的实例变量是独立的
* 在当前类中“this.”(有时this.可以缺省),在其他类中“对象名.”访问
* 局部变量:存储(栈),修饰符(final)
* 局部变量与实例变量重名 : 在实例变量前面加“this.”
* 局部变量与类变量重名 : 在类变量前面加“类名.”
* 代码块的执行
* 非静态代码块的执行:每次创建实例对象都会执行
* 静态代码块的执行:只执行一次,即使后面再有该类的实例化也不会再执行
*/
//成员变量:类变量 (方法区)
static int s;
//成员变量:实例变量 (堆)
int i;
//成员变量:实例变量
int j;
{
//非静态代码块中的局部变量 i
int i = 1;
//就近原则: 局部变量i 进行自增 (栈)
i++;
//以this进行调用则为成员变量i 进行自增
//this.i++;
j++;
//类变量是共享的,所以每个实例对象初始化的时候,都会被加1
s++;
}
public void test(int j){//形参 局部变量 j (栈)
//就近原则: 局部变量j 进行自增
j++;
//以this进行调用则为成员变量j 进行自增
//this.j++;
i++;
s++;
}
public static void main(String[] args) {//形参 局部变量 args
//局部变量 obj1
Variate obj1 = new Variate();
//局部变量 obj2
Variate obj2 = new Variate();
obj1.test(10);
obj1.test(20);
obj2.test(30);
//2,1,5 变更this之后 3,3,5
System.out.println(obj1.i + "," + obj1.j + "," + obj1.s);
//1,1,5 变更this之后 2,2,5
System.out.println(obj2.i + "," + obj2.j + "," + obj2.s);
}
}