阿里笔试题 关于类的静态加载顺序 求高人解答 阿里java静态类 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看到两道java题,当时就虚了,一道都不会做。。怎么破! 首先我承认,第一遍做的时候我也做错了。后来自己就加了多个断点不断的调试以及设计了多个实验。算是了解了一些吧。同时也算是谢谢楼主了,这算是帮我学习了。首先加载的顺序为:先父类的static成员变量-》子类的static成员变量-》父类的成员变量-》父类构造-》子类成员变量-》子类构造也就是说最先被加载的是所有static申明的成员变量,之所以被申明为静态,特点就是共享,即使实例化多个对象,但是是共用一个static声明的变量的。也就是说,首先所有的static被载入,但是还未执行,下一步开始执行,自上而下,首先执行完第一行之后执行public static StaticTest t1 = new StaticTest("t1"); 实例化这个对象的时候,由于静态的已经被载入,所以就直接执行public int j = print("j"); 这一句,然后执行{ print("构造快"); } { print("静态块"); } 最后执行构造函数,然后实例化t2,最后实例化对象。做几个例子测试出该效果,推出什么原理大家自己理解吧。第一个,public static StaticTest t1 = new StaticTest("t1");改为public StaticTest t1 = new StaticTest("t1"); 结果:加载出错第二个,把public int j = print("j");也改为静态的。如果说的不对,请大家指出。谢谢 看了你的分析,然后自己顺着理了一便,慢慢明白起来了,分析的蛮有道理。 其实{ print("静态块")}前面有个“static” 忘了写了,不然也不能说是静态块,粗心了。还有一个知识点就是关于向前引用的问题,像结果中n开始为什么会0,后面有变为99。这个可以参考一下: http://androidguy.blog.51cto.com/974126/1230298 我觉得这道题目的静态块,是不是应该这样static { print("静态块");}因为,这样考点就基本全了~~~ 类加载顺序: * 1.加载类的静态属性(非静态不管) * 这里加载的是:public static int k = 0; * 然后加载:public static StaticTest t1 = new StaticTest("t1"); * 因为此处进行了类的实例化所以 * 1.1加载类的非静态属性 * 这里是:public int j = print("j"); * 运行完这个方法接着 * 1.2顺序加载类中的非static代码块(static暂时不加载) * 这里是:print("构造快");和print("静态块"); * 运行完接着 * 1.3加载类的构造方法 * 这里是:public StaticTest(String str) * 运行完(一个静态属性的实例就完成了) * 2.继续加载类的静态属性 * 这里加载的是:public static StaticTest t2 = new StaticTest("t2"); * 2.1重复(1.1-1.3) * 3.继续加载类的静态属性 * 这里加载的是:public static int i = print("i"); * 运行完接着 * 4.继续加载类的静态属性 * 这里加载的是:public static int n = 99; * 不管你n原来是多少现在为99 * 接着 * 5.(如果有static代码块,在这里先加载,这个里面没有所以加载主函数)加载主函数 * 这里加载的是:StaticTest t = new StaticTest("init"); * 因为此处进行了类的实例化所以 * 5.1 * 重复1.1-1.3 * 5.2 * 因为public static int print(String str)这个方法返回++n * 所以n从99开始累加 * 运行完OK了 对的,粗心大意了,应该有static的,谢谢指正。 原题是有static关键字的,我粗心忘写了,谢谢指正。 感谢楼主的问题,让自己又巩固了一下知识!安顺序之行代码!当程序执行到创建静态对象t1的时候,创建一个t1对象!创建t1对象时之行public int j,不会之行public static int i,因为静态变量属于类,不属于对象! 估计LZ没仔细看过think in java,上面的例子比这个更复杂 我有个疑问.static被载入时,int值应该为空吧.运行到创建t1的实例时,还没有运行static i的初始化代码吧? 为什么创建t1实例的时候,可以直接做i++? 我有个疑问.static被载入时,int值应该为空吧.运行到创建t1的实例时,还没有运行static i的初始化代码吧? 为什么创建t1实例的时候,可以直接做i++?这和java的向前引用有关,可以看看这篇文章:http://androidguy.blog.51cto.com/974126/1230298 请看http://blog.csdn.net/hyl713/article/details/11925071 很不错,转换后的class更容易理解 这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ... 很不错,转换后的class更容易理解另外还想说一句,静态块先执行 ? 未必 。你看完我写的,就明白了 ... 很不错,转换后的class更容易理解另外还想说一句,静态块先执行 ? 未必 。你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~ 很不错,转换后的class更容易理解另外还想说一句,静态块先执行 ? 未必 。你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~呵呵,如果说第一个,那就 ... 哈哈 ! 很不错,转换后的class更容易理解另外还想说一句,静态块先执行 ? 未必 。你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~呵呵,如果说第一个,那就 ... 哈哈 !其实,这道题目,主要是因为第二个static语句,再次调用了该类的构造函数,使得给大家一些误区了。 这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ... 大哥,日至在哪呢?进不去呢 这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ... 大哥,日至在哪呢?进不去呢由于楼主评分完毕,更悲剧的是,他根本没进我的帖子看,于是,我关掉了访问权限!sorry!加个Q,我告诉你:1078577864 这里面有一个递归初始化的过程,可以参考JLS初始化那块的内容大概意思是说,可能会有多个进程执行初始化,因此初始化过程是同步的。这个题目里面可以看到有一个递归初始化过程。JLS上面说,当一个进程企图初始化时,首先需要acquire一把锁,这道题实行static对象的初始化时,是获得了这把锁的,但是当前进程会发现这个类正在初始化,而且是当前进程发起的,所以只要release LOCK and complete,效果就是,当前进程以为静态块都加载完了,接下来该轮到instance variable initializer,然后是instance initialization block,然后是construct部分,OK,第一个静态对象加载完成。记得CSDN上某位大神说把static去掉就会StackOverflowError,因为如果不是静态的话会一直递归的初始化下去。第二个静态对象执行过程和第一个类似。这时候还是执行到static int i = print("i");了,这时会答应i的语句i已经搞定,现在可以到static block了,剩下的过程都好理解了。。 http://bbs.csdn.net/topics/390705686?page=1#post-39679626623楼。有注释你去看看去 那家软件能把详细设计做好!!! 这个用正则表达怎么写? Hashtable的使用。。 急问 谢谢。 JAVA数据传递问题!! jdbc调用sqlserver存储过程的问题。求救! 请教一个jar打包后运行错误的问题 读写文件的问题(100分。很急!!三天内揭贴) 求助:中文输入问题!! 如何获得java API文档? 谁能告诉我什么TOMCAT有什么用 页面中报错,系统错误 请教下MYSQL的外键的问题。
后来自己就加了多个断点不断的调试以及设计了多个实验。算是了解了一些吧。
同时也算是谢谢楼主了,这算是帮我学习了。
首先加载的顺序为:
先父类的static成员变量-》子类的static成员变量-》父类的成员变量-》父类构造-》子类成员变量-》子类构造
也就是说最先被加载的是所有static申明的成员变量,之所以被申明为静态,特点就是共享,即使实例化多个对象,但是是共用一个static声明的变量的。
也就是说,首先所有的static被载入,但是还未执行,下一步开始执行,自上而下,首先执行完第一行之后执行public static StaticTest t1 = new StaticTest("t1");
实例化这个对象的时候,由于静态的已经被载入,所以就直接执行
public int j = print("j"); 这一句,然后执行
{ print("构造快"); } { print("静态块"); }
最后执行构造函数,
然后实例化t2,
最后实例化对象。做几个例子测试出该效果,推出什么原理大家自己理解吧。
第一个,public static StaticTest t1 = new StaticTest("t1");改为
public StaticTest t1 = new StaticTest("t1");
结果:加载出错
第二个,把public int j = print("j");也改为静态的。如果说的不对,请大家指出。谢谢
看了你的分析,然后自己顺着理了一便,慢慢明白起来了,分析的蛮有道理。
其实{ print("静态块")}前面有个“static” 忘了写了,不然也不能说是静态块,粗心了。
还有一个知识点就是关于向前引用的问题,像结果中n开始为什么会0,后面有变为99。这个可以参考一下:
http://androidguy.blog.51cto.com/974126/1230298
print("静态块");
}因为,这样考点就基本全了~~~
* 1.加载类的静态属性(非静态不管)
* 这里加载的是:public static int k = 0;
* 然后加载:public static StaticTest t1 = new StaticTest("t1");
* 因为此处进行了类的实例化所以
* 1.1加载类的非静态属性
* 这里是:public int j = print("j");
* 运行完这个方法接着
* 1.2顺序加载类中的非static代码块(static暂时不加载)
* 这里是:print("构造快");和print("静态块");
* 运行完接着
* 1.3加载类的构造方法
* 这里是:public StaticTest(String str)
* 运行完(一个静态属性的实例就完成了)
* 2.继续加载类的静态属性
* 这里加载的是:public static StaticTest t2 = new StaticTest("t2");
* 2.1重复(1.1-1.3)
* 3.继续加载类的静态属性
* 这里加载的是:public static int i = print("i");
* 运行完接着
* 4.继续加载类的静态属性
* 这里加载的是:public static int n = 99;
* 不管你n原来是多少现在为99
* 接着
* 5.(如果有static代码块,在这里先加载,这个里面没有所以加载主函数)加载主函数
* 这里加载的是:StaticTest t = new StaticTest("init");
* 因为此处进行了类的实例化所以
* 5.1
* 重复1.1-1.3
* 5.2
* 因为public static int print(String str)这个方法返回++n
* 所以n从99开始累加
* 运行完OK了
我有个疑问.
static被载入时,int值应该为空吧.
运行到创建t1的实例时,还没有运行static i的初始化代码吧?
为什么创建t1实例的时候,可以直接做i++?
我有个疑问.
static被载入时,int值应该为空吧.
运行到创建t1的实例时,还没有运行static i的初始化代码吧?
为什么创建t1实例的时候,可以直接做i++?
这和java的向前引用有关,可以看看这篇文章:
http://androidguy.blog.51cto.com/974126/1230298
这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ...
你看完我写的,就明白了 ...
你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~
你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~呵呵,如果说第一个,那就 ... 哈哈 !
你看完我写的,就明白了 ... 从第一个static开始执行的,对吧~呵呵,如果说第一个,那就 ... 哈哈 !其实,这道题目,主要是因为第二个static语句,再次调用了该类的构造函数,使得给大家一些误区了。
这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ... 大哥,日至在哪呢?进不去呢
这个题确实不好搞,很繁琐,考的也很全面,笔试只能当个炮灰去了。楼主,我直接做了个总结,里面就是你这个问题,我自己的总结,你看看:http://user.qzone.qq.com/1078577864/blog/1380008857#!app=2&via=QZ.HashRefresh&pos=1380008857看完记得评价哦 ... 大哥,日至在哪呢?进不去呢由于楼主评分完毕,更悲剧的是,他根本没进我的帖子看,于是,我关掉了访问权限!sorry!
加个Q,我告诉你:1078577864
大概意思是说,可能会有多个进程执行初始化,因此初始化过程是同步的。
这个题目里面可以看到有一个递归初始化过程。
JLS上面说,当一个进程企图初始化时,首先需要acquire一把锁,这道题实行static对象的初始化时,是获得了这把锁的,但是当前进程会发现这个类正在初始化,而且是当前进程发起的,所以只要release LOCK and complete,效果就是,当前进程以为静态块都加载完了,接下来该轮到instance variable initializer,然后是instance initialization block,然后是construct部分,OK,第一个静态对象加载完成。记得CSDN上某位大神说把static去掉就会StackOverflowError,因为如果不是静态的话会一直递归的初始化下去。
第二个静态对象执行过程和第一个类似。
这时候还是执行到static int i = print("i");了,这时会答应i的语句
i已经搞定,现在可以到static block了,剩下的过程都好理解了。。
23楼。有注释你去看看去