构造器在多态中的调用顺序

  1. package com.zx.test08;
  2. class Meal {//餐
  3. Meal() {
  4. System.out.println("Meal无参构造器");
  5. }
  6. class Bread {//面包
  7. Bread() {
  8. System.out.println("Bread无惨构造器");
  9. }
  10. }
  11. }
  12. class Cheese{//奶酪
  13. Cheese(){
  14. System.out.println("Cheese无惨构造器");
  15. }
  16. }
  17. class Lettuce {//莴苣
  18. Lettuce() { System.out.println("lettuce无参构造器"); }
  19. }
  20. class Lunch extends Meal{ Lunch(){ System.out.println("Lunch无参构造器"); } }
  21. class ProtableLunch extends Lunch {
  22. ProtableLunch(){
  23. System.out.println("ProtableLunch无参构造器");
  24. }
  25. }
  26. public class Sandwich extends ProtableLunch{
  27. private Bread b=new Bread();
  28. private Cheese c=new Cheese();
  29. private Lettuce l=new Lettuce();
  30. Sandwich(){
  31. System.out.println("Sandwich无参构造器");
  32. }
  33. public static void main(String[] args) {
  34. new Sandwich();
  35. }
  36. }
  37. //Output:
  38. Meal无参构造器
  39. Lunch无参构造器
  40. ProtableLunch无参构造器
  41. Bread无惨构造器
  42. Cheese无惨构造器
  43. lettuce无参构造器
  44. Sandwich无参构造器

总结:

  1. 调用基类构造器,不断的递归直到最底层的导出类 <br />

构造器内部的多态方法和行为

如果要在基类的构造器中调用多态方法的话,那么该方法会被导类中的方法所覆盖。所以说在构造器中能被安全调用的方法是基类中被fianl修饰的(也适用于private)

  1. class Glyoh {
  2. void draw() {
  3. System.out.println("Glyoh.draw()");
  4. }
  5. Glyoh() {
  6. System.out.println("draw调用前");
  7. draw();
  8. System.out.println("draw调用后");
  9. }
  10. }
  11. class RoundGlyph extends Glyoh {
  12. private int radius =1;
  13. RoundGlyph(int r){
  14. radius=r;
  15. System.out.println("RoundGlyph的无惨构造方法"+radius);
  16. }
  17. @Override
  18. void draw() {
  19. System.out.println("RoumdGlyph.draw"+" ”+radius);
  20. }
  21. }
  22. public class PolyContstructors {
  23. public static void main(String[] args) {
  24. new RoundGlyph(5);
  25. }
  26. }
  27. /*
  28. * 先执行基类的构造器,同时基类构造其中的方法将被导出类的方法所覆盖。
  29. 此时导出类中的变量还未被初始化(基类构造器执行后才会初始化)
  30. 然后是导出类中的构造器。
  31. * */
  32. Output:
  33. draw调用前
  34. RoumdGlyph.draw 0
  35. draw调用后
  36. RoundGlyph的无惨构造方法5

初始化.顺序总结

1.在其他任何事物发生之前,将会给对象分配二进制初始化为0的空间
2.如果有静态域、静态代码块,按照声明顺序执行初始化
3.如果有普通域、普通代码块,按照声明顺序执行初始化
4.最后执行构造器中的代码,按声明顺序【构造器是确保初始化的最后屏障】