为了账号安全,请及时绑定邮箱和手机立即绑定

java类中成员的初始化顺序(一)

标签:
Java

类被创建之后的成员的初始化顺序到底是怎么样的?

首先 不考虑继承

复制代码


package com;

public class DemoOne {
    /**
     * 关于类的初始化顺序
     */
    //不考虑继承结构的情况
    private static int a=1;
    private String  str="我被赋值了";
    static{
        //为什么static成员函数不能访问非static变量, 不能调用非static成员函数?
        //静态代码块独立于对象而存在 不依赖于对象存在 简单来说可以直接以类型名调用DemoOne.a
        //而成员变量的存在依赖于对象的创建才能被调用
        //所以, static成员不能访问非static变量, 不能调用非static成员!
        //  编译报错     System.out.println("str ===="+ str);
        System.out.println("1 静态变量被赋初始值 a===="+a);
        System.out.println("2 进入静态块");
    }

    {
        System.out.println("3 成员变量被赋值  str ===="+ str);
        System.out.println("4 进到普通代码块");
    }
public void run(){
    System.out.println(" 进入普通方法");
}
public  static void go(){
    System.out.println(" 进入静态方法");
}
    public DemoOne(){
        System.out.println("5 进入构造器");
    }

    public static void main(String[] args) {
        new  DemoOne();
    }

}
 

复制代码

运行程序后输出结果为:

1 静态变量被赋初始值 a====1
2 进入静态块
3 成员变量被赋值  str ====我被赋值了
4 进到普通代码块
5 进入构造器

为了验证静态成员的顺序由代码的前后顺序决定 加入第二个静态块

 

复制代码

package com;

public class DemoOne {
    static{
        System.out.println("1 进入第一个静态代码块");
    }
    private static int a;
    static{
        System.out.println("2 进入第二个静态块");
    }
public static void main(String[] args) {
 new DemoOne(); 
} 
}

复制代码

 

输出结果为:

1 进入第一个静态代码块
2 进入第二个静态块

由输出结果可以看到 调整顺序后的静态块先后顺序发生改变

总结一下 不考虑继承的类的成员加载顺序依次为 静态变量和常量->顺序位的静态块->普通成员变量->普通代码块->构造器

下面考虑存在父类的情况

 

复制代码

package com;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;public class Demo {    /**
     *
     * @param args     */
    private static int a=1;    private String  str="我在父类被赋值了";    static{
        System.out.println("1 父类静态变量被赋初始值 a===="+a);
        System.out.println("2 进入父类静态块");
    }
    {
        System.out.println("5  父类成员变量被赋值  str ===="+ str);
        System.out.println("6  进入父类普通代码块");
    }    public Demo(){
        System.out.println("7 进入父类构造器");
    }
}

复制代码

 

子类

复制代码

package com;public class DemoOne  extends Demo{    private static int a=1;    private String  str="我在子类被赋值了";    static{
        System.out.println("3 子类静态变量被赋初始值 a===="+a);
        System.out.println("4 进入子类静态块");
    }
    {
        System.out.println("8  子类成员变量被赋值  str ===="+ str);
        System.out.println("9  进入子类普通代码块");
    }    public DemoOne(){
        System.out.println("10 进入子类构造器");
    }    public static void main(String[] args) {        new  DemoOne();
    }

}

复制代码

输出结果为:

1 父类静态变量被赋初始值 a====1
2 进入父类静态块
3 子类静态变量被赋初始值 a====1
4 进入子类静态块
5  父类成员变量被赋值  str ====我在父类被赋值了
6  进入父类普通代码块
7 进入父类构造器
8  子类成员变量被赋值  str ====我在子类被赋值了
9  进入子类普通代码块
10 进入子类构造器

所以存在父类的情况下 类成员的初始化顺序

父类静态变量->父类静态块->子类静态变量->子类静态块->父类成员变量->父类普通代码块->父类构造器->子类成员变量->子类普通代码块->子类构造器

还在学习总结过程中,如若有误,请看到的朋友及时指出。

原文出处:https://www.cnblogs.com/tongAngle/p/10128133.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消