zoukankan      html  css  js  c++  java
  • java构造器执行顺序一个有趣的简单实例

      Animal为父类,构造器中调用public(default、protected) say方法,Dog继承了Animal,并重载了say方法。新建Dog对象,查看运行结果,若将Animal中say方法改为private,再次运行程序查看结果:
    public class Dog extends Animal {
        private String name;
    
        public Dog() {
            System.out.println("dog init");
            name = "jack";
        }
    
        public void say() {
            System.out.println("my name is:" + name);
        }
    
        public static void main(String[] args) {
            new Dog();
        }
    }
    
    class Animal {
        public Animal() {
            System.out.println("animal init");
            say();
        }
    
        // private
        public void say() {
            System.out.println("i am an animal..");
        }
    }
    

      

    运行结果1:


    animal init
    my name is:null
    dog init


     若将Animal中的say方法改为private,运行结果2如下:


    animal init
    i am an animal..
    dog init


     对于运行结果1执行顺序:

    1. Dog构造器会首先默认调用父类Animal的构造器进行初始化,(同样Animal继续往上调用父类构造器)。
    2. Animal构造器调用say方法,由于子类Dog中重载了say方法,所以会调用子类中的say方法。
    3. 然后执行Dog构造方法中的部分。
    4. 对于运行结果2,因为private方法默认为final,在子类中是不可见的,所以无法重载,Dog中的say方法非继承父类,所以新建Dog对象时Animal构造器方法仍然是调用他本身的final private void say 方法。
      总结
    构造方法中应尽量避免调用其他方法,因为此时对象还没有完全初始化,调用类的其他方法可能会遇到很多不可预知的错误。若迫不得已必须在构造器中调用,则应该将调用的方法设置为final方法
    (或private,private方法编译器也会默认加上final修饰符)。
  • 相关阅读:
    poj3253Fence Repair (Huffman)
    poi3617Best Cow Line ——贪心法
    高级排序之——归并排序
    Aizu
    初级排序——冒泡排序
    cookie会话
    加载web资源文件
    servlet
    Http

  • 原文地址:https://www.cnblogs.com/yoohot/p/6026996.html
Copyright © 2011-2022 走看看