以一个题目为例- public class Test {
- Person person = new Person("Test");
- static{
- System.out.println("test static");
- }
-
- public Test() {
- System.out.println("test constructor");
- }
- public static void main(String[] args) {
- new MyClass();
- }
- }
-
- class Person{
- static{
- System.out.println("person static");
- }
- public Person(String str) {
- System.out.println("person "+str);
- }
- }
- class MyClass extends Test {
- Person person = new Person("MyClass");
- static{
- System.out.println("myclass static");
- }
-
- public MyClass() {
- System.out.println("myclass constructor");
- }
- }
复制代码 运行结果:
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor
1、主函数在Test类中,所以先加载Test类,在加载Test类时会执行Test类的静态代码块。打印test static。 2、在主函数中new了个MyClass类对象,执行MyClass类时发现MyClass类继承自Test类,但Test类已经被加载了,所以加载MyClass类,并执行了静态代码块。打印myclass static。 3、在通过MyClass类的构造方法生成变量的时候首先会初始化父类的成员变量,因此会new一个Person类对象,而Persom类还没有被加载,所以加载Person类,并执行静态代码块。打印person static。 4、然后执行Person类的构造方法。打印person Test。 5、初始化父类变量之后执行父类的构造方法(继承的子类的构造方法中默认存在super();),打印test constructor。 6、完成父类的初始化之后,初始化自身,先对自身的成员变量初始化。打印person MyClass。 7、最后执行自身的构造方法。打印myclass constructor。
|