关于静态代码块

静态代码块的写法:

static {
  System.out.println("我是静态代码块");
}

静态代码块的特点:

1.执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。

2.随着类的加载而执行,而且只执行一次

先说一下类加载,一个程序要想运行,首先要把代码加载到内存中,然后才能去和CPU交流,这是冯诺依曼计算机规定的。Java也是一样,Java的.class字节码文件要想执行,首先也要加载到内存,由类加载器把字节码文件的代码加载到内存中,这一步就叫类加载,这是首先要进行的。

关于非静态代码块:

非静态代码块的写法:

{
  System.out.println("我是非静态代码块");
}

非静态代码块的特点:

1.执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行。

2.非静态代码块在每new一次就执行一次

静态代码块与非静态代码库的异同点:

相同点:

都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。

不同点:

1.静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构造方法)。

静态代码块只在第一次new执行一次,之后不在执行,而非静态代码块在每new一次就执行一次。非静态代码块可以     在普通方法中定义(个人感觉作用不大);而静态代码块不行。

2.静态代码块是自动执行的;

静态方法是被调用的时候才执行的;

作用:

静态代码块可以用来初始化一些项目最常用的变量和对象;静态方法可以用作不创建对象也可以能需要执行的代码。

关于构造函数:

构造函数写法:

public class Father{
  Father(){
    System.out.println("我是构造函数");
  }
}

构造函数的特点:

1.构造函数的名字必须和类名完全相同,构造函数不能有
2.返回值,不写void,构造函数不可以被子类继承
3.构造函数可以重载但是不可以被子类覆盖。

关于静态代码块,非静态代码块及构造函数的执行顺序

1.只在父类Class中测试

public class Father {
static {
System.out.println("父类的静态代码块");
} {
System.out.println("父类的非静态代码块");
} Father() {
System.out.println("父类的构造函数");
} public static void main(String[] args) {
System.out.println("new父类前的main方法");
new Father();
System.out.println("new父类后的main方法");
}
}

总结:

只在父类Class中的执行顺序:

静态代码块>new 对象前的main方法顺序执行>非静态代码块>构造函数>new 对象后的main方法顺序执行

2.在继承了父类的子类Class中测试

public class Son extends Father {
static {
System.out.println("子类的静态代码块");
} {
System.out.println("子类的非静态代码块");
} Son() {
System.out.println("子类的构造函数");
} public static void main(String[] args) {
System.out.println("new子类前的main方法");
new Son();
System.out.println("new子类后的main方法");
}
}

总结:

在继承了父类的子类Class中的执行顺序:

父类的静态代码块>子类的静态代码块>new 对象前的main方法顺序执行>父类的非静态代码块>父类的构造函数>子类的非静态代码块>子类的构造函数>new 对象后的main方法顺序执行

3.在父类的Class中测试继承了父类的子类Class

public class Father {
static {
System.out.println("父类的静态代码块");
} {
System.out.println("父类的非静态代码块");
} Father() {
System.out.println("父类的构造函数");
} public static void main(String[] args) {
System.out.println("new子类前的main方法");
new Son();
System.out.println("new子类后的main方法");
}
}

总结:

在父类的Class中测试继承了父类的子类Class中的执行顺序:

父类的静态代码块>new 对象前的main方法顺序执行>子类的静态代码块>父类的非静态代码块>父类的构造函数>子类的非静态代码块>子类的构造函数>new 对象后的main方法顺序执行

第3个(在父类的Class中测试继承了父类的子类Class)和第2个(在继承了父类的子类Class中测试)对比:

左图是在父类中new 子类然后执行main方法,右图是子类中new 子类然后执行main方法

可以看出来,父类new 子类之前,先执行父类的静态代码块,然后main函数里面的代码顺序执行,直到new 了子类,然后执行子类的静态代码块,然后父类非静态代码块>父类构造函数>子类非静态代码块>子类构造函数>new子类后的main方法顺序执行 在父类中执行了main方法,本身父类执行main方法就会执行一次静态代码块,但是在父类中main方法new了一次子类,按继承关系,父类中的静态代码块应该还会执行,但是控制台中却没有打印,这就是因为静态代码块的特征的原因所致,随着类的加载而执行,而且只执行一次.

如果还是有疑问,则看一下代码:

java中静态代码块,非静态代码块,构造函数的更多相关文章

  1. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

  2. 静态代码块&非静态代码块&构造函数

    总结:静态代码块总是最先执行.非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行.父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态 ...

  3. java synchronized静态同步方法与非静态同步方法,同步语句块

    摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...

  4. java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

    java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_Stat ...

  5. Java中替换HTML标签的方法代码

    这篇文章主要介绍了Java中替换HTML标签的方法代码,需要的朋友可以参考下 replaceAll("\\&[a-zA-Z]{0,9};", "").r ...

  6. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...

  7. java中CRUD(增删查改)底层代码的实现

    java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...

  8. Java静态同步方法和非静态同步方法

             所有的非静态同步方法用的都是同一把锁——该实例对象本身.也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁进而执行 ...

  9. Java 中 try、catch、finally 语句块的执行顺序

    假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...

  10. Java中的守护线程 & 非守护线程(简介)

    Java中的守护线程 & 非守护线程 守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守 ...

随机推荐

  1. jenkins部署Vue项目 & 远程到远程服务

    只是记录下自己是怎么配置的,方便自己以后要用的时候查阅 如果使用nodejs打包则需要上图中的脚本,nodejs只是把JavaScript代码去掉空格个换行变成不易于人阅读的方式 (为了方便复制而已, ...

  2. (3)Linux命令分类汇总(7~12)

    Linux命令分类汇总(7~12) (七)用户管理命令(12个) 1    useradd cdgs   添加用户. 2     usermod 修改系统已经存在的用户属性. 3    userdel ...

  3. MySql中的count、NULL和空串的区别

    **1.count (1).count (*) 与 count (列名) 的区别** 表 count(1) count(*) count (列名) 作用 统计表中的所有的记录数 会统计表中的所有的记录 ...

  4. SQL 查询建表SQL

    1.新建一个查询语句,按执行按钮 2.结果页面会显示一条sql语句,复制该语句即可建表 3.建表测试

  5. 我的vim开发环境搭建:C/C++/Go,持续更新中

    懒得在github博客上折腾评论功能,先借用博客园推广下,虽然好像也没什么用. 我的vim开发环境搭建(1): 准备工作 我的vim开发环境搭建(2): 常用的vim插件 我的vim开发环境搭建(3) ...

  6. poj3107(树的重心,树形dp)

    题目链接:https://vjudge.net/problem/POJ-3107 题意:求树的可能的重心,升序输出. 思路:因为学树形dp之前学过点分治了,而点分治的前提是求树的重心,所以这题就简单水 ...

  7. Java集合框架——Map接口

    第三阶段 JAVA常见对象的学习 集合框架--Map集合 在实际需求中,我们常常会遇到这样的问题,在诸多的数据中,通过其编号来寻找某一些信息,从而进行查看或者修改,例如通过学号查询学生信息.今天我们所 ...

  8. HTTPS 简单学习

    1. HTTP缺点 使用明文通信,内容可能会被窃听: 通信加密:使用SSL和TLS: 内容加密: 不验证通信方的身份,因此可能会遭到伪装: SSL提供加密和证书: 无法证明报文的完整性,因此会遭到修改 ...

  9. Redis 常用命令整理

    哈希表:设置秒中某个字段 HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN EX: 127.0.0.1:6380> hmset set_map LOGD ...

  10. jquery【点击】导航按钮的来回切换

    先获取元素的属性值,根据属性值进行判断,点击时对属性进行设置 <i class="layui-icon layui-icon-shrink-right" id="n ...