为了演示,我们把实例属性、静态属性、实例方法、静态方法、构造方法、代码块、静态代码块都加上
package com.qzcsbj; /** * @create : 2020/3/22 14:29 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class User { String name = "全栈测试笔记"; // 实例属性 static String job = "tester"; // 静态属性 public void a(){ System.out.println("实例方法。"); } public static void b(){ System.out.println("静态方法。"); } public User(){ System.out.println("构造方法。"); } { System.out.println("代码块。"); } static{ System.out.println("静态代码块。"); } }
创建对象
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) { User user = new User(); } }
结果:代码块在构造方法后面定义,但是先执行
静态代码块。 代码块。 构造方法。
调用静态方法
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) { // User user = new User(); User.b(); } }
结果:下面说明,只要加载类,就会执行静态代码块,和是否创建类无关
静态代码块。 静态方法。
加载指定的类
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) throws ClassNotFoundException { // User user = new User(); // User.b(); Class.forName("com.qzcsbj.User"); } }
结果:加载类,就会执行静态代码块
静态代码块。
在静态代码块里面初始化静态变量
static{ System.out.println("静态代码块。"); job = "QA"; }
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) throws ClassNotFoundException { // User user = new User(); // User.b(); Class.forName("com.qzcsbj.User"); System.out.println(User.job); } }
结果:指定加载类后,访问属性,结果说明,类加载,静态属性也初始化了
静态代码块。 QA
创建多个对象
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) throws ClassNotFoundException { User user = new User(); User user2 = new User(); // User.b(); // Class.forName("com.qzcsbj.User"); // System.out.println(User.job); } }
package com.qzcsbj; /** * @create : 2020/3/22 14:29 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class User { String name = "全栈测试笔记"; // 实例属性 static String job = "tester"; // 静态属性 public void a(){ System.out.println("实例方法。"); } public static void b(){ System.out.println("静态方法。"); } public User(){ System.out.println("构造方法。"); } { System.out.println("代码块。"); } static{ System.out.println("静态代码块。"); job = "QA"; } }
结果:下面说明,静态代码块只执行一次,静态代码块是在加载类时候执行的,说明类只加载一次
静态代码块。 代码块。 构造方法。 代码块。 构造方法。
调整静态代码块和静态属性顺序
package com.qzcsbj; /** * @create : 2020/3/22 14:29 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class User { static{ System.out.println("静态代码块。"); job = "QA"; } String name = "全栈测试笔记"; // 实例属性 static String job = "tester"; // 静态属性 public void a(){ System.out.println("实例方法。"); } public static void b(){ System.out.println("静态方法。"); } public User(){ System.out.println("构造方法。"); } { System.out.println("代码块。"); } }
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) throws ClassNotFoundException { // User user = new User(); // User user2 = new User(); // User.b(); Class.forName("com.qzcsbj.User"); System.out.println(User.job); } }
结果:说明执行静态属性和静态代码块,是根据定义的顺序,从上往下执行
静态代码块。 tester
代码块中堆实例属性初始化
package com.qzcsbj; /** * @create : 2020/3/22 14:29 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class User { static{ System.out.println("静态代码块。"); job = "QA"; } String name = "全栈测试笔记"; // 实例属性 static String job = "tester"; // 静态属性 public void a(){ System.out.println("实例方法。"); } public static void b(){ System.out.println("静态方法。"); } public User(){ System.out.println("构造方法。"); } { System.out.println("代码块。"); name = "qzcsbj"; } }
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) throws ClassNotFoundException { User user = new User(); System.out.println(user.name); // User user2 = new User(); // User.b(); // Class.forName("com.qzcsbj.User"); // System.out.println(User.job); } }
结果:说明先执行了实例属性初始化,再执行代码块中赋值
静态代码块。 代码块。 构造方法。 qzcsbj
调整静态代码块和静态属性
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) throws ClassNotFoundException { User user = new User(); System.out.println(user.name); // User user2 = new User(); // User.b(); // Class.forName("com.qzcsbj.User"); // System.out.println(User.job); } }
package com.qzcsbj; /** * @create : 2020/3/22 14:29 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class User { static{ System.out.println("静态代码块。"); job = "QA"; } { System.out.println("代码块。"); name = "qzcsbj"; } String name = "全栈测试笔记"; // 实例属性 static String job = "tester"; // 静态属性 public void a(){ System.out.println("实例方法。"); } public static void b(){ System.out.println("静态方法。"); } public User(){ System.out.println("构造方法。"); } }
结果:执行实例属性和代码块,是根据定义的顺序,从上往下执行
静态代码块。 代码块。 构造方法。 全栈测试笔记
构造方法中初始化
package com.qzcsbj; /** * @create : 2020/3/22 14:29 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class User { String name = "全栈测试笔记"; // 实例属性 static String job = "tester"; // 静态属性 public void a(){ System.out.println("实例方法。"); } public static void b(){ System.out.println("静态方法。"); } public User(){ System.out.println("构造方法。"); this.name = "性能测试"; } static{ System.out.println("静态代码块。"); // job = "QA"; } { System.out.println("代码块。"); name = "qzcsbj"; } }
package com.qzcsbj; /** * @create : 2020/3/22 14:43 * @description : <描述> * @博客 : www.cnblogs.com/uncleyong * @QQ群 : 652122175 * @公众号 : 全栈测试笔记 */ public class Test { public static void main(String[] args) throws ClassNotFoundException { User user = new User(); System.out.println(user.name); // User user2 = new User(); // User.b(); // Class.forName("com.qzcsbj.User"); // System.out.println(User.job); } }
结果:
静态代码块。 代码块。 构造方法。 性能测试
总结
执行先后顺序: 静态代码块 → 代码块 → 构造方法
注意:不要在构造器中对静态成员进行初始化。