zoukankan      html  css  js  c++  java
  • 一个继承了抽象类的普通类的执行顺序

    今天看《java编程思想》抽象类那节的时候,做了一个练习题3(p171页),发现了一个很有意思的东西,一个继承了抽象类的普通类的执行顺序是怎样的呢?

    package JavaChoiceQuestion;
    
    /**
     * @Auther: 李景然
     * @Date: 2018/4/13 19:45
     * @Description:
     */
    
    
    //抽象类
    public abstract class AbstractClass {
        public static void main(String[] args){
            NotAbstractClass n=new NotAbstractClass();
            n.print();
        }
        public abstract void print();
        public AbstractClass(){
            print();
        }
    }
    
    //实现抽象类的普通类
    class NotAbstractClass extends  AbstractClass {
        private int num=1;
    
        public NotAbstractClass(){
        ...
        }
    
        public void print(){
            System.out.println(num);
        }
    }

    执行的结果是:

    0

    1

    分析:

    main函数执行的时候

    先执行main函数中的第一句:NotAbstractClass n=new NotAbstractClass();输出的是0.

    这一句的执行顺序如下:

      1、先进入到NotAbstractClass的构造函数,然后先去执行其父类的构造函数,父类的构造函数执行print()方法,但是子类实现了这个方法,所以会去执行System.out.println(num);这时的num还未进行赋值,所以此时num是默认值0.

      2、执行完父类的构造函数,会去执行子类的成员变量的初始化,这时会执行private int num=1;此时num被赋值为1,

      3、最后,执行子类构造函数中的代码...

    然后main函数执行第二句:n.print();,输出是1.

    总结,一个继承了抽象类的普通类的执行顺序是:父类的构造函数---子类成员变量的初始化---子类的构造函数

  • 相关阅读:
    Android获取Java类名/文件名/方法名/行号
    Service的onStartCommand方法的返回值和参数详解
    Centos7 k8s Replication副本控制器
    Centos7 k8s 基础单元pod
    Linux问题故障定位
    Linux 搭建YUM仓库源详解
    Centos7 k8s安装部署
    Centos7 KVM热迁移
    Centos7 KVM热添加网卡、内存、CPU
    Centos7 KVM虚拟机硬盘热添加和扩容
  • 原文地址:https://www.cnblogs.com/lijingran/p/8823921.html
Copyright © 2011-2022 走看看