java中的代码块

来源:互联网 发布:jquery.form.js cdn 编辑:程序博客网 时间:2024/05/19 03:27

java中有普通代码块,静态代码块、构造代码块、同步代码块(synchronized


普通代码块

普通代码块就是位于方法中的被{}包括的代码块,方法名后面的{}也是普通代码块,在普通代码块中还可以嵌套普通代码块,不可以嵌套静态代码块。

普通代码块的执行顺序是代码的出现顺序执行的。就和普通代码相同。

public static void main(String[] args) {
{
System.out.println("这是普通代码块一");
}
System.out.println("这是程序方法代码二");
{
System.out.println("这是普通代码块四");
{
System.out.println("这是普通代码块五");
}
}
}

结果:

这是普通代码块一
这是程序方法代码二
这是普通代码块四
这是普通代码块五

静态代码块

被static 修饰的{}代码

静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。

如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。

1 静态代码块不能存在于任何方法体内。

2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。

3.静态代码块操作的方法和属性通静态方法相同

public class MyTest {
static
{
System.out.println("这是静态代码块一");
}
static
{
System.out.println("这是静态代码块二");
}
public static void main(String[] args) {
int i=0;
{
System.out.println("这是普通代码块一"+i++);
}
System.out.println("这是程序方法代码二"+i++);
{
System.out.println("这是普通代码块四"+i++);
{
System.out.println("这是普通代码块五"+i++);
}
// 同步代码块只是将代码块中的数据锁起来,一次只有一个线程可以执行
// MyTest.class代表当前类的对象。表示在同一时刻只有一个线程能够调用该对象的该代码块
synchronized (MyTest.class) {
System.out.println("这是普通代码块六"+i++);
}
}
}
}

结果:
这是静态代码块一这是静态代码块二这是普通代码块一0这是程序方法代码二1这是普通代码块四2这是普通代码块五3这是普通代码块六4

同步代码块

同步代码块是被synchronized修饰的代码块,他的执行顺序同普通代码块相同,只是在同一是时刻只有一个线程可以执行该代码块。

synchronized (MyTest.class) 的参数是锁的范围:分为对象锁和类锁,对象锁是作用于对象的,只有涉及该对象的线程就会起锁的作用,在同一时刻涉及该对象的线程执行只有一个。而若是类锁则只要涉及该类的线程同一时刻只有一个执行。一般使用this代表该类的对象。

参考:http://bbs.csdn.net/topics/390216019 对象锁的解释

http://blog.csdn.net/luoweifu/article/details/46613015    this的使用


构造代码块

直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。

public class TwoClass {
{
System.out.println("这是构造代码块一");
synchronized (MyTest.class) {
System.out.println("这是构造代码块中的同步代码块一");
}
}
{
System.out.println("这是构造代码块二");
synchronized (MyTest.class) {
System.out.println("这是构造代码块中的同步代码块二");
}
}

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

public static void showData(){
int i = 0;
{
System.out.println("这是普通代码块一" + i++);
}
System.out.println("这是程序方法代码二" + i++);
{
System.out.println("这是普通代码块四" + i++);
{
System.out.println("这是普通代码块五" + i++);
}
// 同步代码块只是将代码块中的数据锁起来,一次只有一个线程可以执行
// MyTest.class代表当前类的对象。表示在同一时刻只有一个线程能够调用该对象的该代码块
synchronized (MyTest.class) {
System.out.println("这是普通代码块中的同步代码块一" + i++);
}
}
}
}


public class MyTest {


public static void main(String[] args) {
TwoClass twoClass=new TwoClass();
twoClass.showData();
}
}

结果:

这是静态代码块一
这是静态代码块二
这是构造代码块一
这是构造代码块中的同步代码块一
这是构造代码块二
这是构造代码块中的同步代码块二
这是普通代码块一0
这是程序方法代码二1
这是普通代码块四2
这是普通代码块五3
这是普通代码块中的同步代码块一4

原创粉丝点击