举例说明Java中代码块的执行顺序

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

结论
    这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论。在Java类被new的过程中,执行顺序如下:

  •     实现自身的静态属性和静态代码块。(根据代码出现的顺序决定谁先执行)
  •     实现自身的非静态属性和非静态代码块。
  •     执行自身的构造函数。

    在实现继承的类被new的过程中,初始化执行顺序如下:

  •     实现父类的公共静态属性和静态块级代码。
  •     实现自身的静态属性和静态块级代码。
  •     实现父类的非静态属性和非静态代码块。
  •     执行父类的构造函数。
  •     实现自身的非静态属性和非静态代码块。
  •     执行自身的构造函数。

    这里需要简单的介绍一下静态代码块和非静态代码块。
1. 静态代码块:

    static {  
    } 

2. 非静态代码块

    {  
    } 

    静态代码块和非静态代码块的异同点如下:

  •     相同点:都是JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。
  •     不同点:静态代码块在非静态代码块之前执行(静态代码块 > 非静态代码块)。静态代码块只在第一次new时执行一次,之后不再执行。而非静态代码块每new一次就执行一次。


验证
    对于结论的最好验证就是写出代码来进行结果证明。首先,来看一下无继承的类初始化时的执行顺序,代码如下:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
publicclass InitOderTest {
  publicstatic String STATIC_FIELD = "静态属性";
    
  // 静态块
  static{
    System.out.println(STATIC_FIELD);
    System.out.println("静态代码块");
  }
    
  publicString field = "非静态属性";
    
  // 非静态块
  {
    System.out.println(field);
    System.out.println("非静态代码块");
  }
  
  publicInitOderTest() {
    System.out.println("无参构造函数");
  }
    
  publicstatic void main(String[] args) {
    InitOderTest test = newInitOderTest();
  }
}

    执行结果:

  •     静态属性 
  •     静态代码块 
  •     非静态属性 
  •     非静态代码块 
  •     无参构造函数 

    接下来,我们验证一下,当Java类实现继承后,执行顺序是否和我们的结论吻合。测试代码如下:

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
classParentTest {
   publicstatic String PARENT_STATIC_FIELD = "父类-静态属性";
   
   // 父类-静态块
   static{
     System.out.println(PARENT_STATIC_FIELD);
     System.out.println("父类-静态代码块");
   }
   
   publicstatic String parentField = "父类-非静态属性";
   
   // 父类-非静态块
   {
     System.out.println(parentField);
     System.out.println("父类-非静态代码块");
   }
   
   publicParentTest() {
     System.out.println("父类—无参构造函数");
   }
 }
   
 publicclass InitOderTest extendsParentTest {
   publicstatic String STATIC_FIELD = "静态属性";
   
   // 静态块
   static{
     System.out.println(STATIC_FIELD);
     System.out.println("静态代码块");
   }
   
   publicString field = "非静态属性";
   
   // 非静态块
   {
     System.out.println(field);
     System.out.println("非静态代码块");
   }
   
   publicInitOderTest() {
     System.out.println("无参构造函数");
   }
   
   publicstatic void main(String[] args) {
     InitOderTest test = newInitOderTest();
   }
 }

    执行结果如下:

  •     父类-静态属性 
  •     父类-静态代码块 
  •     静态属性 
  •     静态代码块 
  •     父类-非静态属性 
  •     父类-非静态代码块 
  •     父类—无参构造函数 
  •     非静态属性 
  •     非静态代码块 
  •     无参构造函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google 正式开源 Jib ,帮助 Java 应用快速容器化

Google 本周宣布开源一款新的 Java 工具 Jib ,旨在让开发者使用他们熟悉的工具更轻松地将 Java 应用程序容器化。在7月9日发布的博客文章中,Google 软件工程师 Appu Goundan 和 Qingyang Chen 将 Jib 描述为一个容器镜像构建器,旨在处理将 Ja…

“公敌”京东:众同行将其拖入价格战

倒京东语录 当当网董事长李国庆: 京东的资金只能维持到8月至12月。当当网是赚一个花两个,而京东则是赚一个花四个。 苏宁电器董事长张近东: 我至今没有看见过哪个企业能通过这种方式取得最后胜利。这种违背正常商业逻辑的做法&#xff0c…

跨域与跨域访问

什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域 为什么浏览器要限制跨域访…

thymeleaf 使用javascript定义数组报错

js中免不了的要用的数组,一维的二维的三维的 但是当用到thymeleaf作为模版时候会有一些坑,导致数组不能用 org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "{checkbox: true, fixed: true}, {field: origi…

解决:Failed to execute goal on project aopcore: Could not resolve dependencies for project com.cmos:

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、问题描述 maven工程 jar包无法下载,报错如下 : [ERROR] Failed to execute goal on project aopcore: Cou…

从Xbox和Zune中学到的四门创业课

导读:微软前娱乐与设备部门总裁Robbie Bach领导他的团队,实现了Xbox的畅销。然而,他领导该部门推出的Zune音乐播放器,却没那么成功。从Robbie这两个经历中,我们们能学到什么?本文是Robbie自己的总结&#x…

服务容错保护断路器Hystrix之七:做到自动降级

从《高可用服务设计之二:Rate limiting 限流与降级》中的“自动降级”中,我们这边将系统遇到“危险”时采取的整套应急方案和措施统一称为降级或服务降级。想要帮助服务做到自动降级,需要先做到如下几个步骤: 可配置的降级策略&am…

from表单提交和JSON区别

form表单是“键值对”的数据格式,例如: a1&b2&c3 而json格式则与之不同,如下: {"a":1,"b":2,"c":3} 传递的数据比较简单,那么两种方式基本上没什么大区别(当然后台接…

在一个数组中,如何确定所需元素在数组中的位置.

package wac.wev.LianXi; public class CiShu {public static void main(String[] args){//创建一个数组int[] arr {101,23,123,34,13};int y Yuan(arr,13);System.out.println(y);}//1)明确返回值:int//2)明确形式参数:int[] arr 和 int value(value表示所需元素)public stati…

Java实现Excel导入数据库,数据库中的数据导入到Excel

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 实现的功能: Java实现Excel导入数据库,如果存在就更新数据库中的数据导入到Excel1、添加jxl.jar mysql-connect…

FreeBSD 10 将使用 Clang 编译器替换 GCC

来自 phoronix 的消息称,根据 FreeBSD 2012 第一季度的状态报告 显示,来自 LLVM 的 Clang 编译器将成为 FreeBSD 10 的默认 C/C 编译器,废弃使用 GPL 授权协议的 GCC,而 Clang 的授权协议是 BSD。 Clang 是一个 C 编写、基于 L…

HashMap中数组初始化的秘密

2019独角兽企业重金招聘Python工程师标准>>> 我们知道,在新建一个HashMap对象时,无论传的initialCapacity参数值为多少,最总HashMap中数组的长度始终为2的n次方,代码如下: static final int tableSizeFor(i…

PLSQL 安装+配置( Oracle数据库连接工具 )

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.找到免安装版本 PLSQL 解压到自己想放的位置 (比如 D:\ChengXu\PLSQL\PLSQL) 2.配置环境变量 : 系统变量…

什么是Nginx?为什么使用Nginx?

一、前言为毛要用nginx服务器代理,不直接用tomcat 7.0,还做多了一次接请求?这个是我想问的,公司的新项目是要用Nginxtomcat7jdk开发的,用户命名可以直接访问tomcat,为啥还要用Nginx?这货是个啥玩…

遵循五大设计理念 打造出色设计师

与其他设计不同,网页设计会随着时间的改变而不断改变着。因此,网页设计师需要不断的自我提升,了解最前沿的设计趋势以便能够设计出更加新颖的网站。 两年前,网页设计呈现出一片新的思维方式和新颖的设计趋势使得该领域彰显出一片…

shell符号

*: 通配符 *.c : c结尾的文件 *v : v结尾的文件 v* : v开头的文件转载于:https://www.cnblogs.com/runlgs/p/9685751.html

伪共享和缓存行填充,Java并发编程还能这么优化!

前言 关于伪共享的文章已经很多了,对于多线程编程来说,特别是多线程处理列表和数组的时候,要非常注意伪共享的问题。否则不仅无法发挥多线程的优势,还可能比单线程性能还差。随着JAVA版本的更新,再各个版本上减少伪共享…

mysql中like % %模糊查询

1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。 比如 SELECT * FROM [user] WHERE u_name LIKE %三% 将会把u_name为“张三”,“张猫三…

Java中判断字符串是否为数字的五种方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 推荐使用第二个方法,速度最快。 方法一:用JAVA自带的函数 Java代码 public static boolean isNumeric(String…

慕学在线网0.4_xadmin后台管理

admin是基于Django开发的后台管理框架,方便,快捷,而且简单;   而xadmin就相当于admin的升级版,更加强大。    1、安装xadmin(源码安装方式)  教程 PS: - 卸载pip安装的xadminp…