Java----代码块(阿里笔试题详解)_#define微光的博客-程序员秘密

技术标签: Java代码块  编程  静态块执行顺序  代码块执行优先顺序  Java四种代码块  

首先我们来看一段代码,这是一道某ALBB企业的校招笔试题

package com.bittech;

/**
 * Author:weiwei
 * description:代码块执行顺序
 * Creat:2019/3/26
 **/

public class HelloA {
    //构造方法
    public HelloA(){
        System.out.println("Hello A!父类构造方法");
    }
    //非静态代码块
    {
        System.out.println("i am A class.父类非静态代码块");
    }
    //静态代码块
    static {
        System.out.println("static A 父类静态代码块");
    }
}
class HelloB extends HelloA{
    //构造方法
    public HelloB(){
        System.out.println("Hello B!子类构造方法");
    }
    //非静态代码块
    {
        System.out.println("i am B class.子类非静态代码块");
    }
    //静态代码块
    static {
        System.out.println("static B 子类静态代码块");
    }

    public static void main(String[] args) {
        System.out.println("======start=========");
        new HelloA();
        new HelloB();
        System.out.println("========end===========");
    }
}

此题考查的是代码块执行的顺序

运行结果:

static A 父类静态代码块
static B 子类静态代码块
======start=========
i am A class.父类非静态代码块
Hello A!父类构造方法
i am A class.父类非静态代码块
Hello A!父类构造方法
i am B class.子类非静态代码块
Hello B!子类构造方法
========end===========

Process finished with exit code 0

那么下面来看为什么会是这样的顺序呢?

1. 代码块

代码块的定义:用{}定义的一段代码

根据代码块定义的位置及关键字,代码块分为以下四种:

  • 普通代码块
  • 构造块
  • 静态块
  • 同步代码块

1.1 普通代码块

普通代码块:定义在方法中的代码块

观察普通代码块

package com.bittech;

/**
 * Author:weiwei
 * description:普通代码块
 * Creat:2019/3/26
 **/
public class Testcode1 {
    public static void main(String[] args) {
        {
            //直接使用{}定义,普通方法块
            int x = 10;
            System.out.println("x="+x);
        }
        int x = 10;
        System.out.println("x="+x);
    }
}

一般如果方法中代码过长,为避免变量重名,使用普通代码块,使用较少,理解概念即可 

1.2 构造块

构造块:定义在类中的代码块(不加修饰符)

观察构造块

package com.bittech;

/**
 * Author:weiwei
 * description:构造块
 * Creat:2019/3/26
 **/
class Person{
    {
        //定义在类中,不加任何修饰符,构造块
        System.out.println("1. Person类的构造块");
    }
    public Person(){
        System.out.println("2.Person类的构造方法");
    }
}
public class Testcode2 {
    public static void main(String[] args) {
        new Person();
        new Person();
    }
}

运行结果:

1. Person类的构造块
2.Person类的构造方法
1. Person类的构造块
2.Person类的构造方法

Process finished with exit code 0

 通过以上代码发现:构造块优于构造方法执行,而且每产生一个新的对象就调用一次构造块

1.3 静态代码块

静态代码块:使用static定义的代码块

根据静态代码块所在的类不同可以分为:

  • 在主类中的静态代码块
  • 在非主类中的静态代码块

(1)观察在非主类中的静态代码块 

package com.bittech;

/**
 * Author:weiwei
 * description:非主类静态代码块
 * Creat:2019/3/26
 **/

class Person{
    {
        //定义在类中,不加任何修饰符,构造块
        System.out.println("1. Person类的构造块");
    }
    public Person(){
        System.out.println("2.Person类的构造方法");
    }
    static {//定义在非主类的静态代码块
        System.out.println("Peron类的静态块");
    }
}
public class Testcode3 {
    public static void main(String[] args) {
        System.out.println("=========start=========");
        new Person();
        new Person();
        System.out.println("=========end===========");
    }
}

 运行结果:

=========start=========
Peron类的静态块
1. Person类的构造块
2.Person类的构造方法
1. Person类的构造块
2.Person类的构造方法
=========end===========

Process finished with exit code 0

通过以上代码块发现:

  • 非主类静态代码块优于构造块执行
  • 无论产生多少实例化对象,静态块都只执行一次 

静态块的主要作用是为static属性进行初始化

(2)观察在主类中的代码块

 

package com.bittech;

/**
 * Author:weiwei
 * description:主类中的静态块
 * Creat:2019/3/26
 **/
public class Testcode4 {
    {
        System.out.println("Testcode4的构造块");
    }
    public Testcode4(){
        System.out.println("Testcode4的构造方法");
    }
    static{
        System.out.println("Testcode4的静态块");
    }

    public static void main(String[] args) {
        System.out.println("=======start========");
        new Testcode4();
        new Testcode4();
        System.out.println("========end=========");
    }
}

 运行结果:

Testcode4的静态块
=======start========
Testcode4的构造块
Testcode4的构造方法
Testcode4的构造块
Testcode4的构造方法
========end=========

Process finished with exit code 0

通过以上代码发现:

  • 在主类中定义的静态块在主方法(main)之前执行

总结:

代码块优先顺序

  1. 静态块>构造块>构造方法
  2. 父类>子类
  3. 非主类的静态块优于构造块,但不优于主方法
  4. 主类中的静态块优于主方法(main)执行,优于构造块
  5. 构造块优于构造方法执行

在一个既有父类又有子类,且都有静态块,构造块,构造方法的时候执行顺序如下:

  • (1)先是父类静态块
  • (2)后是子类静态块
  • (3)父类非静态块
  • (4)父类构造块
  • (5)子类非静态块
  • (6)子类构造块

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43224539/article/details/88828557

智能推荐

达梦数据库 手册说明_jl_li的博客-程序员秘密

达梦数据库提供了非常详细的手册,安装之后均可看到。相关目录为:WINDOWS 平台:c:\dmdbms\docLinux 平台:/opt/dmdbms/doc分两类:一、常规手册:DM7 系统管理员手册DM7 SQL语言使用手册.DM7 程序员手册二、特殊手册(针对DM7的某个高级功能点,进一步细化的手册):DM7 dexp和dimp使用手册DM7 Disql使用手册...

OCJP (1Z0-808) 个人笔记(1)_晴岚听枫的博客-程序员秘密

//仅为个人笔记,目前完善中1.static变量count为Test类中所有方法共有,两次changeCount使count最终为10,check1.count=check2.count。2.本题product.toLowerCase()与product.concat("BOX".toLowerCase())均可实现,但实现后并没有保存到一个参数中。product最后存放的依然是Pen,仅有0,2...

学习笔记(十)——索引的应用技巧和注意事项_baman1774的博客-程序员秘密

学习笔记(十)——索引的应用技巧和注意事项1、创建包含列的非聚集索引(将空间上的优势转变成时间上的优势)创建代码如下:select*fromDimEmployee;CREATENONCLUSTEREDINDEXcustomernameONDimCustomer(CustomerAlternateKeyASC)INCLUDE(LastName,FirstNa...

24岁华为Java程序员工资表曝光,牛逼的人注定会牛逼_公众号-老炮说Java的博客-程序员秘密

周末和学弟一起吃了个饭,他比较牛逼的,没毕业几年已经进华为了,在他的朋友圈晒出了一年前的工资表。同样20来岁的年纪,为什么人家可以年入百万,一个项目奖金就比得上别人一年的工资?他经历就是...

Oracle trunc()函数的用法_Timegoeson的博客-程序员秘密

Oracle trunc()函数的用法TRUNC(for dates)  TRUNC函数为指定元素而截去的日期值。  其具体的语法格式如下:TRUNC(date[,fmt])其中:date 一个日期值,fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去。  下面是该函数的使用情况:TRUNC(TO_DATE(‘24-Nov-1999 08:00 pm’...

【论文阅读#3】FLOWPRINT : Semi-Supervised Mobile-App Fingerprinting on Encrypted Network Traffic_Elivyxy的博客-程序员秘密

一、论文信息本文是发表在NDSS 2020上的一篇文章,作者在本文中提出了一种从加密的网络流量中提取移动应用程序指纹的半监督方法。该方法可以有效识别Android和iOS上的应用程序且不需要先验知识,并且工作效率可控,实验结果远超目前最先进的解决方案。1.1、摘要原文Mobile-application fingerprinting of network traffic is valu...

随便推点

Xamarin.Forms WebView_weixin_30883777的博客-程序员秘密

目前本地或网络的网页内容和文件加载 WebView是在您的应用程序显示Web和HTML内容的视图。不像OpenUri,这需要用户在Web浏览器的设备上,WebView中显示您的应用程序内的HTML内容。 本指南由以下几部分组成: 内容- web视图支持各种内容源,包括嵌入的HTML,网页和HTML字符串。 ...

详解java虚拟机方法调用_伯努力不努力的博客-程序员秘密

方法调用方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。所有方法调用中的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用,这种解析能成立的前提是:方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。 换...

Pandas 简单例子_霜序0.2℃的博客-程序员秘密_pandas简单例子

Pandas作业import pandas as pdimport numpy as npprint(pd.__version__)1.1.31. 创建一个如下所示的DataFrame`AppleBanana2017 Sale35212018 Sale41342. 从list,dict,numpy array 创建Series#输入import numpy as npa_list = list("abcdefg")numpy_array =

vue-element-admin我踩的坑(9)_nailgo的博客-程序员秘密

element-ui的transfer组件选项过长问题解决使用element-ui的transfer组件不可避免出现选项过长问题:我这里的解决方案是使用transfer的render-content自定义渲染函数,里面添加element-ui的tooltip组件,对超长的选项进行提示。1.绑定渲染函数<el-transfer :render-content="...

神奇的魔法数_LiuXingLong的博客-程序员秘密

神奇的魔法数Time Limit: 1000msMemory Limit: 32768KBThis problem will be judged on FZU. Original ID: 189664-bit integer IO format: %I64d      Java class name: MainPrev Submit Status Stati

==和equals_H3nry的博客-程序员秘密

一、==和equals的区别==它的作用是判断连个对象的地址是否相等。即判断两个对象是否同一个对象(基本数据类型比较值,引用数据类型比较内存地址)因为Java只有值传递,所以对于==来说,不管是比较基本数据类型,还是比较引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。equals()它的作用也是判断两个对象是否相等,它不能用于比较基本数据类型的变量。equals() 方法存在于 Object 类中,而 Object 类是所有类的直接或间接父类。public boo