静态代码块,构造代码块,构造函数的执行顺序
2016-08-24 09:08
190 查看
本文转载自:http://www.360doc.com/content/13/0419/16/11965070_279489758.shtml
一般认为这三者执行顺序是静态代码块、非静态代码块、构造函数public class ExA {
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}
执行结果
=====
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
可是静态代码块真的会一定在非静态代码块之前执行吗?
下面这段代码
public class ExA {
private static ExA a = new ExA();
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
private static ExB b = new ExB();
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}
执行结果
=====
父类--非静态代码块
父类--构造函数
父类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
=====
可以发现非静态代码块并不是一定在静态代码块之后执行的。
我认为此时private static ExA a = new ExA()是静态变量。而java里面静态变量与静态代码块是按代码先后顺序执行。所以就导致非静态代码块在静态代码块之前执行。
一般认为这三者执行顺序是静态代码块、非静态代码块、构造函数public class ExA {
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}
执行结果
=====
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
可是静态代码块真的会一定在非静态代码块之前执行吗?
下面这段代码
public class ExA {
private static ExA a = new ExA();
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
private static ExB b = new ExB();
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}
执行结果
=====
父类--非静态代码块
父类--构造函数
父类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
=====
可以发现非静态代码块并不是一定在静态代码块之后执行的。
我认为此时private static ExA a = new ExA()是静态变量。而java里面静态变量与静态代码块是按代码先后顺序执行。所以就导致非静态代码块在静态代码块之前执行。
相关文章推荐
- Java类中子类和基类的构造代码块,静态代码块、子类构造函数,基类构造函数的执行顺序
- 静态代码块,构造代码块,构造函数的执行顺序
- Java静态变量 静态代码块 主函数 成员变量 构造代码块 构造函数的执行顺序
- Java中构造函数、构造代码块、静态代码块等的执行顺序问题
- 静态代码块、构造代码块和构造函数执行顺序
- [java起步]构造函数、构造代码快、静态代码块的执行顺序
- 子类,父类静态代码块,构造代码块,以及构造函数执行顺序
- Java学习笔记——静态代码块,构造代码块,构造函数间的执行顺序
- 构造函数、构造代码块、和静态初始化块的执行顺序
- 静态代码块,静态变量,构造函数和构造代码块的执行顺序
- 关于继承中静态代码块,构造代码块,构造函数执行顺序
- java中的静态代码块、构造代码块、构造函数执行顺序
- 黑马程序员——java中静态代码块、构造代码块、构造函数的执行顺序以及作用
- 静态代码块 构造代码块 构造函数 的用法和执行顺序
- 父类,子类,静态属性,静态代码块,构造代码块,构造函数,执行顺序
- 静态代码块、构造代码块以及构造函数执行顺序实验
- 构造函数,静态代码块,构造代码块与方法的执行顺序
- 【面相对象】静态代码块、构造代码块和构造函数的执行顺序
- 静态代码块,构造代码块,构造函数之间的差别及先后执行顺序
- java子类父类静态代码块 构造代码块 构造函数执行顺序