Java基础篇:四种代码块详解

Java基础篇:四种代码块详解

所谓代码块,就是用大括号{}将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法。一般来说,代码块是不能单独运行的,它必须有运行主体。在Java中代码块主要分为四种:普通代码块、静态代码块、同步代码块、构造代码块。

一、普通代码块:

普通代码块就是类中方法的方法体;普通代码块是不能够单独存在的,他必须紧跟在方法名后面,同时也必须使用方法名调用它。

public class Test {
    public void test(){
        System.out.println("普通代码块");
    }
}

二、静态代码块:

静态代码块就是用static修饰的用{}括起来的代码段,他的主要目的就是对静态属性进行初始化。静态代码块在第一次加载此类的时候被执行,并且只会执行一次,静态代码块优先优先于构造代码块执行。

public class Test {
    static{
        System.out.println("静态代码块");
    }
}

三、同步代码块:

同步代码块,就是使用synchronized关键字修饰的用{}括起来的代码片段,他表示同一时间只能有一个线程进入到该方法块中,是一种多线程保护机制。在多线程环境下,对共享数据进行读写操作是需要互斥进行的,否则会导致数据的不一致性,常见的是synchronized用来修饰方法,其语义是任何线程进入synchronized需要先取得对象锁,如果对象锁被占用了,则阻塞等待。synchronized实现了互斥访问共享资源,但synchronized也是有代价的,会造成系统性能的降低。

public class Test {
     synchronized(obj){ 
        System.out.println("同步代码块");
    } 
}

四、构造代码块:

构造代码块就是用{}括起来的代码片段,构造代码块会在创建对象时被调用,每次创建对象时会被调用,并且优先于类构造函数执行。构造代码块中定义的变量是局部变量。

new一个对象的时候总是先执行构造代码,在执行构造函数。但是有一点需要注意的是,构造代码块不是在构造函数之前运行的,它是依托构造函数执行的。正式由于构造代码块有这几个特性,所以它常用语如下场景:

1、初始化实例变量:

如果一个类中存在若干个构造函数,这些构造函数都需要对实例变量进行初始化,如果我们直接在构造函数中实例化,必定会产生很多重复代码,繁琐和可读性差。这时,我们可以充分利用构造代码块来实现,这是利用编译器会将构造代码块添加到每个构造函数中的特性。

2、初始化实例环境:

一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景,我们可以利用构造代码块来创建此场景,尤其是该场景的创建过程较为复杂的时候。

上面两个常用场景都充分利用构造代码块的特性,能够很好的解决在实例化对象时构造函数比较难解决的问题,利用构造代码不仅可以减少代码量,同时也是程序的可读性增强了。特别是当一个对象的创建过程比较复杂,需要实现一些复杂逻辑,这个时候如果在构造函数中实现逻辑,这是不推荐的,因为我们提倡构造函数要尽可能的简单易懂,所以我们可以使用构造代码封装这些逻辑实现部分。

参考博客:

https://blog.csdn.net/zhangzeyuaaa/article/details/16907921

https://blog.csdn.net/chenssy/article/details/14486833

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114679.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java.lang.noclassdeffounderro_cannot resolve reference to bean

    java.lang.noclassdeffounderro_cannot resolve reference to bean1.首先创建项目选择版本号跟要导入的包创建项目之后,导包的时候出现了问题找了半天问题我发现是spring-cloud-starter-netflix-eureka-server默认的版本号太高,然后去Maven仓库换了个版本低的,就是下面这个<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netfl

  • 网上的腾讯php面试题 (有答案版本)

    网上的腾讯php面试题 (有答案版本)

  • 程序员如何学习量化交易,一文总结

    程序员如何学习量化交易,一文总结最近有位金融行业的朋友想把一个盈利能力很强的策略做成量化程序遇到问题,问题是这样的线程A在while(true)的循环里做条件判断,循环耗时1分钟。循环结束判断条件满足的时候调用交易接口下单建仓。想实现条件成立马上建仓,而不需要等待1分钟的循环。想通过多进程或者多线程方式,但两个线程不知道如何交互。对有经验的开发来说这样的逻辑很简单,只要通过线程通信的方式就可以实现。A线程判断到满足条件就发个消息给B线程,B线程while(true)等待消息就行。技术本身不复杂,只是没接触过编程的不知道还可以这么干

  • spring的aop思想_图片浏览器的设计与实现原理

    spring的aop思想_图片浏览器的设计与实现原理在上篇文章《Spring设计思想》AOP设计基本原理中阐述了SpringAOP的基本原理以及基本机制,本文将深入源码,详细阐述整个SpringAOP实现的整个过程。读完本文,你将了解到:1、Spring内部创建代理对象的过程2、SpringAOP的核心—ProxyFactoryBean3、基于JDK面向接口的动态代理JdkDynamicAopProxy生成代理对象4、基于Cglib子类继承方式的动态代理CglibAopProxy生成代理对象

  • js面试笔试–prototype详解

    js面试笔试–prototype详解对JavaScript中原型模式的理解一:什么是原型对象?有什么优点?   简单的来说,无论何时,我们创建的每一个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象包含了通过调用该构造函数所创建的对象共享的属性和方法。其实我们平常的叫法就是指:prototype就是通过该构造函数创建的某个实例的原型对象,但是其实prototype是每个构造函数的属性而已,只能说…

  • WinSCP连接VMware虚拟机被拒绝「建议收藏」

    WinSCP连接VMware虚拟机被拒绝「建议收藏」最近在做一个电商项目练手,使用了dubbo,并安装了虚拟机准备模拟熟悉一下,但是使用WinSCP一直提示拒绝连接,下面分享下我的解决办法期望对你们有帮助1.提示信息2.一开始的分析,以为是IP地址错误导致,所有ping了IP显示如下:3.分析IP地址,eth0上面显示的并不是我们常看到的4位的IP127.0.0.1这一类,继续分析可能是没有连网络,意思是:虚拟机也需要单独连接网

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号