登录不老阁

 
注册成功

二呆

diamond@tongleer.com

岂能尽如人意,但求无愧我心。

【java】子类继承父类程序各成员的执行顺序详解

2017-6-9 二呆 Java 4008观看

java的面向对象包括封装、继承、多态3个主要要点,那么子类继承父类后程序中各成员的执行顺序是怎样的呢?下面教大家怎么自己测试子类继承父类程序各成员的执行顺序。
1、首先定义2个类Person和Student,代码如图所示。

①Person.java

Person{
    String name;
    int age;
    {
        System.out.println("父类的非静态代码块");
    }
    static{
        System.out.println("父类的静态代码块");
    }
    Person(){
        System.out.println("父类的无参构造函数");
    }
    Person(String name,int age){
        this.name=name;
        this.age=age;
        System.out.println("父类的有参数构造函数");
    }
    void eat(){
        System.out.println("父类吃饭");
    }
    public static void main(String args[]){
        System.out.println("父类主方法");
        Person p=new Person("张三",18);
        p.eat();
    }
}
②Student.java
Student extends Person{
    int grade;
    {
        System.out.println("子类的非静态代码块");
    }
    static{
        System.out.println("子类的static");
    }
    Student(){
        //super();//运行子类的要先运行父类无参构造函数,此处省略默认执行父类无参构造函数
        System.out.println("子类的无参构造函数");
    }
    Student(String name,int age,int grade){
        //super(name,age);//运行子类的有参构造函数要先运行父类的有参构造函数,若父类无有参的,则运行父类无参的构造函数
        this.grade=grade;
        System.out.println("子类的有参数构造函数:"+name+":"+age+":"+grade);
    }
    void eat(){
        System.out.println("子类吃饭");
    }
    public static void main(String args[]){
        System.out.println("子类主方法");
        Student s1=new Student();
        Student s2=new Student("张三",19,10001);
        s1.eat();
        s2.eat();
    }
}
2、因为目的是要解决子类继承父类后程序的执行顺序,所以只运行Student.java就可以了,如果运行Person.java就相当于没有了继承关系也失去了意义。

3、由第二步可以看出静态代码块是程序首先执行的,而且先执行父类再执行子类的,并且有几个对象只执行一次静态代码块。

其次是从程序主方法开始执行,再执行非静态代码块和无参构造函数,而且仍然是先执行父类再执行子类的。

如果子类含有有参的构造函数,那么执行子类的有参构造函数,就不执行子类的无参构造函数了,但同样要执行父类的无参构造函数。

看到这里你会发现,非静态代码块和静态代码块的区别在于非静态代码块和构造函数一样,需要创建一次对象就执行一次的。

随后执行子类的成员函数,如果子类的成员函数重写了父类的成员函数,则只执行子类的不执行父类的。

最后是主函数,因为主函数一个程序只有一个,所以只执行一次本程序的主函数。

4、综上所述,java中子类继承父类程序各成员的执行顺序应该是:

父类的静态代码块—>子类的静态代码块—>主方法(执行哪个程序就执行哪个程序的主方法)—>父类的非静态代码块—>父类的无参构造函数—>子类的非静态代码块—>子类的无参构造函数(若实际子类执行的是有参构造函数,则不执行无参构造函数)—>成员函数(指定执行哪个就执行哪个成员函数,若重写了父类成员函数,则只执行子类的成员函数)

注意事项:

学习面向对象思想要结合实际考虑,初学者可能不容易理解,但做实际例子多的多了,自然而然就有了自己的思想,从而达到面向对象的要求。

想成为一个厉害的程序员,多敲代码吧!


« 【java】中用面向对象思想简易描述打印机项目演示 | 【Android】直播App礼物弹窗及连送礼物动画»

  • 觉得很赞 (0)
  • 打赏
  • X
    打赏
    • 微信
    • QQ红包
    • 支付宝


    用微信扫一扫

    您的鼓励将是站长及作者前行的动力,谢谢打赏
    (若二维码有误可举报)

发表评论:

快乐贰呆的关注更多 >

小草窝博客

博主是一名天朝的学生,喜欢折腾各种奇怪的语言,喜欢探索未知的事情

图床

微博图床

搜索

标签

Genymotion Button HTML 腾讯视频 Win10 火腿肠意面 MIUI 主题编辑器 Android emlog pjax EventBus AndroidStudio 快捷键 倒计时 工具类 eclipse javascript 励志语录 自定义Dialog Demo java 热伤风 redis RabbitMQ ZeroMQ ActiveMQ Kafka Jafka php 鸡蛋饼 直播 继承 面向对象 工厂模式 AutoCompleteTextView GridView RadioButton ToggleButton Android开发入门 EditText CheckBoxes 控件 TimePicker AnalogClock DigitalClock ProgressBar SeekBar RatingBar UI控件 Spinner ScrollView Adapter 单元测试 Dialog 自定义对话框 Android项目 布局 Android视频 Java4Android Android开发教程 学习札记 基本数据类型 运算符和流程控制 流程控制循环语句 数组 数组二 二维数组 安卓基础 安卓监听器 表格布局 帧布局 网格布局 Android异常 AndroidIO XML XML解析 用户登录 数据存储 SQLite内部数据存储 Unity3D教程 Linux subversionSVN TortoiseSVN ViewPager Fragment 预加载 Android实战开发 唯一识别码 锁屏 Activity CheckBox ListView 增删改查 图片回收处理 内存溢出 仿2列商品列表 AndroidNDK eclipse插件 jni开发 jni调用 so文件 Androidmk配置 Flash 绘制图形 苹果 图标 变形工具 滤镜 Flash特效 简单薄餐 Flash滤镜 Flash动画 Android开发 天气预报 醋溜白菜 香菇烩豆腐 微波豆腐蒸蛋 速成凉拌豆腐 杜子建 穷根 男装搭配 黄帝内经 大蒜洋葱粥 情商密码 中华药粥 交际红人 小白菜萝卜粥 每日一笑 完美国际 故梦 一卷情长 Ukulele 白熊音乐 零基础 指弹 教程 白桦树娃娃 新加坡 网红美食 海南鸡饭

公众号

同乐儿

链接更多 >