国外无版权素材网站,装饰公司起名大全免费,自学网站建设看什么书,分类目录搜索引擎加载/执行顺序#xff1a;牢记一点#xff1a;静态和非静态分开处理使用到静态加载时#xff0c;静态又分为#xff1a; 静态变量#xff0c; 静态代码块#xff0c; 其中加载顺序是按照类中书写的先后顺序加载的非静态加载顺序#xff1a; 按照非静态书写顺序加载/执行…加载/执行顺序牢记一点静态和非静态分开处理使用到静态加载时静态又分为 静态变量 静态代码块 其中加载顺序是按照类中书写的先后顺序加载的非静态加载顺序 按照非静态书写顺序加载/执行静态方法实例方法只有在调用的时候才会去执行当静态加载中遇到需要加载非静态的情况 先加载非静态再加载静态。下面两种情况的加载顺序不涉及到父类子类的情况1) 首先将所有静态成员变量加载进来 但是不赋值JVM会根据属性的数据类型第一时间赋默认值2)然互再进行赋值即加载静态变量一一为分配内存赋值静态变量静态块的加载没有优先级之分按照书写先后顺序加载特殊情况 静态变量是加载类本生的实例会比较麻烦稍后讲解涉及到父类的情况父静态--子静态 加载时不涉及构造方法,只有使用都new才会涉及到构造方法下面将具体讲述程序执行顺序1. main第一句是否先执行Java程序运行时第一件事情就是试图访问main方法因为main相等于程序的入口如果没有main方法程序将无法启动main方法更是占一个独立的线程找到main方法后是不是就会执行mian方法块里的第一句话呢不是因为main方法虽然是一个特殊的静态方法但是还是静态方法此时JVM会加载main方法所在的类试图找到类中其他静态部分即首先会找main方法所在的类。public class JVMTest {static{System.out.println(Main 方法所在静态代码块 static1);}public static void main(String[] args) {System.out.println(main start);A a new A();System.out.println(A.width);System.out.println(a.width);}static{System.out.println(Main 方法所在静态代码块 static2);}}class A{public static int width 100;static{System.out.println(静态初始化类A);width 30;}public A(){System.out.println(创建A类的对象);}}结果Main 方法所在静态代码块 static1Main 方法所在静态代码块 static2main start静态初始化类A创建A类的对象3030上例中 先找到main方法 然后先加载main 方法所在的类JVMTest的静态属性 静态代码块(按照顺序加载)即使静态代码块在main方法下面也要先加载静态代码块。然后执行 main方法2. 静态变量声明一定放在使用前面3. 父类子类加载顺序public class JVMParent {public static int width 100;public static int count;{System.out.println(parent no static code block : count);}static{System.out.println(parent statics count: count);}JVMParent(int a){System.out.println(parent init one parameter);}JVMParent(){System.out.println(parent init);}}public class JVMSon extends JVMParent {{System.out.println(son no static code block : count);}static {System.out.println(son static 1);}public static int count1;JVMSon() {System.out.println(son init: count);}static {System.out.println(son static 2);}public static void main(String[] args) {System.out.println(son main start);JVMSon a new JVMSon();}}结果parent statics count:0son static 1son static 2son main startparent no static code block :0parent initson no static code block :0son init:0执行顺序1)加载Main方法 先要加载包含Main方法的类 加载类就先加载父类静态变量 静态代码块(按照书写先后顺序)--》 子类静态变量静态代码块2) 执行main方法3) main 方法中调用有构造函数父类代码块--》 父类构造函数--》子类代码块--》子类构造函数4. 一个比较复杂的例子如果下面的例子理解了就撤离理解了Java的执行顺序public class Text {public static int k 10;public int a print(a);public static int b print(b);public static Text t1 new Text(t1);public static Text t2 new Text(t2);public static int i print(i);public static int n 99;public int j print(j);public int m print(m);{print(构造块);}static {print(静态块);}public int l print(l);public static int o print(o);public Text(String str) {System.out.println(构造: (k) : str i i n n);i;n;}public static int print(String str) {System.out.println(print: (k) : str i i n n);n;return i;}public int p print(p);public static void main(String args[]) {Text t new Text(init);}}print:11:b i0 n0print:12:a i1 n1print:13:j i2 n2print:14:m i3 n3print:15:构造块 i4 n4print:16:l i5 n5print:17:p i6 n6构造:18:t1 i7 n7print:19:a i8 n8print:20:j i9 n9print:21:m i10 n10print:22:构造块 i11 n11print:23:l i12 n12print:24:p i13 n13构造:25:t2 i14 n14print:26:i i15 n15print:27:静态块 i16 n99print:28:o i17 n100print:29:a i18 n101print:30:j i19 n102print:31:m i20 n103print:32:构造块 i21 n104print:33:l i22 n105print:34:p i23 n106构造:35:init i24 n107执行顺序1)JVM 类加载机制中提到类连接 (验证 准备 解析)中准备工作负责为类的类变量(非对象变量)分配内存并设置默认初始值准备类中每个字段、方法和实现接口所需的数据结构 这里说的初始值都是默认的值 并不是程序中指定的值 经过准备工作类中变量的初始值为如下k 0; b0; t1null; t2null; i0; n0;2) JVM在类连接以后进行类的初始化即给类变量赋值按照静态属性的书写顺序执行A: public static int k 10; -- k10B:public static int b print(b); --调用print(b) print:11:b i0 n0C: public static Text t1 new Text(t1); 当加载静态变量是需要先加载构造器 那就转为先加载所有非静态属性此时按照书写的顺序加载非静态 如下所示public int a print(a); --》 print:12:a i1 n1public int j print(j); --》print:13:j i2 n2public int m print(m); --》print:14:m i3 n3{print(构造块); --》print:15:构造块 i4 n4}public int l print(l); --》print:16:l i5 n5public int p print(p); --》print:17:p i6 n6然后继续执行构造器public Text(String str) {System.out.println(构造: (k) : str i i n n);i;n;}》构造:18:t1 i7 n7D: public static Text t2 new Text(t2); 和C的过程一模一样 非静态的每次new都加载一次print:19:a i8 n8print:20:j i9 n9print:21:m i10 n10print:22:构造块 i11 n11print:23:l i12 n12print:24:p i13 n13构造:25:t2 i14 n14E: public static int i print(i); print:26:i i15 n15F: public static int n 99; n99G:static {print(静态块);}print:27:静态块 i16 n99H: public static int o print(o); print:28:o i17 n100I: Text t new Text(init);print:29:a i18 n101print:30:j i19 n102print:31:m i20 n103print:32:构造块 i21 n104print:33:l i22 n105print:34:p i23 n106构造:35:init i24 n107参考 https://www..com/greatfish/p/5771548.html1·