类初始化的顺序
public class Father {
// 父类静态变量
public static String str1 = "father static str";
// 父类普通变量
public String str2 = "father common str";
// 父类静态代码块
static {
System.out.println("father static block");
}
// 父类普通代码块
{
System.out.println("father common block");
}
// 父类构造方法
public Father() {
System.out.println("father constructor");
}
}
//然后定义一个子类
public class Child extends Father {
// 子类静态变量
public static String str1 = "child static str";
// 子类普通变量
public String str2 = "child common str";
// 子类静态代码块
static {
System.out.println("child static block");
}
// 子类普通代码块
{
System.out.println("child common block");
}
// 子类构造方法
public Child() {
System.out.println("child constructor");
}
}
// 测试
public static void main(String[] args) {
new Child();
}
OUTPUT:
father static block
child static block
father common block
father constructor
child common block
child constructor
从内存的角度看一下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ZzYB0km-1669081720730)(%E7%B1%BB%E5%88%9D%E5%A7%8B%E5%8C%96%E7%9A%84%E9%A1%BA%E5%BA%8F/64e873addd174f38bde1b48b375946bf-16689927050862.png)]
从上面可以看到,我们的方法在调用静态方法、变量的时候,是从方法区调用的,但是调用普通变量是从堆内存中调用的,堆内存中的成员变量 lastname 是随着对象的产生而产生,随着对象的消失而消失。静态变量是所有线程共享的,所以不会消失。
成员变量和静态变量的区别
静态变量随着类的加载而存在随着类的消失而消失。
静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)
静态变量称为类变量。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
静态使用时需要注意的事项: