Static关键字的作用
1.静态方法
2.静态变量
3.静态代码块
注意:静态的方法不能访问非静态的成员变量和非静态的方法
但是,非静态的可以访问静态的成员变量和方法
类的加载顺序
1.加载静态成员和代码块
①先递归的加载父类中的静态成员/代码块(Object的最优先加载)
②再依次加载本类的静态成员和代码块,按照书写的顺序加载
2.非静态的成员/代码块
①先递归的加载父类中的非静态的成员/代码块(Object的最优先加载)
②再依次加载本类的非静态成员/代码块,按照书写顺序加载
3.调用构造方法
①先递归的调用父类的构造方法,默认调用空参的构造函数,也可以在第一行调用其他的构造函数
②再调用本类的空参构造方法,在构造方法第一行可以调用其他的有参构造方法.
public class A {
static {
System.out.println("我是A类的静态代码块");
}
public static String str="我是A类的静态成员";
static {
System.out.println(str);
}
static void aTest() {
System.out.println("我是A类的静态方法");
}
public A() {
System.out.println("我是A类的无参构造函数");
new A(200);
}
public A(int a) {
System.out.println(a+"我是A类的有参构造函数");
}
}
public class B extends A{
static {
System.out.println("我是B类的静态代码块");
}
public static String str="我是B类的静态成员";
static {
System.out.println(str);
}
static void bTest() {
System.out.println("我是B类的静态方法");
}
public B() {
System.out.println("我是B类的无参构造方法");
}
public B(int a) {
System.out.println(a+"我是B类的有参构造函数");
}
}
public class ABTest {
public static void main(String[] args) {
new B(100);
A.aTest();//父类A只能调用自己的方法
B.aTest(); //子类B既可以调用父类A的静态方法还可以调用自己的静态方法
B.bTest();
}
}
下面来分析一下例子的执行过程:
1.在执行new B(100)之前干了这两件事件事;
① 加载A类中的静态代码块和静态成员变量,
注意:按照书写代码的顺序加载的
② 加载B类中的静态代码块和静态成员变量
注意:先加载父类A的再加载子类B的
2.当执行new B(100)的时候干了这两件事情:
①先调用A类的无参构造
注意:在无参构造方法里面可以调用有参的构造方法
②再调用B类的有参构造
注意:静态方法只有在被调用的时候才会被加载
子类可以调用父类的静态方法
父类不能调用子类的静态方法