zoukankan      html  css  js  c++  java
  • 对象的初始化过程

    class Test
    {
        int num = 8;
        static  //静态代码块
        {
            System.out.println("静态代码");
        }
        {   //构造代码块
            System.out.println(num);
        }
        public Test(int num)  // 构造方法
        {
            this.num = num;
        }
    }
    class TestDemo
    {
        public static void main(String[] args)
        {
            Test t = new Test(3);
            System.out.println(t.num);
        }
    }

    输出结果:
       静态代码
       8
       3

    Test t = new Test(3);这句话都干了什么

    1、new用到Test.class,先找到Test.class文件并加载到内存中 (若如上num在类中静态初始化,则num的值初始化为8,则下文的默认初始化就没了)

    2、执行该类的静态代码块(静态的成员随类加载而执行)

    3、在堆内存中开辟内存空间,分配内存地址,并在栈中创建变量p。

    4、在堆内存中建立对象的特有属性,并进行默认初始化。

    5、对属性进行显示初始化(即用语句对变量进行的初始化,这里指上句中的3)

    6、对对象的构造代码段初始化。

    7、对对象的对应构造函数初始化。

    8、将内存地址赋给内存中的变量。

    这也可以解释为什么静态方法不能调用非静态成员了

    注意:静态的成员是按语句顺序进行执行的,若代码如下: 

    1 static
    2 {
    3     System.out.println("静态代码"+num);
    4 }
    5 static int num = 8;

    则会出现非法向上引用的错误

  • 相关阅读:
    Install Postgresql on Ubuntu
    Pytest
    Pytest
    wrk 压力测试
    Objective-C 格式化字符串Format
    安装BeyondCompare on Ubuntu
    eclipse + python + pydev (Pydev安装成功确看不到插件的解决办法)
    如何解决: Ubuntu 系统 adb devices出现no permissions
    oracle rac搭建
    CentOS6.8编译安装LAMP
  • 原文地址:https://www.cnblogs.com/fantasy01/p/3572530.html
Copyright © 2011-2022 走看看