理论基础
类的代码块种类:
- 静态代码块
- 初始化块
- 构造方法
类的继承 调用顺序
- 首先调用父类静态代码块
- 然后调用子类静态代码块
- 调用父类初始化块
- 调用父类构造方法
- 调用子类初始化块
- 调用子类构造方法
类的静态变量实例化只会一次
代码实践
定义一个父类B
class B {
static {
System.out.println("父类静态代码块");
}
public B() {
System.out.println("父类构造方法");
}
{
System.out.println("父类初始化块");
}
}
定义一个子类A继承自父类B
public class A extends B{
static {
System.out.println("子类静态代码块");
}
public A() {
System.out.println("子类构造方法"+"\n");
}
{
System.out.println("子类初始化块");
}
private static int x = 100;
}
子类加main函数运行程序观察调用情况
public static void main(String[] args){
}
/*只打印
父类静态代码块
子类静态代码块*/
//创建一个实例
public static void main(String[] args){
new A();
}
/*父类子类初始化构造方法全打印出来了
父类静态代码块
子类静态代码块
父类初始化块
父类构造方法
子类初始化块
子类构造方法*/
对类静态变量进行操作,进行验证
x的修饰符为 static,所以 x 为类静态变量,即对于所有的实例来说,他们访问的x为同一个x;
类变量存储在方法区,不属于每个实例的私有。
A a1 = new A();
a1.x++; //x为101
A a2 = new A();
a2.x++; //x为102
a1 = new A(); //a1指向了一个新的A实例,但是依然访问的是同一个X
a1.x++; //x为103
A.x--; //x为102
System.out.println("x= "+ x);//x=102
网友评论