IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java中的代码块(含实例及解析) -> 正文阅读

[Java知识库]Java中的代码块(含实例及解析)

Java中的代码块

代码块:

在java中,用{}括起来的内容统称为代码块

一、普通代码块

也就是类中方法的方法体,普通代码块不能单独存在,
它必须紧跟在方法名的后面,而且通过方法名去调用方法体中的内容执行
语法格式:
	public class 类名 {
        [修饰符列表] 返回值类型 方法名(形式参数列表){
			//普通代码块
		}
    }
例子
public class Test {
    public static void main(String[] args) {
        //调用方法
        say();
    }

    private static void say() {
        //这里面的具体方法实现细节都是方法体
        System.out.println("该方法被调用了!");
    }
}
运行截图

image-20220315103023277

二、构造代码块

又叫实例语句块。在类中直接定义,没有任何前缀、后缀、修饰符的代码块

一个类中至少有一个构造方法,注意的是:构造代码块在类加载的时候并没有执行

而是在构造方法执行之前,自动执行构造代码块中的语句,这个特殊的点也被叫做“对象构建时机”
语法形式:
	public class 类名 {
        /**
         * 构造代码块
         * */

        {
            构造代码块
        }
    }

例子
public class Test {
    public static void main(String[] args) {
        //创建Test对象测试构造代码块与构造方法的执行顺序
        Test test01 = new Test();
        System.out.println("=====我是一个分界线========");
        Test test02 = new Test();
    }

    /**
     * 构造代码块
     * */

    {
        System.out.println("构造代码块执行!");
    }

    /**
     * 无参构造
     * */
    public Test() {
        System.out.println("Test对象被创建");
    }
}
运行截图

image-20220315100613075

三、静态代码块

1、语法格式:
	static {
		java语句;
		java语句;
	}
2、执行时机
	类加载时执行。并且'在main方法执行之前执行 且 只执行一次'
3、静态代码块一般是按照自上而下的顺序执行。
4、静态代码块的作用:
    	静态代码块这种语法机制实际上是一个特殊的时刻/时机
		这个时机叫做:类加载时机
    比如:
    	需要记录那个类在什么时候被加载到jvm中,这些记录日志信息的代码块就写到静态代码块中
例子
package com.blog;


import java.text.SimpleDateFormat;
import java.util.Date;

import static java.lang.Thread.sleep;

public class Test {

    //静态代码块
    static {
        //输出静态代码块执行时当前时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        System.out.println("静态代码块执行时当前时间"+sdf.format(new Date()));
        
        //执行后线程睡眠1秒,用于区分
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //主方法入口
    public static void main(String[] args) {
        //输出main方法执行时当前时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
        System.out.println("main方法执行时当前时间"+sdf.format(new Date()));
        
        //执行后线程睡眠1秒,用于区分
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
运行截图

image-20220315102754941

四、同步代码块

使用 synchronized 关键字修饰,并使用“{}”括起来的代码片段,
它表示同一时间只能有一个线程进入到该方法块中,是一种多线程保护机制。
在多线程环境下,对共享数据的读写操作是需要互斥进行的,
否则会导致数据的不一致性。同步代码块需要写在方法中。
例子
package com.blog;


/**
 * @author 尽欢
 */
public class Test {
    public static void main(String[] args) {
        Demo demo01 = new Demo();
        //两个线程公用同一个对象(会出现抢占使用权限情况)
        Thread thread01 = new Thread(new MyTestThread(demo01), "线程a");
        Thread thread02 = new Thread(new MyTestThread(demo01), "线程b");
        thread01.start();
        thread02.start();
    }
}

class MyTestThread extends Thread {
    //创建一个Demo对象
    private Demo demo;

    /**
     * 构造方法
     * */
    public MyTestThread(Demo demo) {
        this.demo = demo;
    }

    public MyTestThread() {
    }

    /**
     * run方法入口
     * */
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //调用方法修改num的值
        numCheck();
    }

    public void numCheck() {
        synchronized (Demo.class) {
            //打印抢占成功的线程(此时各个线程抢占机会均等)
            System.out.println(Thread.currentThread().getName()+"开始执行:");
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (demo.num > 0) {
                    //打印num的值并更新
                    System.out.println(Thread.currentThread().getName() + ",此时num的值为:" + demo.num--);
                } else {
                    System.out.println(Thread.currentThread().getName() + "执行结束!");
                    break;
                }
            }
        }
    }
}

class Demo {
    public int num = 10;
}
运行截图

image-20220315105503868

image-20220315105547403

构造代码块以及静态代码块的执行顺序

普通代码块也就是方法:只有在通过方法名调用的时候才会执行
那么构造代码块以及静态代码块的执行顺序是怎样的呢?	
分析一下:(BB了半天,为什么不用流程图呢?上图)

流程图

在这里插入图片描述

例子
package com.blog;


/**
 * @author 尽欢
 */
/**
 * 父类Test
 * */
public class Test {

    /**
     * main方法入口
     * */
    public static void main(String[] args) {
        new LittleTest();
    }
    static {
        System.out.println("父类静态代码块执行!");
    }

    {
        System.out.println("父类构造代码块执行!");
    }

    public Test() {
        System.out.println("父类构造方法执行!");
    }
}
class LittleTest extends Test{
    static {
        System.out.println("子类静态代码块执行!");
    }

    {
        System.out.println("子类构造代码块执行!");
    }

    public LittleTest() {
        System.out.println("子类构造方法执行!");
    }
}
运行截图

image-20220315110844806

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:07:36  更:2022-03-16 22:10:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:01:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码