Java中的代码块系列1——静态代码块和构造代码块的调用机制
来源:互联网 发布:windows如何打包tar 编辑:程序博客网 时间:2024/06/05 18:00
Java中有代码块分为4种:普通代码块、构造断码块、静态代码快、同步代码块。
普通代码块指的就是一般方法中的花括号的代码段。
构造代码块就是在类中,不属于任何方法的代码段(当然是在花括号内)。
静态代码块就是在类中,不属于任何方法的代码段,并且“{”的前面有static。
同步代码块用在线程间。
package JLearner.codeblock; public class Parent { { //构造代码快 System.out.println("Parent' Block"); } static{ //静态代码快 System.out.println("Parent' Static Block"); } public Parent() { System.out.println("Parent' Constructor"); } public static void StaticMethod() { System.out.println("Parent' StaticMethod"); } }
package JLearner.codeblock; public class Child extends Parent { { //构造代码快 System.out.println("Child' Block"); } static{ //静态代码快 System.out.println("Child' Static Block"); } public Child() { System.out.println("Child' Constructor"); } public static void StaticMethod() { System.out.println("Child' StaticMethod"); }}
下面的各个部分分别执行,即保证是程序第一次调用。
执行效果即输出在注释里,总结也看注释
package JLearner.codeblock; public class RunTest { public static void main(String[] args) { // TODO Auto-generated method stub //每当生成子类的对象时,它的加载顺序值得记住它: //首先是执行所有静态代码块,先是父类的,然后是子类的 //接下来是非静态部分(构造) //然后执行父类的构造代码块,之后是父类的构造方法(即构造代码块在构造函数之前被执行) //然后执行子类的构造代码块,最后是子类的构造方法// new Child(); /* Parent' Static Block Child' Static Block Parent' Block Parent' Constructor Child' Block Child' Constructor*/ //当调用子类的静态方法时,父类和子类都是要加载的,所以两个类的静态代码块被首先调用 //之后直接调用子类本身的静态方法 //注意:只是调用类的静态方法,而不生成对象的话,构造代码块不会被执行// Child.StaticMethod();/* Parent' Static Block Child' Static Block Child' StaticMethod*/ //调用父类类似// Parent.StaticMethod();/* Parent' Static Block Parent' StaticMethod */ //连续生成两个子类对象,可以发现: //静态代码块只会在程序运行第一次加载相应或者相关(如父子关系)的类时才会被调用 //也就是说静态代码块只会被调用一次 //而构造代码块则是每次生成对象时都会被调用// new Child();// new Child();/* Parent' Static Block Child' Static Block Parent' Block Parent' Constructor Child' Block Child' Constructor Parent' Block Parent' Constructor Child' Block Child' Constructor*/ //那么怎么算是加载类呢?即什么样的操作被认为是第一次加载类呢? //这里做了另外2个实验。 //之前的new操作(生成对象),毫无疑问,将对对象所对应的类以及其对应的父类(或者父类的父类。。。)进行加载 //注意:而 “类名.class”是不会加载类的。 //从下面的例子可以看到: //静态代码块没有被执行 //System.out.println(Child.class.toString());/* class JLearner.codeblock.Child */ //而使用Class.forName是会加载类的,也就是说,使用Class.forName可能执行类的静态代码块// try {// Class.forName("JLearner.codeblock.Child");// } catch (ClassNotFoundException e) {// // TODO Auto-generated catch block// e.printStackTrace();// }/* Parent' Static Block Child' Static Block */ } }
0 0
- Java中的代码块系列1——静态代码块和构造代码块的调用机制
- java中的静态代码块、构造代码块、普通代码块和同步代码块总结
- java中的静态代码块、构造代码块、普通代码块和同步代码块总结
- java中的普通代码块、静态代码块、构造代码块和同步代码块
- Java构造函数、构造代码块和静态代码块的区别和调用时间
- Java的构造方法和构造代码块,静态代码块,代码块
- 区分Java中的普通代码块、构造代码块和静态代码块
- Java中的代码块(静态代码块、构造代码块、局部代码块)
- Java中的构造函数、构造代码块、静态代码块
- Java中的构造代码块、静态代码块、普通代码块的区别
- 静态代码块和构造代码块
- 静态代码块和构造代码块
- java的代码块优先级 (静态代码块,构造代码块,普通代码块)
- Java静态代码块,构造代码块,普通代码块
- Java:普通代码块、构造代码块、静态代码块
- Java-普通代码块,构造代码块,静态代码块
- java-代码块、静态代码块、构造代码块
- java 代码块,构造代码块,与静态代码块
- KSS2目标成本和控制成本的定义
- 重定向(forward与sendRedirect)区别
- Java-面向对象
- Android eclipse 项目R文件无法生成
- Android源码之Sp与Wp
- Java中的代码块系列1——静态代码块和构造代码块的调用机制
- java项目中Javah的使用
- 关于Java 23种设计模式的有趣见解
- ThinkPHP实现跨模块调用操作方法概述
- 命令行下运行hello world
- 大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合
- iOS开发系列--数据存取
- Java对象的序列化和反序列化
- hadoop2.7集群完全分布式安装配置