初始化顺序疑惑,求解答

问题描述

classTag{Tag(intmarker){System.out.println("Tag("+marker+")");}}classCard{Tagt1=newTag(1);//BeforeconstructorCard(){//Indicatewe'reintheconstructor:System.out.println("Card()");t3=newTag(33);//Reinitializet3}Tagt2=newTag(2);//AfterconstructorTagt3=newTag(3);//Atend}publicclassOrderOfInitialization{publicstaticvoidmain(String[]args){Cardt=newCard();}Tagt4=newTag(4);staticTagt5=newTag(5);}///:~这个程序的输出结果是Tag(5)Tag(1)Tag(2)Tag(3)Card()Tag(33)————————————————为什么主class中的field:Tagt4=newTag(4)不会执行到呢?不是按照先field再method的顺序执行的吗?谢谢。

解决方案

解决方案二:
这个问题很简单,因为t4不是静态成员注意,非静态成员只有在创建该类对象的时候才会进行初始化而t5是静态成员,它在你装载主class的时候(访问主类的main方法时)就进行初始化了,所以是第一个其它的就不解释了你在main里加上语句newOrderOfInitialization();试试,T4就出来了
解决方案三:
回答过类似的问题,直接复制给你。。。java编译器确保域(成员变量或块)在被使用之前必需初始化,即使你没直接初始化,它也会默认给你一个值。1.如果不涉及继承跟static,用new创建对象时,会调用那个类的构造函数,而在调用构造函数之前必需先初始化域(因为在构造函数里,可能会用到这些成员变量)等域初始化完后再调用构造函数。强调一点:只要是成员变量,那么不管它放在类的哪个部位(但在方法或块内部不算,因为那算是局部变量),它都在构造函数调用之前调用,这是编译器确保的。2.如果涉及继承,当用new创建子类对象时,调用顺序是这样的:1.先初始化父类的域(成员变量或块)2.调用父类的构造函数(没有明确定义的话,调用默认那个,即编译器为你创建的)3.再到子类,初始化子类的域4.这时才轮到调用子类的构造函数原则是:要确保域在被调用之前要被初始化.上面是涉及两层,如果是涉及多层继承的,那么一致递推上去,即先初始化父类的域,然后调用父类构造函数,再初始化子类的域然后再调用子类的构造函数,再初始化子子类的域(用这个名字好像有点怪,哈哈,就是孙子类的意思)然后再调用子子类的构造函数,一致类推下去3.涉及static的话,static域是在编译的时候加载的,原则是:1.static域是在非static(上面说的都是非static)之前调用的2.static域只初始化一次(即只调用一次),打个比方Aa=newA();A里有static域,只有当你第一次使用new创建对象的时候它会在非static之前调用,而如果你还想再用new创建对象时,static域这段代码是不会被调用的(因为static的东西是属于类,所以对象共享的,一次就够了)4.如果涉及继承跟static结合的话(而这个是初始化里最难的,很多初学者会卡在这里),只要按照3.2结合就行了。
解决方案四:
thinkinjava里初始化和清除那一章讲得很清楚如果你不想翻书,不妨看看我的bloghttp://blog.csdn.net/icesnows/archive/2009/05/24/4211810.aspx里面有这些内容:static成员初始化在non-static初始化之前(后者只在创建该类对象时才进行初始化)。参见例StaticInitialiaztion。所以,初始化的顺序应该是这样的:1.static自动初始化;2.staticspecifyinginitialization;3.non-static自动初始化;4.non-staticspecifyinginitialization;5.构造器初始化创建对象的过程:1.定位class;2.装载class,static初始化(仅此一次);3.在heap中分配对象内存;4.对象内存清0,即完成自动初始化;5.specifyinginitialization,即赋给变量定义时指定的初值;6.执行构造器(如果有继承就更复杂)
解决方案五:
交你一句口诀;父静子静父属子属父构子构
解决方案六:
经过上述几位的指点,终于明白了。本来我一直困惑:为什么Card类中非静态field(Tagt1)能执行,而主class的非静态field(Tagt4)不能执行呢?原来关键是:非静态成员只有在创建该类对象的时候才会进行初始化。
解决方案七:
OrderOfInitialization没有创建实例,Tagt4=newTag(4);是成员变量,只有创建OrderOfInitialization实例时才创建.
解决方案八:
帮顶
解决方案九:
lz弄明白了就结贴吧
解决方案十:
2楼总结的很好

时间: 2024-10-28 06:14:31

初始化顺序疑惑,求解答的相关文章

代码分析-一道Java笔试题,求解答(关于类的加载与初始化)

问题描述 一道Java笔试题,求解答(关于类的加载与初始化) 自己查了一些资料,还是看不懂这个程序的输出结果,求各位详细解释初始化和执行过程,谢! public class Alibaba { public static int k = 0; public static Alibaba t1 = new Alibaba("t1"); public static Alibaba t2 = new Alibaba("t2"); public static int i =

华为通知面试,疑惑,求解答

问题描述 华为通知面试,疑惑,求解答 老公接到华为电话(是手机号,不是公司座机),说要来我这个城市,然后和我老公谈谈(因为我这个城市没有华为),而且还选择周五晚上和周末..,好像是说周五晚上是一个部门面试,周末又是其他部门面试.感觉挺纳闷的,原因: 1>我老公没有投华为的简历,但是有更新简历 2>用手机号和我老公联系..请问大家,这个是不是骗人的呢... 解决方案 不用说了!! 一定是骗子!第一:华为是大型公司!怎么有这种事情呢!!何况你又不是高级人才!你没有向华为投简历 解决方案二: 这个情

求解答!!!java中输出顺序的问题!

问题描述 求解答!!!java中输出顺序的问题! public String work() { System.out.print("的工作理念是干活挣钱有饭吃"); return ""; } System.out.println(hanbing.getName()+hanbing.work()); 为什么输出的结果是:的工作理念是干活挣钱有饭吃韩冰 解决方案 1.work方法中的print被执行,打印输出"的工作理念是干活挣钱有饭吃" 2.然后h

我真的不会-我是初学,一个关于顺序查找和折半查找的算法有错,求解答

问题描述 我是初学,一个关于顺序查找和折半查找的算法有错,求解答 ```#include #define Max 256 typedef struct Keylist { int key[Max]; int len; }Keylist; void creatKlist(Keylist L) { int i=0; printf("**建立静态表**n"); printf("你需要构建多少个数据,请输入:"); scanf("%d",&L.l

关于初始化的问题,求解答

问题描述 关于初始化的问题,求解答 1:int a=10; 2: int a; a=10; 上面两个都是初始化吗? 初始化是对变量第一次赋值就叫初始化,还是说在定义变量的同时赋值才叫初始化? 求解答 解决方案 两段代码产生的机器码是一样的,它们等价. 在C语言中, int a;就已经分配了空间 a = 1;这个赋了一个值 很多书上说叫做"赋初值",其实对于非常数,编译器不管什么初不初的. int a = 1;就是把这两步在一句话中写完了. 解决方案二: 初始化和变量声明是明显有区别的,

esdk-在调用API去初始化时内存崩溃,求解答

问题描述 在调用API去初始化时内存崩溃,求解答 C#调用API初始化接口IVS_SDK_Init成功,之后调用释放接口IVS_SDK_Cleanup发生内存崩溃 解决方案 使用非托管资源的类型必须实现IDisposable接口的Dispose()方法来精确的释放系统资源..Net环境的这一规则使得释放资源代码的职责是类型的使用者,而不是类型或系统.因此,任何时候你在调用Dispose()方法的类型时,你就有责任来调用Dispose()方法来释放资源.最好的方法来保证Dispose()被调用的结

树-关于信号放大器的c++问题,求解答

问题描述 关于信号放大器的c++问题,求解答 从度娘上down了一个信号放大器的c++,编译可以通过,但是在运行时会出错,调试时发现问题可能出在BiTree()函数上,但是还是弄不明白,希望有人能来指点我,下面附上源代码 环境是vc6.0#include using namespace std; struct Node //定义树的元素{ struct Node *lchild; struct Node *rchild; char data ; int weight; int D; //当前衰减

c语言-我想用定时和外部中断写一个小车避障程序,可是不知道哪里错了,求解答

问题描述 我想用定时和外部中断写一个小车避障程序,可是不知道哪里错了,求解答 5C #include#include#define uint unsigned int#define uchar unsigned charsbit echo=P3^2;sbit trig=P2^3;unsigned char stime; void PWM_zk0(float zk) //高电 平占得比例占空比为(Gao/255){ CCAP0H = CCAP0L =255*(100.0 - zk)/100.0;

文件-c语言 火车票管理系统 求解答

问题描述 c语言 火车票管理系统 求解答 运行后不能添加,删除,修改,查询班次到文件 可是文件是已经建好有数据的,查询时只显示一条然后就非正常退出了,我怀疑是最后链表做的有问题函数read()可是就是找不到哪错了,希望有哪位朋友可以解答一下, #include #include #include #include #include #include typedef struct Tickets { char num; char time[8]; char starts[8]; char ends