Java类的加载

无父类

加载顺序

  1. 为静态变量开辟空间(默认初始化),然后显示初始化
  2. 静态代码块
  3. 静态方法
  4. new语句明确首地址,在堆内存中为对象开辟相应大小的空间(默认初始化),此时有了this这一概念
  5. 成员变量的显示初始化。
  6. 构造代码块
  7. 构造函数

代码

public class Main {
    public static void main(String args[])
    {
        /*1*/
        Demo a=new Demo();    /*堆*/
//      /*2*/
//      Demo.funtion2();
//      /*3*/
//      Demo b=new Demo();
//      b.funtion1();
//      /*4*/
//      Demo c=new Demo();
//      System.out.println(c.dNum1);
//      /*5*/
//      Demo d=new Demo();
//      System.out.println(d.dNum2);
//      /*6*/
//      System.out.println(Demo.dNum3);
//      /*7*/
//      System.out.println(Demo.dNum4);

    }
}
class Demo
{
    int dNum1=5;           /*堆*/
    final int dNum2=10;    /*堆*/
    static int dNum3=15;   /*堆->方法区->静态方法区*/
    final static int dNum4=20;  /*堆->方法区->常量池*/

    {      /*堆->方法区*/
        System.out.println("构造代码块        " + dNum1 + "    " + dNum2 + "    " + dNum3 + "    " + dNum4);
    }

    static    /*堆->方法区->静态方法区*/
    {
        System.out.println("静态代码块        " +dNum3 +"   "+ dNum4);
    }

    Demo()      /*堆->方法区*/
    {
        System.out.println("默认构造函数    " + dNum1 + "    " + dNum2 + "    " + dNum3 + "    " + dNum4);
    }

    void funtion1()      /*堆->方法区*/
    {
        System.out.println("普通成员方法    "+ dNum1 + "    " + dNum2 + "    " + dNum3 + "    " + dNum4);
    }

    static void funtion2()     /*堆->方法区->静态方法区*/
    {
        System.out.println("静态方法    " + dNum3 + "    " + dNum4);
    }

}

输出

/* 1 */

静态代码块 15 20
构造代码块 5 10 15 20
默认构造函数 5 10 15 20

/* 2 */

静态代码块 15 20
静态方法 15 20

/* 3 */

静态代码块 15 20
构造代码块 5 10 15 20
默认构造函数 5 10 15 20
普通成员方法 5 10 15 20

/* 4 */

静态代码块 15 20
构造代码块 5 10 15 20
默认构造函数 5 10 15 20
5

/* 5 */

静态代码块 15 20
构造代码块 5 10 15 20
默认构造函数 5 10 15 20
10

/* 6 */

静态代码块 15 20
15

/* 7 */

20


final关键字 引用

额外:final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
答:http://blog.csdn.net/u012110719/article/details/46334413


有父类

加载顺序

  1. 父类加载,为父类的静态变量开辟空间(默认初始化),然后显示初始化
  2. 父类的静态代码块
  3. 父类的静态方法
  4. 子类的静态变量开辟空间(默认初始化),然后显示初始化
  5. 子类的静态代码块
  6. 子类的静态方法
  7. 父类super这一概念
  8. 父类成员变量的显示初始化。
  9. 父类的构造代码块
  10. 父类的构造函数
  11. 子类new语句明确首地址,在堆内存中为对象开辟相应大小的空间(默认初始化),此时有了this这一概念
  12. 子类成员变量的显示初始化。
  13. 子类构造代码块
  14. 子类构造函数

代码

public class Main {
    public static void main(String args[])
    {
        /*1*/
        Demo a=new Demo();
//      /*2*/
//      Demo.funtion2();
//      /*3*/
//      Demo b=new Demo();
//      b.funtion1();
//      /*4*/
//      Demo c=new Demo();
//      System.out.println(c.dNum1);
//      /*5*/
//      Demo d=new Demo();
//      System.out.println(d.dNum2);
//      /*6*/
//      System.out.println(Demo.dNum3);
//      /*7*/
//      System.out.println(Demo.dNum4);
//      /*8*/
//      Demo d=new Demo();
//      System.out.println(d.fNum2);
//      /*9*/
//      System.out.println(Demo.fNum3);
//      /*10*/
//      System.out.println(Demo.fNum4);
    }
}
class Demo extends Father
{
    int dNum1=5;           /*堆*/
    final int dNum2=10;    /*堆*/
    static int dNum3=15;   /*静态方法区*/
    final static int dNum4=20;       /*常量池*/

    {
        System.out.println("子类的      构造代码块        " + dNum1 + "    " + dNum2 + "    " + dNum3 + "    " + dNum4);
    }

    static
    {
        System.out.println("子类的      静态代码块        " +dNum3 +"   "+ dNum4);
    }

    Demo()
    {
        System.out.println("子类的      默认构造函数    " + dNum1 + "    " + dNum2 + "    " + dNum3 + "    " + dNum4);
    }

    void funtion1()
    {
        System.out.println("子类的      普通成员方法    "+ dNum1 + "    " + dNum2 + "    " + dNum3 + "    " + dNum4);
    }

    static void funtion2()
    {
        System.out.println("子类的     静态方法    " + dNum3 + "    " + dNum4);
    }
}

class Father
{
    int fNum1=-5;         /*堆*/
    final int fNum2=-10;  /*堆*/
    static int fNum3=-15; /*静态方法区*/
    final static int fNum4=-20;        /*常量池*/

    {
        System.out.println("父类的      构造代码块        " + fNum1 + "    " + fNum2 + "    " + fNum3 + "    " + fNum4);
    }

    static
    {
        System.out.println("父类的      静态代码块        " +fNum3 +"   "+ fNum4);
    }

    Father()
    {
        System.out.println("父类的      默认构造函数    " + fNum1 + "    " + fNum2 + "    " + fNum3 + "    " + fNum4);
    }

    void funtion1()
    {
        System.out.println("父类的     普通成员方法    "+ fNum1 + "    " + fNum2 + "    " + fNum3 + "    " + fNum4);
    }

    static void funtion2()
    {
        System.out.println("父类的     静态方法    " + fNum3 + "    " + fNum4);
    }
}

输出

/* 1 */

父类的 静态代码块 -15 -20
子类的 静态代码块 15 20
父类的 构造代码块 -5 -10 -15 -20
父类的 默认构造函数 -5 -10 -15 -20
子类的 构造代码块 5 10 15 20
子类的 默认构造函数 5 10 15 20

/* 2 */

父类的 静态代码块 -15 -20
子类的 静态代码块 15 20
子类的 静态方法 15 20

/* 3 */

父类的 静态代码块 -15 -20
子类的 静态代码块 15 20
父类的 构造代码块 -5 -10 -15 -20
父类的 默认构造函数 -5 -10 -15 -20
子类的 构造代码块 5 10 15 20
子类的 默认构造函数 5 10 15 20
子类的 普通成员方法 5 10 15 20

/* 4 */

父类的 静态代码块 -15 -20
子类的 静态代码块 15 20
父类的 构造代码块 -5 -10 -15 -20
父类的 默认构造函数 -5 -10 -15 -20
子类的 构造代码块 5 10 15 20
子类的 默认构造函数 5 10 15 20
5

/* 5 */

父类的 静态代码块 -15 -20
子类的 静态代码块 15 20
父类的 构造代码块 -5 -10 -15 -20
父类的 默认构造函数 -5 -10 -15 -20
子类的 构造代码块 5 10 15 20
子类的 默认构造函数 5 10 15 20
10

/* 6 */

父类的 静态代码块 -15 -20
子类的 静态代码块 15 20
15

/* 7 */

20

/* 8 */

父类的 静态代码块 -15 -20
子类的 静态代码块 15 20
父类的 构造代码块 -5 -10 -15 -20
父类的 默认构造函数 -5 -10 -15 -20
子类的 构造代码块 5 10 15 20
子类的 默认构造函数 5 10 15 20
-10

/* 9 */

父类的 静态代码块 -15 -20
-15

/* 10 */

-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值