在看android源码的时候看到了好久不见的静态代码块,写个小栗子来回忆一下这部分。
包含静态代码块的类A:
class A{
static int va = 1;
static String sa = "1";
public A(){
System.out.println("构造方法a");
}
{
System.out.println("代码块a");
}
static{
System.out.println("静态代码块a");
}
static{
System.out.println("静态代码块a1");
}
public static void printStaticValue(){
System.out.println(sa);
}
public void printValue(){
System.out.println("=====a=====");
System.out.println(va);
System.out.println(sa);
}
}
继承父类A并且同样包含静态代码块的类B:
class B extends A{
public B(){
System.out.println("构造方法b");
}
{
System.out.println("代码块b");
}
static{
System.out.println("静态代码块b1");
}
static{
System.out.println("静态代码块b");
}
public void printValue(){
System.out.println("=====super=====");
super.printValue();
System.out.println("=====b=====");
System.out.println(va);
System.out.println(sa);
}
}
调用上面的类:
public class Teststatic {
public static void main(String[] args) {
System.out.println("------b--------");
B b = new B();
System.out.println("------b again--------");
b = new B();
System.out.println("------b1--------");
B b1 = new B();
System.out.println("------通过b1来打印一下静态变量");
b1.printValue();
}
}
运行结果如下:
------b--------
静态代码块a
静态代码块a1
静态代码块b1
静态代码块b
代码块a
构造方法a
代码块b
构造方法b
------b again--------
代码块a
构造方法a
代码块b
构造方法b
------b1--------
代码块a
构造方法a
代码块b
构造方法b
------通过b1来打印一下静态变量
=====super=====
=====a=====
1
1
=====b=====
1
1
可以看到无论生成多少个对象,静态代码块只执行一次,且静态代码块之间按照书写顺序来执行。
在上面基础上添加一行类调用静态方法的代码:
public class Teststatic {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("------我先来执行以下静态方法-------");
B.printStaticValue();//虽然b中没有该静态方法,但是继承了A,所以也就继承了A中的公共方法
System.out.println("------b--------");
B b = new B();
System.out.println("------b again--------");
b = new B();
System.out.println("------b1--------");
B b1 = new B();
System.out.println("------通过b1来打印一下静态变量");
b1.printValue();
}
}
运行结果如下:
------我先来执行以下静态方法-------
静态代码块a
静态代码块a1
1
------b--------
静态代码块b1
静态代码块b
代码块a
构造方法a
代码块b
构造方法b
------b again--------
代码块a
构造方法a
代码块b
构造方法b
------b1--------
代码块a
构造方法a
代码块b
构造方法b
------通过b1来打印一下静态变量
=====super=====
=====a=====
1
1
=====b=====
1
1
可以看到通过类调用静态方法时同样会先执行静态代码块。
【待续...】
网友评论