JavaSE------static代码块

1、静态代码块:常规使用方法

public class StaticBlockTest {
public static void main(String[] args) {
Test test = new Test();
}
}
class Test
{
static 
{
System.out.println("static block");
}
}

输出结果:static block

2、静态代码块与构造方法

public class StaticBlockTest {
public static void main(String[] args) {
Test test = new Test();
}
}
class Test
{
static 
{
System.out.println("static block");
}
public Test()
{
System.out.println("Test Constructor");
}
}

输出结果:

static block

Test Constructor

原因:静态代码块在类加载的时候执行,而构造方法是在类创建实例的时候执行,静态代码块先于构造方法执行

3、静态代码块的执行次数:

public class StaticBlockTest {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
}
}
class Test
{
static 
{
System.out.println("static block");
}
public Test()
{
System.out.println("Test Constructor");
}
}

输出结果:

static block

Test Constructor

Test Constructor

从运行结果可以看出,静态代码块只被执行了一次,原因是一个类的class文件只会被加载一次,静态代码块只会在类加载的时候执行;类的构造方法是毎生成一个实例就会调用一次

3、静态代码块的继承

public class StaticBlockTest {
public static void main(String[] args) {
new C();
}
}
class A
{
static 
{
System.out.println("A static block");
}
public A()
{
System.out.println("A Constructor");
}
}
class B extends A
{
static 
{
System.out.println("B static block");
}
public B()
{
System.out.println("B Constructor");
}
}
class C extends B
{
static 
{
System.out.println("C static block");
}
public C()
{
System.out.println("C Constructor");
}
}

运行结果:

A static block
B static block
C static block
A Constructor
B Constructor
C Constructor

原因:静态代码块在类加载的时候执行,构造方法是在生产对象的时候执行;先执行静态代码块再执行构造方法。执行的顺序是先执行父类的静态代码块,再执行子类的静态代码块。要想调用某个类来生成对象,首先需要将类加载到Java虚拟机上,然后由JVM加载这个类来生成对象。

4、类的静态代码块只会执行一次,是在类被加载的时候,因为每个类只会被加载一次,所以静态代码块只会被执行一次;构造方法在每次生产一个对象的时候都会调用类的构造方法,所以每new一次就会执行一次构造方法

public class StaticBlockTest {
public static void main(String[] args) {
new C();
new C();
}
}
class A
{
static 
{
System.out.println("A static block");
}
public A()
{
System.out.println("A Constructor");
}
}
class B extends A
{
static 
{
System.out.println("B static block");
}
public B()
{
System.out.println("B Constructor");
}
}
class C extends B
{
static 
{
System.out.println("C static block");
}
public C()
{
System.out.println("C Constructor");
}
}

运行结果:

A static block
B static block
C static block
A Constructor
B Constructor
C Constructor
A Constructor
B Constructor
C Constructor


总结:如果继承体系既有构造方法又有静态代码块,首先执行最顶层的静态代码块,一直执行到最底层类的静态代码块;然后再去执行最顶层类的构造方法,一直执行到最底层类的构造方法。静态代码块只会被执行一次。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值