java:对象初始化顺序
为了演示,我们把实例属性、静态属性、实例方法、静态方法、构造方法、代码块、静态代码块都加上
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);
}
}
结果:说明先执行了实例属性初始化(String name = "全栈测试笔记";),再执行代码块中赋值,否则输出的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);
}
}
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("构造方法。");
}
}
结果:执行实例属性(String name = "全栈测试笔记";)和代码块,是根据定义的顺序,从上往下执行
静态代码块。 代码块。 构造方法。 全栈测试笔记
构造方法中初始化
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);
}
}
结果:说明构造方法最后执行
静态代码块。 代码块。 构造方法。 性能测试
总结
执行先后顺序: 静态代码块 → 代码块 → 构造方法
注意:
不要在构造器中对静态成员进行初始化;
不要在静态代码快中对实例变量进行初始化。
如果有继承关系:
父类静态代码块 → 子类静态代码块 → 父类代码块 → 父类构造方法 → 子类代码块 → 子类构造方法
package com.qzcsbj;
public class Test {
public static void main(String[] args) {
new Chinese();
}
}
class Person{
{
System.out.println("父类代码块");
}
static {
System.out.println("父类静态代码块");
}
public Person() {
System.out.println("父类构造方法");
}
}
class Chinese extends Person{
{
System.out.println("子类代码块");
}
static {
System.out.println("子类静态代码块");
}
public Chinese() {
System.out.println("子类构造方法");
}
}
父类静态代码块
子类静态代码块
父类代码块
父类构造方法
子类代码块
子类构造方法
__EOF__
本文作者:持之以恒(韧)
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!

浙公网安备 33010602011771号