文档章节

代码块与构造方法

 烟中泪
发布于 2017/02/24 21:07
字数 684
阅读 1
收藏 0

Java静态代码块、构造代码块、构造方法的执行顺序

静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。
执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步
1,super语句,可能出现以下三种情况:
1)构造方法体的第一行是this语句,则不会执行隐式三步,
2)构造方法体的第一行是super语句,则调用相应的父类的构造方法,
3)构造方法体的第一行既不是this语句也不是super语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因;
2,初始化非静态变量
3,构造代码块
由此可知,构造代码块优先于构造方法的方法体,但是this关键字跟super关键字不能同时出现,而且只能在代码的第一行。如果出现了this关键字,隐式三步就不会执行。
例如,分析下面的代码及执行结果,已经用注释标出了执行步骤Step 1–Step 7。
也就是说,当递归调用多个构造方法的时候,构造代码块只会在最后的(也即方法体第一行不是this语句的)那个构造方法执行之前执行!

public class Test {
    public static int a = 0;

    static {// Step 1
        a = 10;
        System.out.println("静态代码块在执行a=" + a);
    }

    {// Step 4
        a = 8;
        System.out.println("非静态代码块(构造代码块)在执行a=" + a);
    }

    public Test() {
        this("调用带参构造方法1,a=" + a); // Step 2
        System.out.println("无参构造方法在执行a=" + a);// Step 7
    }

    public Test(String n) {
        this(n, "调用带参构造方法2,a=" + a); // Step 3
        System.out.println("带参构造方法1在执行a=" + a); // Step 6
    }

    public Test(String s1, String s2) {
        System.out.println(s1 + ";" + s2);// Step 5
    }

    public static void main(String[] args) {
        Test t = null;// JVM加载Test类,静态代码块执行
        System.out.println("下面new一个Test实例:");
        t = new Test();
    }
}

 

执行结果:

静态代码块在执行a=10
下面new一个Test实例:
非静态代码块(构造代码块)在执行a=8
调用带参构造方法1,a=10;调用带参构造方法2,a=10
带参构造方法1在执行a=8
无参构造方法在执行a=8

本文转载自:http://blog.csdn.net/kingzone_2008/article/details/45015301

共有 人打赏支持
上一篇: 继承
下一篇: this关键字
粉丝 0
博文 25
码字总数 8535
作品 0
私信 提问
Java的4种代码块

一、普通代码块   直接在一个方法中出现的{}就称为普通代码块,例子程序如下:   public class CodeDemo01{   public static void main(String[] args){   //普通代码块   {   i...

城固如春
2016/10/26
5
0
Java 静态代码块 构造方法 构造代码块/普通代码块 执行顺序

1.执行优先级由高到低依次为: 静态代码块 > main方法 > 构造代码块 > 构造方法 2.示例: package com.river.turn; public class Demo1 { } 运行结果为: 静态代码块main method构造代码块/普通...

JackyRiver
03/28
0
0
类装载步骤

类装载步骤 在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的...

北极之北
2016/03/10
129
0
Java中的四种代码块

1.普通代码块:就是直接在一个方法中出现的{}就称为普通代码块 2.构造代码块:构造方法中的代码块 3.静态代码块:使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态...

秋风醉了
2014/03/29
37
0
静态代码块、构造代码块、构造函数的区别

首先,静态代码块,构造代码块,和构造函数都存在于一个类中,只不过,他们执行的先后顺序和执行的次数不同。 静态代码块,只执行一次,比如,当你想要创建10个对象时,当创建第一个对象时,...

Clarence_D
03/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

不可不说的Java“锁”事

前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点...

美团技术团队
19分钟前
1
0
ali oss util demo

package com.example.demo;import com.aliyun.oss.OSSClient;import com.aliyun.oss.common.utils.BinaryUtil;import com.aliyun.oss.model.*;import org.slf4j.Logger;import o......

经常把天聊死的胖子
20分钟前
1
0
Windows系统中eclipse修改字体为Courier New

背景:在eclipse修改字体时没有找到Courier New字体; 解决: 1.在计算机地址栏上输入“C:\Windows\Fonts”路径,回车打开Win10字体文件夹。查看是否有Courier New字体;如下图: 2.如果有该...

anlve
21分钟前
1
0
使用hexo做博客网站

hexo有什么用? hexo 可以把md文件生成html静态网页。 hexo官网:https://hexo.io/zh-cn/ 本地安装hexo。 npm install -g hexo-cli#生成blog(名字任意)文件夹,并且在这个文件夹里面初始化...

王坤charlie
21分钟前
2
0
RabbitMQ+PHP 教程四(Routing)用yii2测试通过

开始 在本教程中,我们将为它添加一个特性——我们将只可能订阅消息的一个子集。例如,我们只能够将关键错误消息直接指向日志文件(以节省磁盘空间),同时仍然能够打印控制台上的所有日志消...

hansonwong
25分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部