java中子类继承父类,程序运行顺序的深入分析

 更新时间:2013年06月04日 16:39:17   作者:  
本篇文章是对java中子类继承父类,程序运行顺序进行了详细的分析介绍,需要的朋友参考下
我们经常在项目中使用继承,但是往往不太明白,程序运行的顺序以及原理,尤其是使用上转型对象的时候,以及父类子类中都有static变量和方法时,不知道先运行谁。我也是写了一个例子。总结了一下。
复制代码 代码如下:

父类:
public class TestStatic {

    public static String name="china";

    {
       System.out.println("========方法体========");
    }

    static{
       name="England";
       System.out.println("========静态程序块======");
    }

    TestStatic(){
       System.out.println("=========构造方法========");
    }

    public static void main(String[] args){
       System.out.println("========主方法========"+name);
    }

    public void test(){
       System.out.println("========测试方法=========");
    }
}

子类:
public class TestExtendStatic extends TestStatic{

    //public static String name="HUBEI";

    {
       System.out.println("========无名称方法体========");
    }

    static{
       //name="SUIZHOU";
       System.out.println("========子类静态程序块======");
    }

    TestExtendStatic(){
       System.out.println("=========子类构造方法========");
    }

    public void test(){
       System.out.println("========子类测试方法=========");
    }

    public static void main(String[] args){
       System.out.println("========子类主方法========"+name);
       TestStatic ts = new TestExtendStatic();// 上转型对象
       ts.test();
    }
}
输出如下:
========静态程序块======   :父类static程序块
========子类静态程序块======  :子类static程序块 【不是静态方法】
========子类主方法========England  :子类主方法
========方法体======== :父类中非静态代码块
=========构造方法======== :父类构造方法
========无名称方法体======== :子类中非静态代码块
=========子类构造方法======== :子类构造方法
========子类测试方法========= :子类测试方法

执行顺序: 父类静态变量以及静态程序块 --- 子类的静态变量以及静态程序块 --- 父类非静态代码块 --- 父类中构造方法 --- 子类中非静态代码块 --- 子类中构造方法 --- 接下来才是 对象调用的方
法。
只要是用new 创建对象,分配了内存空间,不管是将引用赋给上转型对象,还是赋给子类对象,上面方法都必须执行。
即:TestStatic ts = new TestExtendStatic();// 上转型对象
    TestExtendStatic ts = new TestExtendStatic();// 子类对象
上面加粗程序都会执行。

上面程序中 ts.test(); ts作为上转型对象调用的是 子类继承的父类中的方法,因为test()在子类中被重写了,所以输出的为子类中的语句。

如果将子类中 main 方法该成如下:
复制代码 代码如下:

public static void main(String[] args){
       System.out.println("========子类主方法========"+name);
       TestStatic  ts = new TestExtendStatic();
       ts.test();
       System.out.println("-------------------------");
       ts = new TestExtendStatic();
       ts.test();
    }
输出:
========静态程序块======  父类中静态程序块
========子类静态程序块====== 子类中静态程序块
========子类主方法========England 子类中主方法
========方法体========  父类中非静态代码块
=========构造方法======== 父类中构造方法
========无名称方法体======== 子类中非静态程序块
=========子类构造方法======== 子类中构造方法
========子类测试方法========= 对象具体调用的方法
------------------------- 静态变量以及程序块只执行一次
========方法体======== 父类中非静态代码块
=========构造方法======== 父类中构造方法
========无名称方法体======== 子类中非静态代码块
=========子类构造方法======== 子类中构造方法
========子类测试方法=========

如果将子类主方法 中更改为:
复制代码 代码如下:

TestStatic  ts = new TestStatic ();// 运用父类构造方法创建
ts.test();
输出为:
========静态程序块====== 父类静态程序块
========子类静态程序块====== 子类静态程序块 【因为程序在子类中运行的,所以子类的静态程序块必须运行】
========方法体========  父类非静态程序块
=========构造方法======== 父类构造方法
========测试方法========= 父类具体方法test()
如果将上述代码放到父类中,就不会加载子类 静态程序块了。

通过上面 我们还可以发现,静态程序块运行 是在主方法之前,非静态程序块运行是在主方法之后。
我在父类中 主方法中创建一个对象 调用test(),运行的结果:
========静态程序块====== 静态代码块
===main==
========方法体======== 非静态代码块
=========构造方法======== 构造方法
========测试方法=========

总结:
程序运行时(一个类中),会第一时间加载运行静态代码块,一旦创建对象,就会执行非静态代码块以及无参构造方法。 而在继承中,程序运行时 会先加载父类中静态代码块 然后加载本身静态代码块,一旦创建对象(运用子类构造方法创建),就会调用 父类非静态代码块,父类构造方法,然后就是本身 非静态代码块,本身构造方法。

相关文章

  • 你可能真没用过这些 IDEA 插件(建议收藏)

    你可能真没用过这些 IDEA 插件(建议收藏)

    IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具。这篇文章主要介绍 IDEA 必用插件的安装及用法,需要的朋友可以参考下
    2020-08-08
  • SpringDataMongoDB多文档事务的实现

    SpringDataMongoDB多文档事务的实现

    mongodb4.0也出来一段时间了,这个版本最为大众期待的特性就是支持了多文档事务。这篇文章主要介绍了SpringDataMongoDB多文档事务的实现,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Java整合腾讯云短信发送实例代码

    Java整合腾讯云短信发送实例代码

    大家好,本篇文章主要讲的是Java整合腾讯云短信发送实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • maven实现jar包导入+导出方式

    maven实现jar包导入+导出方式

    这篇文章主要介绍了maven实现jar包导入+导出方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Spring Boot集成Kafka的示例代码

    Spring Boot集成Kafka的示例代码

    本篇文章主要介绍了Spring Boot集成Kafka的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 详解Java从后台重定向(redirect)到另一个项目的方法

    详解Java从后台重定向(redirect)到另一个项目的方法

    这篇文章主要介绍了详解Java从后台重定向(redirect)到另一个项目的方法,非常具有实用价值,需要的朋友可以参考下
    2017-04-04
  • 通过实例了解java序列化机制

    通过实例了解java序列化机制

    这篇文章主要介绍了通过实例了解java序列化机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中ShardingSphere分库分表实战

    Java中ShardingSphere分库分表实战

    我们做项目的时候,数据量比较大,单表千万级别的,需要分库分表,本文主要介绍了Java中ShardingSphere分库分表实战,感兴趣的可以了解一下
    2021-09-09
  • 浅谈hibernate中对象的3种状态_瞬时态、持久态、脱管态

    浅谈hibernate中对象的3种状态_瞬时态、持久态、脱管态

    下面小编就为大家带来一篇浅谈hibernate中对象的3种状态_瞬时态、持久态、脱管态。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • SpringBoot应用程序转换成WAR文件详解

    SpringBoot应用程序转换成WAR文件详解

    其实一般使用SpringBoot使用打成jar包比较省事的,但也有很多童鞋是习惯使用WAR包的,下面这篇文章主要给大家介绍了关于SpringBoot转换WAR的相关资料,需要的朋友可以参考下
    2022-11-11

最新评论