博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java新建对象的static块与构造器的执行顺序
阅读量:6912 次
发布时间:2019-06-27

本文共 2717 字,大约阅读时间需要 9 分钟。

前言:本文解决的问题

  • 新建一个对象静态代码块什么时候执行
  • {}里面的代码什么时候执行
  • 有继承关系时的执行顺序

1.问题出现的背景:

构造器是用来实例化一个对象,当我们使用new关键字来新建对象时,构造器就会被调用。如果class中含有静态代码块(static)和普通代码块(在{}括号下),新建对象时的调用顺序是:静态代码块>{里面的代码}>构造器

2.例子说明:

2.1代码说明

//父类public class StaticExample{     {        System.out.println("***This is normal block***");    }        static {        System.out.println("This is first static block");    }    public StaticExample(){        System.out.println("This is constructor");    }           public static String staticString = "Static Variable";    static {        System.out.println("This is second static block and "                                                    + staticString);    }       static {        staticMethod();        System.out.println("This is third static block");    }    public static void staticMethod() {        System.out.println("This is static method");    }    public static void staticMethod2() {        System.out.println("This is static method2");    }} //子类public class StaticSubClass extends StaticExample{    static {        System.out.println("This is the subclass static block");    }    {        System.out.println("***This is the initialise block in subcluss***");    }    public StaticSubClass() {        System.out.println("This is the subclass constructor");    }//测试    public static void main(String[] args){        StaticSubClass statEx = new StaticSubClass();        StaticExample.staticMethod2();    }}

2.1运行结果

This is first static block

This is second static block and Static Variable
This is static method
This is third static block
This is the subclass static block
This is initialise block base
This is base constructor
This is the initialise block in subcluss
This is the subclass constructor
This is static method2

3.结果分析:

3.1static代码块先执行

先分别执行基类的两个静态代码块,然后执行父类的静态代码块,由于父类静态代码块中含有静态方法,因此执行staticMethod(),然后再执行子类的静态代码块,输出为:

This is first static block

This is second static block and Static Variable
This is static method
This is third static block
This is the subclass static block

3.2新建父类,执行初始化代码块

执行完初static代码块后,再执行父类初始化代码块,然后执行父类的构造器,输出为:

This is initialise block base

This is base constructor

3.3新建子类,执行初始化代码块

输出为:

This is the initialise block in subcluss

This is the subclass constructor

3.3执行子类中的方法

最后调用继承父类的方法staticMethod2(),输出:

This is static method2

4.总结

使用new关键字新建对象时,

  • 首先执行static代码块中的,当存在继承关系时,限制性父类的static代码块,然后执行子类的static
  • 其次执行{}初始化代码块,当有继承关系时,执行父类的初始代码块,然后执行父类构造器。
  • 最后执行构造器

5.关于类中static代码块注意事项

  • 不能使用this关键字,因为还没有实例化(You cannot use the this keyword since there is no instance.)
  • 也不能使用super(You shouldn’t try to access super since there is no such a thing for static blocks.)
  • 不要返回值(You should not return anything from this block.)


转载于:https://www.cnblogs.com/java-learner/p/9559206.html

你可能感兴趣的文章
Delphi的三目运算 ifthen 和iif
查看>>
libcurl多线程超时设置不安全(转)
查看>>
3种web会话管理的方式
查看>>
Atitit 常用比较复杂的图像滤镜 attilax大总结
查看>>
ife任务刷题总结(一)-css reset与清除浮动
查看>>
JSContext
查看>>
字符识别(模板匹配&BP神经网络训练)
查看>>
【转】iOS 删除已经配置的类库和移除CocoaPods
查看>>
Python 列表
查看>>
[java] jsoup 解析网页获取省市区域信息
查看>>
如何限制用户在某一时间段多次访问接口
查看>>
Linux-4.4-x86_64 内核配置选项简介【转】
查看>>
linux中service *** start与直接运行/usr/bin/***的区别
查看>>
BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
查看>>
开源网址
查看>>
国际C语言混乱代码大赛代码赏析(一)【转】
查看>>
ArcGIS Engine中空间参照(地理坐标)相关方法总结
查看>>
linux重启服务的脚本命令
查看>>
[Ramda] Declaratively Map Data Transformations to Object Properties Using Ramda evolve
查看>>
修改MySQL数据库中表和表中字段的编码方式的方法
查看>>