java 代码块
2016-06-02 22:32
344 查看
静态的方法或者方法块在 类加载的时候就已经初始化了,在类加载的时候 静态绑定。
一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}
类装载步骤:
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
普通块和静态块的异同:
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋
值。
不同点:静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构造方法)。
静态代码块只在第一次new执行一次,之后不在执行,而非静态代码块在每new一次就执行一次。非静态代码块可以
在普通方法中定义(个人感觉作用不大);而静态代码块不行。
示例:
父类方法:
子类方法:
package 方法块;
public class son extends father{
static{
System.out.println("子类的静态方法块");
}
{
System.out.println("子类的方法块");
}
public son() {
System.out.println("子类的构造函数");
}
public static void main(String[] args) {
son s = new son();
}
}
执行的顺序:
main中new 出子类实例时,由于子类继承了父类,会去先装载父类,由于静态方法块在装载的时候就会执行,所以判断父类中是否有静态的方法块,执行完毕后,再去子类中查找是否有静态的方法块,当子类的静态方法块执行完后,执行父类的普通方法块和父类的构造函数,执行结束后,再执行子类的普通方法块和子类的构造函数。
执行结果:
父类的静态方法块
子类的静态方法块
父类的方法块
父类的构造函数
子类的方法块
子类的构造函数
一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
}
类装载步骤:
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
普通块和静态块的异同:
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋
值。
不同点:静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构造方法)。
静态代码块只在第一次new执行一次,之后不在执行,而非静态代码块在每new一次就执行一次。非静态代码块可以
在普通方法中定义(个人感觉作用不大);而静态代码块不行。
示例:
父类方法:
package 方法块; public class father { static{ System.out.println("父类的静态方法块"); } { System.out.println("父类的方法块");<pre name="code" class="java"><span style="white-space:pre"> </span>}public father() {System.out.println("父类的构造函数");}}
子类方法:
package 方法块;
public class son extends father{
static{
System.out.println("子类的静态方法块");
}
{
System.out.println("子类的方法块");
}
public son() {
System.out.println("子类的构造函数");
}
public static void main(String[] args) {
son s = new son();
}
}
执行的顺序:
main中new 出子类实例时,由于子类继承了父类,会去先装载父类,由于静态方法块在装载的时候就会执行,所以判断父类中是否有静态的方法块,执行完毕后,再去子类中查找是否有静态的方法块,当子类的静态方法块执行完后,执行父类的普通方法块和父类的构造函数,执行结束后,再执行子类的普通方法块和子类的构造函数。
执行结果:
父类的静态方法块
子类的静态方法块
父类的方法块
父类的构造函数
子类的方法块
子类的构造函数
相关文章推荐
- Java - 计蒜客 - 简单斐波那契
- Java - 计蒜客 - 判断质数
- 打开eclipse弹出“Failed to load the JNI shared
- Java并发编程-interrupt()方法
- Java - 计蒜客 - 整除问题
- 浅谈java多线程
- Java - 计蒜客 - A+B+C问题
- ubuntu eclipse经常卡死问题
- Java - Nuc - 相对距离
- [Spring MVC] - SpringMVC的各种参数绑定方式
- Windows7安装JDK的环境变量设置javac不是内部命令或外部命令
- java简介
- [javaSE] IO流(对象序列化)
- 深入学习java并发编程:线程池ThreadPoolExecutor实现以及使用
- java开篇三两事
- Eclipse快捷键 10个最有用的快捷键
- JAVA多线程
- Spring笔记
- JAVA之旅(十一)——RuntimeException,异常的总结,Package,jar包,多线程概述
- JAVA之旅(十一)——RuntimeException,异常的总结,Package,jar包,多线程概述