如何理解Java代码块,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
静态代码块
首先我们来回顾一下static关键字,static关键字可以修饰类和类的成员还有构造函数,特点就是在类创建对象前加载并且是所有对象共享的资源,比如静态方法可以直接类名打点调用,不需要使用new关键字来创建对象。静态方法只可以调用静态成员不可以调用非静态成员
没有this对象
非静态方法既可以调用非静态成员也可以调用静态成员
静态代码块作用域:在类的内部方法外,使用static修饰
public class CodeBlock { static{ System.out.println("这是静态代码块"); }}
什么时候执行: 静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行
静态代码块是否可以访问方法?这个问题需要从上面的静态方法来解答,静态代码块是可以调用静态方法,但是无法调用非静态方法
静态代码块是否可以放在方法体?这个是不可以的,即使是静态方法也是不可以放静态代码块的,且静态代码块是只能放在类内部,无法放在静态方法内部,因为静态块是加载类的时候就执行,而静态方法是需要调用才执行,这里是有冲突的。
局部代码块
作用域:存在方法中
public static void main (String[] args){ { int number = 1; } System.out.println(number);//异常}
局部代码块执行顺序是和普通语句一样,只不过区分的是在代码块中的变量无法在代码块外部调用,如上所示,输出number时异常,这样有效的控制变量的生命周期,及早释放提高内存使用率。
构造代码块
构造代码块作用域:在类的内部且在方法外,与静态代码块的区别在于没有static修饰,且在类创建对象时执行public class CodeBlock { { System.out.println("这是构造代码块"); }}
构造代码块是在创建类的对象才执行,每次创建该类的实例就会执行一次,如有多个构造代码块,执行顺序为从上至下。 同部代码块
同步代码块作用域:在方法内部,用synchronized修饰的代码块
public class CodeBlock {
public void syncMethod(Object obj){
synchronized (obj){
}
}
}
synchronized实质上是一个锁,为什么需要用锁?当有多条线程同时访问共享数据时,会发生资源抢占,如果不进行处理那么有可能会出现每个线程获取到的数据都是不正确的,这里我们可以使用同步方法或者同步代码块,当一个线程进来时,我们需要把其他线程挡在外面,直到这个线程使用完后才让其他线程使用该资源。
public class CodeBlock {
static{
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public CodeBlock(){
System.out.println("无参构造函数");
}
public void sayHello(){
{
System.out.println("局部代码块");
}
}
public static void main(String[] args) {
System.out.println("执行了main方法");
new CodeBlock().sayHello();;
}
}
静态代码块执行了main方法构造代码块无参构造函数局部代码块
执行顺序为:静态代码块-->构造代码块-->构造函数-->局部代码块(跟同步代码块是同一级别)关于父子类的代码块执行顺序,这里就不多花时间了,执行顺序父类的执行在子类之前执行,除非是重写父类的方法。关于如何理解Java代码块问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注天达云行业资讯频道了解更多相关知识。