package learn.fun;
/**
* @author itsoso@126.com
* @version 1.0 创建时间:2006-11-23 下午02:49:16
* 类说明
* 父类初始化时会调用子类的重载的函数
*
* jvm先加载类对象,再实例化对象.
* 类级别的东西先加载.
* 所以初始化的顺序是: 先父类静态后子类静态;先父类定义初始化
* 父类构造函数初始化,再子类定义初始化,再子类构造函数初始化
* 如果在初始化时父类调用了父类中被子类重载的方法,那么执行的是子类的方法.
* 所以要注意:不要在定义初始化时调用函数,这样不安全,因为无法预知子类重载的方法
* 是否是安全的.
* 如果子类没有使用super关键字显式地调用父类指定的构造函数
* 那么会调用缺省的无参构造函数
*/
class Father{
private int i=getI();
private int j=getFM();
private static int k=getK();
public int getI() {
System.out.println("父类定义初始化有重载");
return 0;
}
private static int getK() {
System.out.print("private int i=getI()");
System.out.println("父类静态定义初始化");
return 0;
}
private int getFM() {
System.out.print("private int j=getFM()");
System.out.println("父类定义初始化无重载");
return 0;
}
public Father(){
getI();
System.out.print("public Father()");
System.out.println("父类构造函数初始化");
}
public Father(String f){
System.out.print("public Father(String f)");
System.out.println("父类重载的构造函数初始化");
}
}
class Child extends Father{
private int i=getI();
private int j=getCM();
private static int k=getK();
private static int getK() {
System.out.print("private static int k=getK(); ");
System.out.println("子类静态定义初始化");
return 0;
}
public int getI() {
System.out.print("private int i=getI()");
System.out.println("子类定义初始化有重载");
return 0;
}
private int getCM() {
System.out.println("子类定义初始化无重载");
return 0;
}
public Child(){
super("haha");
System.out.println("adfasdf");
super.getI();
System.out.println("super()");
System.out.println("子类构造函数初始化");
}
}
public class InitializeTest {
public static void main(String[]args){
Child c=new Child();
System.out.println("$$$$$$$$$$$$$$$$$$$$$44");
c=new Child();
}
}