构造方法调用顺序

http://blog.csdn.net/macheng365/article/details/6403050

并不是首先调用其构造方法而是先是成员变量的初始化,而且成员的初始化的顺序以成员变量的定义顺序有关,先定义的先初始化,初始化后再调用构造方法。其实成员变量的初始化,在类的所有方法调用之前进行,包括构造方法。

static的成员比普通的成员变量先初始化。


public class Test04 ...{
private static Test04 t1 = new Test04();
private static int i1;
private static int i2 = 2;

public Test04()...{
i1++;
i2++;
}

public static void main(String[] args) ...{
Test04 t2 = new Test04();
System.out.println("t2.i1 = " + t2.i1);
System.out.println("t2.i2 = " + t2.i2);
}
}
我们先预计一下输出,可能有几种答案:2和3,3和3,2和2
执行代码后:
t2.i1 = 2
t2.i2 = 3

其实代码的执行顺序是这样的:首先执行给t1,i1,i2分别给予初始值null,0,0,再执行
Test04 t1 =new
Test04(),这样i1++,i2++被执行,i1,i2都变为1,执行完毕后接着执行int i1; i1,i2的值仍然是1,1,当执行int i2 =
2时i2被赋予了值,即i1 = 1,i2=2;再执行Test04 t2 = new Test04(),i1,i2再执行++,此时i1 =2,i2
=3,输出i1,i2,结果就是:t2.i1 = 2,t2.i2 = 3。
通过上面的代码我们可以认为系统默认值的给予比通过等号的赋予先执行。

当父类,和子类有Static时,先初始化父类Static,再初始化子类的Static,再初始化父类的其他成员变量->父类构造方法->子类其他成员变量->子类的构造方法。
父类上层还有父类时,总是先执行最顶层父类的Static-->派生类Static-->派生类Static-->.......-->子类Static-->顶层父类的其他成员变量-->父类构造方法-->
派生类的其他成员变量 --> 派生类构造方法-->
...............-->子类其他成员变量-->子类构造方法

下面需要说明的一点也是至关重要的一点:那就是成员变量的初始化和非static初始化块之间的执行顺序是按照他们出现的先后顺序来执行的

构造方法调用顺序,布布扣,bubuko.com

时间: 2024-10-12 23:39:46

构造方法调用顺序的相关文章

Java类加载及实例化的调用顺序

标题起得略拗口,大概意思就是说在一个Java类中,域和构造方法的调用顺序. 1. 没有继承的情况 单独一个类的场景下,初始化顺序为依次为 静态数据,继承的基类的构造函数,成员变量,被调用的构造函数. 其中静态数据只会初始化一次. package com.khlin.binding.test; public class App2 { public static void main(String[] args) { Son son = new Son(); } } class Son { publi

Java类的调用顺序决定的单例模式

学习Java有一年多,很多基础知识是了解的,有些知道怎么用,但不明白,它是怎么来的. 经常在书上看到介绍类里面的构造方法,静态方法,普通方法与静态变量,调用顺序,但不明白它的真正用处. 今天走进公司时,我突然间,想到了Java的类中,方法,变量的调用顺序重要吗,我一下就想到了单例模式,因为我之前只是知道单例模式的用处,但不明白它怎么来的,单例模式不就是根据类的启动顺序写出来,因为类会先调用static,然后,再是构造函数,可见有些知识点,你只要灵活一点,就大有用处,当然不知,大家认为我的观点对不

java面试基础题------》Java 中的父子类静态代码块,代码块,构造方法执行顺序

4.指出下面程序的运行结果. class A { static { System.out.print("1"); } public A() { System.out.print("2"); } } class B extends A{ static { System.out.print("a"); } public B() { System.out.print("b"); } } public class Hello { pu

Java对象创建阶段的代码调用顺序

在创建阶段系统通过下面的几个步骤来完成对象的创建过程 为对象分配存储空间 开始构造对象 从超类到子类对static成员进行初始化 超类成员变量按顺序初始化,递归调用超类的构造方法 子类成员变量按顺序初始化,子类构造方法调用 本文重点演示第三步到第五步: Grandpa类 1 package com.xinye.test; 2 3 public class Grandpa { 4 { 5 System.out.println("执行Grandpa的普通块"); 6 } 7 static

async 与 await 线程调用顺序

用async做一个多线程下载并在datagridview中即时更新,运行时在达到4个线程同时下载时界面卡顿,多次尝试后是不知道async与await线程调用顺序造成. 进入async方法后在调用await之前代码都在主线程(调用线程)中运行,调用await时及之后的async方法代码将另起线程运行该部分代码,而主线程在遇到await后回到主线程继续执行async后的代码. 将async方法通过声明委托后用begininvoke调用后解决.

讨论printf和cout的参数调用顺序

这里纠正在网络上看到的几个错误,以下给出正确的观点: (1)printf和cout都是有缓冲机制的.(有人认为printf是没有缓冲区的) (2)printf和cout函数对参数的调用顺序在c/c++中是未定义的.(有人认为它们读入的顺序是由右向左,输出顺序是由左到右,类似于栈) 基于以上错误的认识,看下列程序,有人会得到错误的输出的结果. #include <stdio.h> #include <iostream> using namespace std; int main()

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

Activity生命周期方法的调用顺序工程与测试日志

下面为测试activity的方法的执行顺序   工程与测试资源地址 android工程 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.finalizetest"

C++C++中构造函数与析构函数的调用顺序

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象