来源:https://www.cnblogs.com/sxkgeek/p/9647992.html

1、有继承关系的加载顺序

关于关键字static,大家 都知道它是静态的,相当于一个全局变量,也就是这个属性或者方法是可以通过类来访问,当class文件被加载进内存,开始初始化的时候,被static修饰的变量或者方法即被分配了内存,而其他变量是在对象被创建后,才被分配了内存的。

所以在类中,加载顺序为:

1.首先加载父类的静态字段或者静态语句块

2.子类的静态字段或静态语句块

3.父类普通变量以及语句块

4.父类构造方法被加载

5.子类变量或者语句块被加载

6.子类构造方法被加载

父类代码:

public class FuLei {
static int num  = 5;//1.首先被加载
static{System.out.println("静态语句块已经被加载"+num); //2.被加载
}
int count = 0; //5.被加载
{System.out.println("普通语句块"+count++);//6.被加载
}
public FuLei(){System.out.println("父类的构造方法在这时候加载count="+count);//7.被加载
}
}

子类代码:

public class ZiLei extends FuLei {
static{System.out.println("静态语句块和静态变量被初始化的顺序与代码先后顺序有关"); //3.被加载
}
static int num = 45;//4.被加载
int numre = 0; //8.被加载
{numre++;System.out.println("numre"+numre);//9.被加载}
public ZiLei(){System.out.println("子类构造方法");//10.被加载
}
public static void main(String[] args){ZiLei ht = new ZiLei();
}
}

console打印:

静态语句块已经被加载5
静态语句块和静态变量被初始化的顺序与代码先后顺序有关
普通语句块0
父类的构造方法在这时候加载count=1
numre1
子类构造方法

注意

当class文件被加载进内存,开始初始化的时候,被static修饰的变量或者方法即被分配了内存,而其他变量是在对象被创建后,才被分配了内存的。

将子类代码中的创建对象注释掉

// ZiLei ht = new ZiLei();

console打印:

静态语句块已经被加载5
静态语句块和静态变量被初始化的顺序与代码先后顺序有关

2、没有继承关系的加载顺序

代码示例

public class Test {
public static void main(String[] args) {new Test();                         //4.第四步,new一个类,但在new之前要处理匿名代码块
}static int num = 4;                    //2.第二步,静态变量和静态代码块的加载顺序由编写先后决定{num += 3;System.out.println("b");           //5.第五步,按照顺序加载匿名代码块,代码块中有打印
}int a = 5;                             //6.第六步,按照顺序加载变量{ // 成员变量第三个System.out.println("c");           //7.第七步,按照顺序打印c
}Test() { // 类的构造函数,第四个加载System.out.println("d");           //8.第八步,最后加载构造函数,完成对象的建立
}static {                              // 3.第三步,静态块,然后执行静态代码块,因为有输出,故打印aSystem.out.println("a");
}static void run()                    // 静态方法,调用的时候才加载// 注意看,e没有加载
{System.out.println("e");
}
}

console打印:

a
b
c
d

3、注意

  • 静态代码块(只加载一次)
  • 构造方法(创建一个实例就加载一次)
  • 静态方法,调用的时候才会加载,不调用的时候不会加载
  • 静态语句块和静态变量被初始化的顺序与代码先后顺序有关

public class ExtendsTest {

public static void main(String[] args) {
        // TODO Auto-generated method stub
        C c = new  D();
    }

}
class C {
    static
    {
        System.out.println("C 基类静态域 ");
    }
    {
        System.out.println("C 基类对象成员构造函数");
    }
    public C(){
        System.out.println("C 基类本身的构造函数");
    }
}
class D extends C{
    static
    {
        System.out.println("D 派生类静态域");
    }
    {
        System.out.println("D 派生类对象成员构造函数");
    }
    public D(){
        System.out.println("D 派生类本身的构造函数");
    }

}

运行结果:

C 基类静态域
D 派生类静态域
C 基类对象成员构造函数
C 基类本身的构造函数
D 派生类对象成员构造函数
D 派生类本身的构造函数

Java--类的加载顺序相关推荐

  1. java 类的加载顺序

    类的加载顺序 public class ClassA {public static ClassA classa = new ClassA();static{System.out.println(&qu ...

  2. java类的加载顺序题目_Java 类的加载顺序(题)

    引例 public class A extends B { public int a = 100; public A() { super(); System.out.println(a); a = 2 ...

  3. java 类的加载顺序

    Java类加载机制中最重要的就是程序初始化过程,其中包含了静态资源,非静态资源,父类子类,构造方法之间的执行顺序.今天就来理一理这之间的关系 先上代码: public class test_no {p ...

  4. Java类的加载顺序

    一.知识 静态: (1) 父类静态成员和静态代码块 (2) 子类静态成员和静态代码块 非静态: (3) 父类非静态成员和非静态代码块 (4) 父类构造函数 (5) 子类 非静态成员和非静态代码块 (6 ...

  5. java中类的加载顺序

    java中类加载顺序: 1)静态代码块只执行一次:静态代码块首先被初始化 2)构造代码块在每次创建对象都会执行:构造函数都是最后执行的. 3)按照父子类继承关系进行初始化,先执行父类的初始化: 4)程 ...

  6. Java内部类以及类的加载顺序(一)

    java内部类以及类的加载顺序(一) Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类.根据定义的方式不同,内部类分为四大类静态内部类,成员内部类,局部内部类,匿 ...

  7. Java深度历险(二)——Java类的加载、链接和初始化

    在上一篇文章中介绍了Java字节代码的操纵,其中提到了利用Java类加载器来加载修改过后的字节代码并在JVM上执行.本文接着上一篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式 ...

  8. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  9. 这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析

    前言 package com.jvm.classloader;class Father2{public static String strFather="HelloJVM_Father&qu ...

  10. java类的加载,链接,初始化

    Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始 ...

最新文章

  1. java性能优化权威指南_Java性能优化权威指南 PDF扫描[132MB]
  2. C语言递归算法十进制数转换为八进制(附完整源码)
  3. java动态代理技术
  4. Mysql中explain命令查看语句执行概况
  5. python中int函数的用法浅析_Python中int()函数的用法浅析
  6. 包体 400 KB,首开 0.2 s,真有这样的播放器 SDK!
  7. 单目视觉里程计 mono vo
  8. .NET四种注释规范
  9. Android进阶笔记12:ListView篇之图片优化
  10. 最好用的五大服装进销存管理软件,强推第一个
  11. chrome插件开发引入图片静态资源
  12. jupyter代码字体大小_Jupyter Notebook 更改字体、字体大小、行高
  13. Chef入门详解 Chef安装 Chef使用
  14. mock gps android,Mock GPS with joystick
  15. 淘宝标题怎么写才能具有高权重
  16. javascript练习题三
  17. 同文输入法 android,同文输入法(com.osfans.trime) - 3.1.3 - 应用 - 酷安
  18. 大牛项目经理10年经验分享!
  19. 血性的青,尿性的春——《中国合伙人》影评
  20. nacos在国产银河麒麟系统飞腾CPU部署安装

热门文章

  1. 计算机网络(第7版)——谢希仁 课后习题3-26
  2. for、while、do while循环的流程图表示及相应continue、break的流程图表示
  3. Number与String之间的类型转换,进制转换
  4. R语言可以直接从数据库读取数据么?R语言读取数据库数据示例
  5. thinkphp 源码分析(四)—— 错误和异常处理 以及 log 日志
  6. form表单提交数据(包括文字和图片)实例
  7. java包装类为什么会有包装类
  8. im中的定位消息 ios_仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]...
  9. 微信开发过程中有关资金安全的一些想法
  10. 杨辉三角形(Java版)