java中你知道的这四种代码块吗?

点击上方蓝字关注我们

大家好,我是雄雄,今天给大家分享的是:java中的四种代码块

什么叫代码块?

代码块就是将多行代码封装到一个“{}”中,形成一个独立的代码区,这就构成了代码块,一般常见的代码块是这样的:

Java中,代码块根据其执行的时机与声明的不同可以分为以下四类:

  • 普通代码块

  • 静态代码块

  • 同步代码块

  • 构造代码块

接下来我们依次介绍一下这4种代码块。

1.普通代码块

即在方法名后面用“{}”圈起来的代码块,那么在什么时候执行呢?当你调用该方法名时开始执行,调用依次执行一次,调用两次执行两次

代码如下:

public void info(){System.out.println("欢迎关注公众号【雄雄的小课堂】,嘿嘿!");}public static void main(String[] args) {info();}

运行结果:

很简单,就不多说了。

2.静态代码块

即在类中使用static修饰,后面“{}”中的那段代码块。那么在什么时候执行呢?在该类加载时就执行,并且只执行一次,一般用于加载驱动。代码如下:

public void info(){System.out.println("欢迎关注公众号【雄雄的小课堂】,嘿嘿!");}static{System.out.println("执行静态代码块");}public static void main(String[] args) {info();}

运行结果如下(在执行info方法时,先执行的静态代码块):

3. 同步代码块

即使用synchronized关键字修饰,并使用“{}”括起来的代码片段,它表示同一时间只能有一个线程进入到该方法中,是一种多线程保护机制。接下来我们举个例子来看看:

这个例子有点麻烦,我们假设有这样的需求:在趵突泉景区门票售票处有三个售票窗口,分别为1号窗口、2号窗口和3号窗口。当天票的数量是有限的,100张

现在开始来卖票,3个窗口同时来卖,还需要保证卖的票不能重复(根据实际情况,一张票只能卖一次),我们不用同步代码块,来模拟一下该业务。

售票类:

/***
*
* 项目名称:BianChengXiGuan
* 类名称:Ticket
* 类描述:售票类
* 创建人:Mu Xiongxiong
* 创建时间:2020-8-16 下午2:56:08
* 修改人:Mu Xiongxiong
* 修改时间:2020-8-16 下午2:56:08
* 修改备注:
* 个人博客:https://blog.csdn.net/qq_34137397
* 微信公众号:雄雄的小课堂
* @version
**/
public class Ticket implements Runnable {private int tickets = 100;//运行public void run() {while (true) {if (tickets <= 0) {System.out.println("不好意思,票卖完了");break;} else {System.out.println(Thread.currentThread() + "恭喜你买到票,票号"+ tickets);tickets--;}}}}

开始卖票:

public static void main(String[] args) {Ticket task = new Ticket();//窗口1Thread t1 = new Thread(task);//窗口2Thread t2 = new Thread(task);//窗口3Thread t3 = new Thread(task);//启动三个窗口开始售卖t1.start();t2.start();t3.start();}

接下来看看运行结果:

可以看到,编号为100的门票卖了3次!如何避免此类情况出现呢,就需要用到同步代码块,改正后的代码:

public void run() {synchronized (this) {while (true) {if (tickets <= 0) {System.out.println("不好意思,票卖完了");break;} else {System.out.println(Thread.currentThread() + "恭喜你买到票,票号"+ tickets);tickets--;}}}}

运行结果如下:

这样就没有问题了。

4.构造代码块

即在类中声明的时候没有修饰词,直接使用{}括起来的代码就是构造代码块。执行时机为:当执行每个(不管是有参还是无参)构造函数之前执行,代码如下:

public class TestMain {//构造代码块{System.out.println("执行构造代码块");}public TestMain(){System.out.println("执行无参构造方法");}public TestMain(int a){System.out.println("执行有参构造方法");}public static void main(String[] args) {TestMain test1 = new TestMain();TestMain test = new TestMain(3);System.out.println("执行完毕!!");}
}

运行结果为:

结果是不会骗我们的!

以上的就是java中的四种代码块,至于说用哪种得看你需求了,“因材施教”即可。

支持作者

赞赏就不用啦,生活都不易,右下角的“在看/赞”点一下,如果感觉文章不错,记得分享到朋友圈让更多人知道!

往期推荐

切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道


浅谈我的读书史(2)


浅谈我的读书史


“温室里的花朵”也要直面困难


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单例模式懒汉式(线程安全写法)

package com.atguigu.java1;/*** 使用同步机制将单例模式中的懒汉式改写为线程安全的** author shkstart* create 2019-02-15 下午 2:50*/ public class BankTest {}class Bank{private Bank(){}private static Bank instance null;public static Bank getInstance(){//方式一…

DDD理论学习系列(5)-- 统一建模语言

1.引言 上一节讲解了领域模型&#xff0c;领域模型主要是将业务中涉及到的概念以面向对象的思想进行抽象&#xff0c;抽象出实体对象&#xff0c;确定实体所对应的方法和属性&#xff0c;以及实体之间的关系。然后将这些实体和实体之间的关系以某种形式&#xff08;比如UML、图…

java中你知道这四种代码块吗?

大家好&#xff0c;我是雄雄&#xff0c;今天给大家分享的是&#xff1a;java中构造代码块的用法。 什么叫代码块&#xff1f;代码块将多行代码封装到一个{}中&#xff0c;形成一个独立的代码区&#xff0c;这就够成了代码块&#xff0c;一般常见的代码块是这样的&#xff1a; …

jzoj2152-终极数【堆】

题目&#xff08;复杂&#xff09; 给定一个长度为n的序列a&#xff0c;试求出对于序列a的每一个前缀的终极数x&#xff0c;使得 最小&#xff0c;试求出终极数t&#xff08;如若有多个终极数t&#xff0c;只需输出最小的那个&#xff09; 正解 其实就是求中位数… 输入 …

谈谈准确率(P值)、召回率(R值)及F值

转载自 谈谈准确率&#xff08;P值&#xff09;、召回率&#xff08;R值&#xff09;及F值 谈谈准确率&#xff08;P值&#xff09;、召回率&#xff08;R值&#xff09;及F值 一直总是听说过这几个词&#xff0c;但是很容易记混&#xff0c;在这里记录一下。希望对大家理解…

线程创建两种方式

方式一(继承于Thread类) 创建一个继承于Thread类的子类重写Thread类的run() --> 将此线程执行的操作声明在run()中创建Thread类的子类的对象通过此对象调用start() package com.wdl.java;//1. 创建一个继承于Thread类的子类 class MyThread extends Thread {//2. 重写Thre…

在ASP.NET CORE 2.0使用SignalR技术

一、前言 上次讲SignalR还是在《在ASP.NET Core下使用SignalR技术》文章中提到&#xff0c;ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划中。时间过得很快&#xff0c;MS已经发布了.NET Core 2.0 Preview 2 预览版&#xff0c;距离正式版已经不远了&#xf…

【jzoj】2018/2/2 NOIP普及组——D组模拟赛

前言 今天五道题&#xff0c;难度做起来感觉很难&#xff0c;其实就是纸老虎233。 正题 题目1&#xff1a;公牛数学&#xff08;jzoj1896&#xff09; 就是高精乘 输入 第1..2行&#xff1a;每行包含一个十进制数 输出 第1行&#xff1a;输出两个数乘积 样例输入 1111…

java中常见的几种内部类,你会几个?(未完)

点击上方蓝色关注我们&#xff01;大家好&#xff0c;我是雄雄&#xff0c;今天给大家介绍的是java中的几种内部类。java中常见的几个内部类&#xff0c;你会几个&#xff1f;我会四个&#xff01;在看每个新知识点时&#xff0c;我们不禁有这样或者那样的疑问&#xff0c;比如…

通俗理解信息熵

转载自 通俗理解信息熵 通俗理解信息熵 前段时间德川和我讲解了决策树的相关知识&#xff0c;里面德川说了一下熵&#xff0c;今天整理了一下&#xff0c;记录下来希望对大家理解有帮助~ 1、信息熵的公式 先抛出信息熵公式如下&#xff1a; 其中代表随机事件X为的概率&…

程序、进程、线程

程序(program) 是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象。 进程(process) 是程序的一次执行过程&#xff0c;或是正在运行的一个程序。是一个动态的过程&#xff1a;有它自身的产生、存在和消亡的过程。——生命周期 如…

.NET Core 2.0 Preview 2为开发人员带来改进

Microsoft发布了.NET Core 2第二个预览版&#xff08;Preview 2&#xff09;&#xff0c;该版本可用于Mac OS X、Linux和Windows平台。Preview 2首次给出了对所有平台上各种软件包和安装程序的统一命名模式。所有的运行时文件将以"dotnet-运行时名称”命名&#xff0c;而S…

java中,剩下的这两个内部类不太好理解!

点击上方蓝色关注我们&#xff01;大家好&#xff0c;我是雄雄&#xff0c;今天我们接着昨天的分享&#xff0c;将剩余的两个内部类&#xff08;方法内部类和匿名内部类&#xff09;结束掉&#xff0c;这两个内部类都不太好理解。昨天的推文&#xff1a;java中常见的几种内部类…

【jzoj】2018.2.3NOIP普及组——D组模拟赛

前言 万年D组系列… 正题 题目1&#xff1a;数池塘&#xff08;jzoj1898&#xff09; 有一个地方有一些积水&#xff0c;连着的积水是一个池塘&#xff0c;求池塘数。 输入 第1行&#xff1a;由空格隔开的两个整数&#xff1a;N和M 第2..N1行&#xff1a;每行M个字符代表…

并行与并发

**并行&#xff1a;**多个CPU同时执行多个任务。比如&#xff1a;多个人同时做不同的事。 **并发&#xff1a;**一个CPU(采用时间片)同时执行多个任务。比如&#xff1a;秒杀、多个人做同一件事。

通俗理解条件熵

转载自 通俗理解条件熵 通俗理解条件熵 前面我们总结了信息熵的概念通俗理解信息熵,这次我们来理解一下条件熵。 1、信息熵以及引出条件熵 我们首先知道信息熵是考虑该随机变量的所有可能取值&#xff0c;即所有可能发生事件所带来的信息量的期望。公式如下&#xff1a; 我…

WebAssembly:随风潜入夜

What&#xff1f; WebAssembly 是一种二进制格式的类汇编代码&#xff0c;可以被浏览器加载和并进一步编译成可执行的机器码&#xff0c;从而在客户端运行。它还可以作为高级语言的编译目标&#xff0c;理论上任何语言都可以编译为 WebAssembly。 我们知道汇编语言就是机器码的…

让java的多重继承成为现实!

点击上方蓝色关注我们&#xff01;大家好&#xff0c;我是雄雄&#xff0c;前两天给大家说了说java中的四种内部类&#xff0c;推文分别为&#xff1a;静态内部类和成员内部类方法内部类和匿名内部类在内部类的基础上&#xff0c;我们来看看今天的知识点儿。众所周知&#xff0…

jzoj1751-Span(每日C组)【并查集,贪心】

题目 有n个村&#xff0c;m条路&#xff0c;给n-1条路刷油漆连接n个村&#xff0c;让最长边与最短边的长度差最小。 输入输出&#xff08;建议跳过&#xff09; Input 第一行给出一个数字TOT&#xff0c;代表有多少组数据,Tot<6 对于每组数据&#xff0c;首先给出N&…

线程优先级

MAX_PRIORITY&#xff1a;10 MIN _PRIORITY&#xff1a;1 NORM_PRIORITY&#xff1a;5 -->默认优先级 2.如何获取和设置当前线程的优先级&#xff1a; getPriority():获取线程的优先级 setPriority(int p):设置线程的优先级 说明&#xff1a;高优先级的线程要抢占低优先级线…