静态变量、类变量、静态属性:除局部变量之外的另一种变量种类。
定义位置:类里,方法外+stataic进行修饰。
1.作用域:跟着大括号(整个类的内部是有效的)
2.生命周期:伴随着类在运行中的生命周期而运行的
静态属性的初始化问题
类的生命周期:
.java文件 经过编译 .class文件 硬盘
类的加载:计算机的体系结构决定了CPU要处理的数据必须要在内存中。意味着,把类的数据从硬盘上(以类文件作为代表)加载到内存中来。
类的卸载:把放在内存中的类数据从内存中剔除。
关于类的加载的一系列问题:
1.某个具体的类。在何时触发加载?
A.程序一启动就加载所有的类 B.某一个类被用到时触发加载
2.什么叫做一个类被用到了
1.A.method(...)
2.A.main(...)
3.A.静态属性
3.静态属性的初始化语句是在何时被执行的?
在类加载的过程中就完成了静态属性的初始化
public class Test2 {
public static int a=someMethod();
public static int someMethod(){
System.out.println("someMethod方法被调用了");
return 0;
}
public static void main(String[] args) {
System.out.println("main方法被调用了");
}
someMethod方法被调用了
main方法被调用了
someMethod方法被调用了
main方法被调用了
main方法被调用了
执行Test3的main方法的时候,要执行Test2的notmain方法;执行notmain方法的时候要用到Test2这个类,这个类不存在,所以执行Test2的加载,重新初始化。初始化的时候会打印someMethod方法被调用了,之后再打印main方法被调用了。
4.类的加载的语法:
1.直接赋值 static int a =...
2.静态代码块 static {...}
按照代码书写顺序,依次执行
静态属性的初始化:
package mjh.week.day2;
public class Test4 {
//静态属性的默认值
public static int a;
public static double b;
public static String c;
public static boolean d;
public static void main(String[] args) {
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
0 0.0 null false
5.那些数据被加载了?
1.静态属性
2.方法 -> 语句 -> 字节码指令(绝大部分)
6.加载到了内存的哪个区域了?
JVM管理的内存区域中有栈区、方法区(method area)
故类的数据(静态属性 + 方法)被加载到了方法区。