java中静态代码块与构造方法的执行顺序判断

 更新时间:2017年12月07日 15:20:57   作者:尚学堂明辉  
对静态代码块以及构造函数的执行先后顺序,一直很迷惑,直到最近看到一段代码,发现终于弄懂了,所以这篇文章主要给大家介绍了关于如何判断java中静态代码块与构造方法的执行顺序的相关资料,需要的朋友可以参考下。

前言

静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。

执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步:

1,super语句,可能出现以下三种情况:

      1)构造方法体的第一行是this语句,则不会执行隐式三步,

      2)构造方法体的第一行是super语句,则调用相应的父类的构造方法,

      3)构造方法体的第一行既不是this语句也不是super语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因;

2,初始化非静态变量;

3,构造代码块。

由此可知,构造代码块优先于构造方法的方法体,但是this关键字跟super关键字不能同时出现,而且只能在代码的第一行。如果出现了this关键字,隐式三步就不会执行。

先看看下面几个类,然后判断它们的输出:

public class A {

 static{
  System.out.print(1);
 }
 public A(){
  System.out.print(2);
 }
 }

 public class B extends A{

 static{
  System.out.print("a");
 }
 public B(){
  System.out.print("b");
 }
 }

 public class C {

 public static void main(String[] args){
  A a = new B();
  a = new B();
 }
 }

父类与子类执行的先后顺序

静态变量的执行特性

方法重写(override)的注意事项

1.当父类与子类都有静态代码块和构造函数的时候,执行顺序如下:

父类静态代码块 > 子类静态代码块

父类构造函数 > 子类构造函数(先有父亲,后有孩子)

如果是多级继承关系的话,最高层的父类首先执行,然后依次递减

总结:静态优先执行,父类优先执行

注意:静态代码块是在JVM加载类的时候执行的,而且静态代码块执行且仅执行一次

2.在调用类中的方法时,在方法体执行之前,首先要对类中的成员变量进行赋值,如果代码中没有赋具体的值,也有默认值。成员变量的赋值顺序按照前后顺序进行。

如果有既有直接赋值,也有构造方法赋值,那么根据先后顺序执行

3.重写(Override) 重载(Overload)

重载是方法名字,返回类型一致,唯一不同的是方法的参数不同(参数类型不同,或者参数类型不同)

重写:

  • 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致
  • 子类抛出的异常不能超过父类相应的方法抛出的异常
  • 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, private)

多态:

父类的引用指向了子类的对象,调用时执行的方法也是子类的方法,父类的方法并不会被执行,

所谓多态就是父类或者接口类型的引用可以指向子类或者实现该接口的类的实例(对象),

看了上面的说明,大家也应该知道上面的程序输出结果了。

输出结果为:1a2b2b

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 聊聊如何打印GC日志排查的问题

    聊聊如何打印GC日志排查的问题

    这篇文章主要介绍了聊聊如何打印GC日志排查的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java中的内存模型JMM详细解读

    Java中的内存模型JMM详细解读

    这篇文章主要介绍了Java中的内存模型JMM详细解读,Java 对内存的抽象模型如下,每个线程都有一块自己的私有内存(也称为工作内存),当线程使用变量时,会把主内存里面的变量复制到工作内存,线程读写变量时操作的是自己工作内存中的变量,需要的朋友可以参考下
    2023-12-12
  • Java接口自动化测试框架设计之Get请求方法和测试详解

    Java接口自动化测试框架设计之Get请求方法和测试详解

    这篇文章主要介绍了Java接口自动化测试框架设计 Get请求方法和测试,框架设计我们只是介绍基本的组件,而且框架设计没有想象那么难,一步一步跟着做就会了。这篇我们来演示,如果通过Java代码来实现一个用纯代码实现Http中的Get请求过程,需要的朋友可以参考下
    2019-07-07
  • Java结构型设计模式之组合模式Composite Pattern详解

    Java结构型设计模式之组合模式Composite Pattern详解

    组合模式,又叫部分整体模式,它创建了对象组的数据结构组合模式使得用户对单个对象和组合对象的访问具有一致性。本文将通过示例为大家详细介绍一下组合模式,需要的可以参考一下
    2022-11-11
  • mybatis plus的3种查询方式(小结)

    mybatis plus的3种查询方式(小结)

    这篇文章主要介绍了mybatis plus的3种查询方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java处理日期时间的方法汇总

    Java处理日期时间的方法汇总

    这篇文章主要给大家介绍了利用Java中的Calendar 类处理日期时间的方法汇总,其中包括取日期的每部分、取当月的第一天或最后一天、求两个日期之间相隔的天数以及一年前的日期等等的示例代码,有需要的朋友们可以直接参考借鉴,下面来一起看看吧。
    2016-12-12
  • 解决mybatis plus 分页查询有条数,total和pages都是零的问题

    解决mybatis plus 分页查询有条数,total和pages都是零的问题

    这篇文章主要介绍了解决mybatis plus 分页查询有条数,total和pages都是零的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • ant打包jar文件脚本分享

    ant打包jar文件脚本分享

    本文介绍的ant脚本是用来打包jar文件,做完JAVA应用一定会用到这个,需要的朋友可以参考下
    2014-03-03
  • 详解java操作Redis数据库的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoolUtil)

    详解java操作Redis数据库的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoo

    这篇文章主要介绍了java操作Redis数据库的redis工具,包括RedisUtil,jedis工具JedisUtil,JedisPoolUtil工具,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • java中StringBuffer的length()和capacity()方法对比

    java中StringBuffer的length()和capacity()方法对比

    这篇文章主要介绍了java中StringBuffer的length()和capacity()方法对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论