我认为要学好一门编程语言,深刻理解它的运行顺序是至关重要的,这能很大程度的减少我们的错误率。
Java是一门完全面对对象的程序,可以说是目前对面对对象思想支持最好的一门编程语言。我测试了一下java中对象实例化顺序。
测试结果如下:
1. 第一步,调用构造函数。
2. 第二步,如果在构造函数的第一行发现有super(参数)那么就调用父类的带相应参数的构造函数,如果没有发现super (参数)那么就调用父类的默认构造函数,不管那一种再调用构造函数的第2行之前都将进入下面的第三步。
3. 第三步,在调用构造函数的第2行之前,将跳到程序的第一行,开始实例化我们在函数,和构造函数外定义的变量,和常量(静态变量不一样,他们在程序字节码被加载时就已完成),然后再跳到构造函数的第二行开始执行。
从这三步我们将不难知道:
1. 为什么super(…)一定要放在子类构造函数的第一行才能通过编译,放在别的地方不行。
2. 就能很好的解释下面的现象class Father{
Public father(){ System.out.println(“1”)
}
public father(String name){System.out.println(“2”); }
}
public class child extends Father{
public child(String name){}
public static void main(String s[]){new child(“”);}
}
public class child2 extends Father{
public child2(String name){super(name);}
public static void main(String s[]){new child2(“”);}
}
运行上面的的程序child为什么会打印1而不是2, 运行child2打印的是2而不是1的原因了。
3. public class child3 extends child{
public child3(String name){super(name);//如果把super(name)去掉将不能通过编译
}
public static void main(String s[]){new child3(“”);}
}
如上面的程序,如果把super(name)去掉将不能通过编译,因为其父类child没有默认的构造函数,通过我们的测试知道要是没有super(name)的话,它将会找父类的默认构造函数,那当然是找不到,所以我们要调用super(name)告诉JVM我们将调用父类的那个构造函数。
今天学习日记就写到这里了