• demo1

/*** java规定,变量没有初始化不能使用,全局变量也就是类的属性,java会在编译的时候,自动将他们初始化,* 所以可以不进行变量初始化的操作,☆☆☆☆☆但是(局部)变量必须初始化☆☆☆☆☆** 静态数据的初始化* 初始化的顺序是:先静态对象,而后是“非静态”对象。** 非静态成员初始化* 在一个类中,非静态成员的初始化,发生在任何方法(包括构造方法)被调用之前。并且它们定义的顺序,决定了初始化的顺序* 变量初始化完成之后才厚调用构造函数** 先加载类:执行静态块,静态变量赋值 因为静态部分是依赖于类,而不是依赖于对象存在的,所以静态部分的加载优先于对象存在***/
public class Singleton {//1.private static int x = 0;private static int y;//2.private static Singleton instance = new Singleton();/*** -----------------------------------------------------------------------------------------* 构造方法是new对象的时候进行调用(此时变量已经初始化完成)* 如果注释1在上面 注释2在下面 打印结果为 1 1  准备阶段先对静态变量进行x,y进行赋初始值0,0* 然后new Singleton对象开始调用构造函数的x++,y++所以x,y的值变为1,1** 注意:不可以在构造函数的参数初始化表中对静态成员变量初始化,但是可以在构造函数中修改静态变量的值* 如果注释2在上面 注释1在下面 打印结果为 0 1* 先进行++操作 x,y的值变为1,1 后面对x,y进行初始化操作**/private Singleton(){x++;y++;}public static void main(String[] args) {System.out.println(Singleton.x);System.out.println(Singleton.y);}}
  • demo2
class ConstroctTest {//静态变量sta1    未赋予初始值public static int sta1;//静态变量sta1    赋予初始值20public static int sta2 = 20;private static ConstroctTest test = new ConstroctTest();//构造方法中对于静态变量赋值private ConstroctTest() {System.out.println("123456");sta1 ++ ;sta2 ++ ;}/*** 打印结果* 123456* 1* 21* 1* 1** 1. 从结果可以看出,Java的静态变量,只是在类第一次加载,初始化的时候执行。* 2. 类变量不依赖类的实例,类变量只在初始化时候在栈内存中被分配一次空间,无论类的实例被创建几次,都不再为类变量分配空间。* 3. 可以看出 ,类变量的执行与初始化,与实例对象没有关系。* @param args*/public static void main(String[] args) {System.out.println(ConstroctTest.sta1);System.out.println(ConstroctTest.sta2);System.out.println(ConstroctTest.sta1);System.out.println(ConstroctTest.sta1);}
}
  • demo3

class Parent{static String name1 = "hello";static{System.out.println("Parent static block");}public Parent(){System.out.println("Parent construct block");}
}
class Child extends Parent{static String name2 = "hello";static{System.out.println("Child static block");}public Child(){System.out.println("Child construct block");}
}class Test{/*** 打印结果* Parent static block* Child static block* Parent construct block* Child construct block** 结果分析:* 1. 先初始化父类的静态属性在执行子类的静态属性,再是父类的构造方法再是子类的构造方法。* 2. 实例化 Child 类。第一要初始化类Child ,因为Child拥有父类(会判断父类是否初始化),* 类的初始化只有一次。初始化类(就是按照顺序加载静态变量与静态方法)。* 3. 初始化Child后。开始实例化Child ,因为拥有父类,所以调用构造方法之前会调用父类的默认构造方法。** @param args*/public static void main(String[] args){Child ch = new Child();}
}
  • demo4
class Animal {private static int k;static{System.out.println("父类的静态方法");}{System.out.println("执行父类的构造代码块");}public Animal(){System.out.println("执行父类的构造方法");}/*** 执行结果  不会打印构造代码块和构造方法中的代码* 父类的静态方法* 0** @param args*/public static void main(String[] args) {System.out.println(Animal.k);}
}
  • demo5
class Animal1 {private static int k;{System.out.println("执行父类的构造代码块");}static{System.out.println("父类的静态方法");}public Animal1(){System.out.println("执行父类的构造方法");}/**** 构造代码块先于构造方法执行  静态代码块只会执行一次** 执行结果:* 父类的静态方法* 执行父类的构造代码块* 执行父类的构造方法* 执行父类的构造代码块* 执行父类的构造方法* @param args*/public static void main(String[] args) {Animal1 animal1 = new Animal1();Animal1 animal2 = new Animal1();}
}
  • demo6
class Cat {private static int a;private static int b = 1000;static{a = 100;b = 200;}public  Cat cat = new Cat();public Cat(){a=100000;b=200000;}/**** 静态代码块中的内容,看做是赋值操作* 如果public  Cat cat = new Cat();不带static 那么输出结果100,200* 如果public static Cat cat = new Cat(); 那么输出结果100000,200000** 执行结果* 100000* 200000** @param args*/public static void main(String[] args) {System.out.println(Cat.a);System.out.println(Cat.b);}
}
  • demo7

class A {static {System.out.println("A的静态块");}private static String staticStr = getStaticStr();private String str = getStr();{System.out.println("A的实例块");}public A() {System.out.println("A的构造方法");}private static String getStaticStr() {System.out.println("A的静态属性初始化");return null;}private String getStr() {System.out.println("A的实例属性初始化");return null;}/*** A的静态块* A的静态属性初始化* B的静态属性初始化* B的静态块* A的实例属性初始化* A的实例块* A的构造方法* B的实例块* B的实例属性初始化* B的构造方法* A的实例属性初始化* A的实例块* A的构造方法* B的实例块* B的实例属性初始化* B的构造方法***由此可见,实例化子类的时候,若此类未被加载过,首先加载是父类的类对象,* 然后加载子类的类对象,接着实例化父类,最后实例化子类,若此类被加载过,不再加载父类和子类的类对象。** 接下来是加载顺序,当加载类对象时,首先初始化静态属性,然后执行静态块;当实例化对象时,* 首先执行构造块(直接写在类中的代码块),然后执行构造方法。* 至于各静态块和静态属性初始化哪个些执行,是按代码的先后顺序。属性、构造块(也就是上面的实例块)、* 构造方法之间的执行顺序(但构造块一定会在构造方法前执行),也是按代码的先后顺序。* @param args*/public static void main(String[] args) {new B();new B();}}
class B extends A{private static String staticStr = getStaticStr();static {System.out.println("B的静态块");}{System.out.println("B的实例块");}public B() {System.out.println("B的构造方法");}private String str = getStr();private static String getStaticStr() {System.out.println("B的静态属性初始化");return null;}private String getStr() {System.out.println("B的实例属性初始化");return null;}
}

java类加载 静态变量和构造方法加载顺序相关推荐

  1. java类加载器可以从互联网加载,Java类加载器深入解析(2)

    在做Java开发时了解Java类加载机制是非常好的.而对类加载机制的基本理解对Java开发人员处理类加载器(ClassLoader)相关的异常也很有帮助. 类加载器委托机制 Java类的装载是通过类加 ...

  2. java 类加载器的理解及加载机制?

    通过 java 命令运行 java 程序的步骤就是指定包含 main 方法的完整类名以及一个 classpath 类路径,类路径可以有多个,对于直接的 class 文件路径就是 class 文件的根目 ...

  3. java进阶(9)——JVM jar包加载顺序

    最近工作当中遇到过好几例,由于项目当中依赖了一些框架,而这些框架无法直接修改时,我就直接本地代码写了一个同名同包路径的类,可以直接覆盖框架的类(本文说的框架类,不包括jdk的),屡试不爽.但是心里不免 ...

  4. java静态代码块和静态变量_java静态变量和静态代码块的加载顺序

    静态变量的声明和赋值是分开的,变量名的声明先加载,赋值是按照代码顺序执行. public class Test { static { NAME = "xing"; } privat ...

  5. java类加载过程_java类的加载过程

    在这本书里面,在讲到类初始化的五种情况时,提及了一个比较有趣的事情.先来看看下面的代码 public class SubClass { static{ System.err.println(" ...

  6. Java面试题之类的静态代码块和静态属性等的加载顺序

    如以下面试题: /** * @author hjs * @date 2019/3/62:41 * @Dec */public class B { public static B t1 = new B( ...

  7. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  8. java类验证和装载顺序_Java类的加载顺序

    1.有继承关系的加载顺序 关于关键字static,大家 都知道它是静态的,相当于一个全局变量,也就是这个属性或者方法是可以通过类来访问,当class文件被加载进内存,开始初始化的时候,被static修 ...

  9. java代码加载_java类中代码加载顺序

    package org.senssic; /** * 一般顺序:静态块-->静态变量-->成员变量-->构造方法-->静态方法(或非静态方法,需要调用) * 1.静态代码块(只 ...

最新文章

  1. 数据库锁解决并发问题
  2. 校园资源建设平台源代码
  3. Linux系统与性能监控
  4. python--切片
  5. python_0基础开始_day05
  6. Python中文件的介绍以及操作
  7. 梁戈碧:促数据中心转型 释放数据洞察力
  8. 4/100. Maximum Depth of Binary Tree
  9. java jooq_将Java EE与jOOQ结合使用的初学者指南
  10. EasyNVR H5无插件摄像机直播解决方案前端解析之:videojs初始化的一些样式处理...
  11. CentOS7没有ifconfig命令的解决方法
  12. 设计一个完善可用的服务框架
  13. Linux 命令(24)—— mv 命令
  14. c语言的编译器还真是不好理解...
  15. 织梦dede仿站模板标签大全(最全)附带仿站工具
  16. 曲终人散,我亦是行人。
  17. 趣味选择题.html
  18. 网站服务器防御怎么查,如何查看服务器被攻击
  19. 关于将EXCEL文件导入到MYSQL数据库的一些方法
  20. CEC循环生态社区周而复始生生不息推进XAG令牌市场

热门文章

  1. 复习_for循环嵌套 及 流程图梳理
  2. OpenCV图像处理--Qt+OpenCV环境搭建
  3. C语言读取txt文件内容
  4. Android4.×耳机插拔检测
  5. 常用git指令(以及绑定远程仓库)
  6. koa2 + vue上传图片到七牛云
  7. A NEW COEFFICIENT OF CORRELATION文献阅读
  8. QT开发--仿写一个智能家居APP
  9. 2012年12月读书计划
  10. Python 爬虫初探