{
static int num = 0;
public StaticCode()
{
System.out.println("我是无参构造方法");
}
static
{
System.out.println("我是静态代码块");
}
{
System.out.println("我是代码块");
}
public StaticCode(int arg)
{
System.out.println("我是有参构造");
}
public static void callMe()
{
System.out.println("我是静态方法");
}
}
class StaticDemo
{
public static void main(String[] args)
{
System.out.println("我是main函数");
//StaticCode s = null;//1.打印结果 我是main函数
//StaticCode.callMe();//2.打印结果 我是main函数,我是静态代码块,我是静态方法(代码块在new对象的时候才会调用)
//new StaticCode();//3.打印结果 我是main函数,我是静态代码块,我是代码块
//new StaticCode(4);//4.打印结果 我是main函数,我是静态代码块,我是代码块
int num = StaticCode.num;//5.
}
}
1.当只有StaticCode s = null;的时候,打印结果如下图 : 1.png
----------------------------------------------------------------------------------------------------------------------
2.当只有StaticCode.callMe();打印结果如下:2.png
----------------------------------------------------------------------------------------------------------------------
3.当只有new StaticCode();打印结果如下 : 3.png:
----------------------------------------------------------------------------------------------------------------------
4.当只有new StaticCode(4);打印结果如下:4.png
5.当只有int num = StaticCode.num;打印结果如下:5.png
----------------------------------------------------------------------------------------------------------------------
1-5的总结:
通过以上打印信息,可以发现当StaticCode类里的属性或者方法被调用时,该类的静态代码块总会第一时间执行;
而代码块则会在new对象的时候才会优于构造方法执行,在静态调用(类名.)的时候,不执行代码块的内容。
----------------------------------------------------------------------------------------------------------------------
6.还有一个小知识点,如果我连续执行两遍,会打印什么呢?
StaticCode.callMe();
StaticCode.callMe();
结果如下图 : 6.png
通过打印结果发现虽然调用了两次callMe但是静态代码块只会执行一次,这就印证了静态代码块只会在类加载的时候执行一次,不会多次执行。
----------------------------------------------------------------------------------------------------------------------
7.再来,如果执行
new StaticCode().callMe();会打印什么呢?
这个应该都能理解,因为new了对象,所以代码块也会执行。
----------------------------------------------------------------------------------------------------------------------
8.那么如果执行两遍
new StaticCode().callMe();
new StaticCode().callMe();结果会是什么呢?
可以发现再执行第二遍的时候,静态代码块不会执行,而代码块仍会优于构造方法执行,说明,代码块可以被多次执行,new一次就执行一次,一些对象共有的数据和特性可以放在代码块中。
ps:一个类如果没有声明构造方法,系统会默认加上一个无参的构造方法,如果已经在类中声明了有参或者是无参的构造函数,那么系统就不会再默认加构造方法了