Java中的代码块
Java 中的代码块共有四种:
一、static代码块:
static代码块只能存在于类中不能存在于方法中,因为此代码块在类加载时第一个加载,优先于类中的各个static方法(包括main函数)及类的初始化,且只加载一次。
实例:
public class Test{
public Test() {
System.out.println("[构造器]");
}
static {
System.out.println("[静态代码块]");
}
public static void main (String[] args) {
System.out.println("[main函数块]");
Test test=new Test();
Test test1=new Test();
}
}
执行结果为:
[静态代码块]
[main函数块]
[构造器]
[构造器]
二、不带static修饰的类代码块
不带static修饰的类代码块成为普通类代码块,它在静态代码块及静态main函数代码块之后,在类调用初始化构造函数之前运行,每初始化一次实例就调用一次。
实例:
public class Test{
public Test() {
System.out.println("[构造器]");
}
{
System.out.println("[构造代码块]");
}
static {
System.out.println("[静态代码块]");
}
public static void main (String[] args) throws {
System.out.println("[mian函数块]");
<span style="font-family: Arial, Helvetica, sans-serif;"> Test test=new Test();</span><pre name="code" class="java"> Test test1=new Test();
}
执行结果为:
[静态代码块]
[main函数块]
[构造代码块]
[构造器]
[构造代码块]
[构造器]
三、普通方法中的代码块
普通方法中的代码块与其他的方法中的代码没有什么区别
public class Test{
public Test() {
System.out.println("[构造器]");
}
{
System.out.println("[构造代码块]");
}
static {
System.out.println("[静态代码块]");
}
public void ss(){
System.out.println("[普通函数]");
{
System.out.println("[普通函数块]");
}
}
public static void main (String[] args) {
System.out.println("[mian函数块]");
<span style="white-space:pre"> </span> Test test=new Test();
Test test1=new Test();
test.ss();
}
}
输出结果:
[静态代码块]
[mian函数块]
[构造代码块]
[构造器]
[构造代码块]
[构造器]
[普通函数]
[普通函数块]
四、同步代码块(用于多线程中)
同步代码块是用于方法中,通过synchronized关键字对指定的代码块加锁,在一个线程运行此块代码的时候,其他线程不能运行此代码块,只有当该线程运行完此代码块后其它线程才可执行此代码块。
实例:
1、不带synchronized实例:
public static void main (String[] args) {
new Thread(){
public void run(){
while(true){
System.out.print("kkkkkkk");
System.out.println("[lock1开始]");
}
}
}.start();
new Thread(){
public void run(){
while(true){
System.out.print("++++++++++");
System.out.println("[lock2开始]");
}
}
}.start();
}
在运行此代码时会有两个线程穿插运行:
kkkkkkk[lock1开始]
kkkkkkk[lock1开始]
kkkkkkk[lock1开始]
kkkkkkk[lock1开始]
kkkkkkk++++++++++[lock2开始]
++++++++++[lock2开始]
++++++++++[lock2开始]
++++++++++[lock2开始]
2、加上synchronized之后的实例:
public static void main (String[] args){
final Object lock=new Object();
new Thread(){
public void run(){
while(true){
synchronized (lock) {
System.out.print("kkkkkkk");
System.out.println("[lock1开始]");
}
}
}
}.start();
new Thread(){
public void run(){
while(true){
synchronized (lock) {
System.out.print("++++++++++");
System.out.println("[lock2开始]");
}
}
}
}.start();
}
运行此代码不会有两个线程穿插运行的情况
++++++++++[lock2开始]
++++++++++[lock2开始]
++++++++++[lock2开始]
kkkkkkk[lock1开始]
kkkkkkk[lock1开始]
kkkkkkk[lock1开始]
kkkkkkk[lock1开始]
kkkkkkk[lock1开始]
kkkkkkk[lock1开始]
++++++++++[lock2开始]
++++++++++[lock2开始]