1.Java变量
1.1局部变量
- 行参:在方法签名中定义的局部变量,随方法的结束而凋亡
- 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡
- 代码块内的局部变量:必须在代码块内对其显示初始化,从初始化后开始生效,随代码块的结束而凋亡
1.2成员变量
- 静态属性:类加载时初始化,随着类的存在而存在
- 非静态属性:随着实例的属性存在而存在
1.3局部变量与成员变量的区别
- 局部变量不可以加static
- 局部变量不可以加public、protected、private
- 局部变量必须赋初始值
- 局部变量存在于栈中
1.4实例变量与类变量
- 实例变量:局部变量、非静态成员变量;
- 类变量:静态成员变量;
1.5实例变量与类变量的区别
- 实例变量不是静态的,类变量是静态的
- 实例的总是可以引用类的
- 在JVM中,每个类对应一个class,但是一个类可以创建多个java对象。jvm的类变量只需要一块内存空间。类有几个实例,就要分配几块内存空间。
1.6static可以修饰
- 只能修饰类里的成员部分
- 成员部分包括:成员变量;成员方法;内部类;初始化块;内部枚举类
1.7实例变量初始化的时机:
- 定义变量时
- 非静态初始化块
- 构造方法
- 注意:定义变量时初始化与非静态初始化块初始化 这两种方式 比 构造方法初始化方式 更早执行,执行顺序与他们在源程序中的排序相同
2.Java对象初始化顺序
- 先初始化静态的
- 同静态先初始化父类的
- 静态中先初始化变量,再初始化代码块
- 非静态的也是先变量,再代码块,再构造函数
- 所以初始化顺序可以看下面那张图
- 子类构造器执行体内执行第一行代码使用super显示调用父类构造器,系统将根据super调用里传入的参数列表判断调用哪个构造器
- 子类构造器执行体的第一行代码使用this调用本类中重载的构造器,根据传入参数判断调用哪个本类构造器
- 子类构造器中既没有super调用也没有this调用,系统将会在执行子类构造器前,隐式调用父类无参数的构造器。
- super和this都只能在构造器中使用,而且super和this都必须作为构造器中的第一行,因此super和this只能调用其中之一,且最多只能调用一次。