关于java类初始化过程的研究

/**
* 关于 继承的初始化问题:
* 最先初始化父类然后逐级初始  最低级别的子类最后初始化。
* 父类在初始化的时候如果去调用父类本身的方法  会先执行父类方法
* 如果子类也去实现了这个被调用的方法的话,(重写父类的公共方法 即public)他会先去执行最低级别的类中的该方法,逐级向上,如果子类去重写父类方法没有使用
* super.xx方法的话 那么父类方法就不会执行了。 



* 总结 类的初始化过程是     父类最先初始化 依次是子类又高到低
*    重写方法的初始化是  最先调用子类重写的方法 然后在逐级向上初始化 子类没有使用super.xx(调用父类方法)的话,这个初始化就会被中断掉 低级到高级

*/


    Demo:

  public class Main {
public static void main(String[] args) {
AAA b=new AAA();
}


static class A {
A() {
System.out.println("A");
start();
}
public void start() {
System.out.println("a----start");
}


}
static class AA extends A implements Callback {
AA() {
System.out.println("AA");
}
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("AA----------start");
getMessage("xxxxxxxx");
super.start();
}
@Override
public void getMessage(String str) {
// TODO Auto-generated method stub

}


}


static class AAA extends AA {
AAA() {
System.out.println("AAA");
}
@Override
public void getMessage(String str) {
// TODO Auto-generated method stub
System.out.println(str);
}
@Override
public void start() {
// TODO Auto-generated method stub
// System.out.println("AAA-------start");
//super.start();
}
}
interface Callback {
void getMessage(String str);
}
}
输出结果为:

 A
AA
AAA

   将AAA 的start方法中 注释掉的  //super,start() 启用 输出结果为:

 A
AAA-------start
AA----------start
a----start
AA
AAA

结果一目了然 大家可以将这个代码放到本地测试下 研究下。

 里面还有一个CallBack的接口  这个接口也有挺有意思的。 是这样的。 

 我们的AA类是一个抽象类继承了一个接口Callbakc  他们这个AA类就需要是实现Callback接口中的getMessge方法。由于aa类是抽象的。所以他可以不用去

@Override这个方法。而是由 aa的子类去实现getMessage方法 那么我们根据初始化过程研究。

 我们在AA类中调用getMessage方法的时候  最会去调用子类 AAA中实现的方法  那么最低级子类就可可以回调接受到由父类AA传递的参数。那么说这么多 这个东西有什么用处呢?  其实用户很大的。。。 有的时候  根据很多业务逻辑的不同。 我们有一父类-子类-子子类 这样的东西。每个父类当众都会有其单独的业务逻辑。父类中处理玩业务以后可以直接将通过调用子类重写的方法将结果给子类。

 希望大家可以多多讨论

你可能感兴趣的:(java)