一、什么时候会加载类?
二、类所有内容加载顺序和内存中的存放位置:
三、静态代码块、构造代码块和构造函数的区别
//利用代码进行测试
class Person
{
}
class StaticDemo
{
}
输出结果:
- 几大原则
-
* 一、静态成员变量(Static) -
* 1、静态成员变量为类变量,所有对象共享同一内存空间 -
* 2、静态成员变量的声明和定义仅在首次加载类时执行一次 -
* 3、首次加载类时首先对所有静态成员变量根据类型默认赋初值,然后再对有右值的附右值 -
* 二、静态初始块 -
* 1、静态初始化块仅在首次加载类时执行一次 -
* ······多个静态成员变量与静态始化快参照出现顺序先后执行······ -
* 三、动态成员变量 -
* 1、动态成员变量定义在每次实例化对象时在构造函数之前执行 -
* 四、动态初始化块 -
* 1、动态初始化块在每次实例化对象时在构造函数之前执行 -
* ······多个动态成员变量与动态初始化块参照出现顺序先后执行······ -
* 总结:总的来说,在不涉及继承的前提下,当首次加载类时,按照如下顺序执行 -
* 1、按照出现顺序先后执行静态成员变量定义与静态初始化块 -
* 2、按照出现顺序先后执行动态成员变量定义与动态初始化块 -
* 3、执行构造函数 -
* 再次实例化对象时只执行第2、3步即可 -
* -
* ············成员变量与定义与初始化块先于构造函数执行········· -
* 五、当涉及到继承时,按照如下顺序执行 -
* 1、执行父类的静态成员变量定义与静态初始化块,执行子类的静态成员变量定义与静态初始化块 -
* 2、执行父类的非静态成员变量定义与动态初始化块,执行父类构造方法 -
* 3、执行子类的非静态成员变量定义与动态初始化块,执行子类构造方法 -
* 另:父类构造方法中用到的方法如果已被子类重写,那么在构造子类对象时在调用父类构造函数中使用子类重写的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
TestCode
public
TestCode()
System.out.println(
"构造方法"
);
}
{
System.out.println(
"代码块"
);
}
public
static
void
main(String[]
new
TestCode();
}
}
|
相当于
1
2
3
4
5
6
7
8
9
10
11
|
public
class
TestCode
public
TestCode()
System.out.println(
"代码块"
);
System.out.println(
"构造方法"
);
}
public
static
void
main(String[]
new
TestCode();
}
}
|
你记住了这一点,以后在做很多关于用构造方法或代码块赋值的问题就明白了。