package test;public class TestStaticCon {
public static int a = 0; {
a = 10;
System.out.println("父类的非静态代码块在执行a=" + a);
} public TestStaticCon() { this("a在父类带参构造方法中的值:" + a); // 调用另外一个构造方法
System.out.println(a);
System.out.println("父类无参构造方法在执行a=" + a);
} public TestStaticCon(String n) {
System.out.println(n); } public static void main(String[] args) {
TestStaticCon tsc = new TestStaticCon();
}
}结果:父类的非静态代码块在执行a=10
a在父类带参构造方法中的值:0 (这个地方为什么是0 不是10 ????????????????)
10
父类无参构造方法在执行a=10
public static int a = 0; {
a = 10;
System.out.println("父类的非静态代码块在执行a=" + a);
} public TestStaticCon() { this("a在父类带参构造方法中的值:" + a); // 调用另外一个构造方法
System.out.println(a);
System.out.println("父类无参构造方法在执行a=" + a);
} public TestStaticCon(String n) {
System.out.println(n); } public static void main(String[] args) {
TestStaticCon tsc = new TestStaticCon();
}
}结果:父类的非静态代码块在执行a=10
a在父类带参构造方法中的值:0 (这个地方为什么是0 不是10 ????????????????)
10
父类无参构造方法在执行a=10
楼主【hpjiang006】截止到2008-08-02 00:52:16的历史汇总数据(不包括此帖):
发帖的总数量:5 发帖的总分数:100 每贴平均分数:20
回帖的总数量:6 得分贴总数量:1 回帖的得分率:16%
结贴的总数量:0 结贴的总分数:0
无满意结贴数:0 无满意结贴分:0
未结的帖子数:5 未结的总分数:100
结贴的百分比:0.00 % 结分的百分比:0.00 %
无满意结贴率:---------------------无满意结分率:---------------------
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=hpjiang006
System.out.println(a);
System.out.println("父类无参构造方法在执行a=" + a);
} 中变量a 是一个形式参数 所以 输出的时候是0
package test;public class Sub {
public static int a = 0;
{
a = 10;// 10
System.out.println("父类的非静态代码块在执行a=" + a);
} static {
a = 20;//
System.out.println("父类的静态代码块在执行a=" + a);
} // 带参构造方法
public Sub(String n) {
System.out.println(n);
} // 无参构造方法
public Sub() {
this("a在父类带参构造方法中的值:" + a); // 调用另外一个构造方法
System.out.println("父类无参构造方法在执行a=" + a);
} public void nonStaticMethod() {
a = 30;
System.out.println("父类的非静态方法在执行a=" + a);
} public static void staticMethod() {
a = 40;
System.out.println("父类的静态方法在执行a=" + a);
} public static void main(String[] args) {
// TODO Auto-generated method stub
Sub.staticMethod();
Sub.staticMethod();
System.out.println("声明对象前TestInitial.a:" + Sub.a);// 40
System.out.println("声明对象前TestInitial.a:" + Sub.a);// 40
Sub testA = new Sub();
Sub testB = new Sub();
System.out.println("对象testA.a:" + testA.a);// 10
System.out.println("对象testB.a:" + testB.a);// 10
System.out.println("声明对象后TestInitial.a:" + Sub.a);// 20
}
}Jedey 00:40:47
结果:
父类的静态代码块在执行a=20
父类的静态方法在执行a=40
父类的静态方法在执行a=40
声明对象前TestInitial.a:40
声明对象前TestInitial.a:40
父类的非静态代码块在执行a=10
a在父类带参构造方法中的值:40
父类无参构造方法在执行a=10
父类的非静态代码块在执行a=10
a在父类带参构造方法中的值:10
父类无参构造方法在执行a=10
对象testA.a:10
对象testB.a:10
声明对象后TestInitial.a:10
a = 10;
System.out.println("父类的非静态代码块在执行a=" + a); //3
} 中的代码,但是我也不明白为什么这个时候调用这里面的代码,还有谁解释一下这种没有任何修饰写法用在什么情况下,起什么作用呀??只用过加static的静态初始化块,若是加上static,楼主就能得到想要的10了
然后调用有参构造,当有参构造接到传过来的参数时(String n 已经有值时),
就去调用了那段非静态初始化的代码,从而改变了a的值,但是String n 的
值此时却没有变。谁能解释一下,为什么这个时候调用呀???
老紫竹在不??
1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4. 父类构造方法
5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6. 子类构造方法 找了一下,是怪自己基功不扎实,自我检讨了希望楼主看完也明白了
class TestStaticCon {
public static int a = 5; {
a=10;
System.out.println("父类的非静态代码块在执行a=" + a);
}public TestStaticCon() {
this(a); // 调用另外一个构造方法
System.out.println(a);
System.out.println("父类无参构造方法在执行a=" + a);
} public TestStaticCon(int n) {
System.out.println("a在父类带参构造方法中的值:" +n); }
public static void main(String[] args) {
TestStaticCon tsc = new TestStaticCon(TestStaticCon.a);
//先参数实例化.再执行非静态代码..再执行构造函数中的代码
}
}
结果为:
父类的非静态代码块在执行a=10
a在父类带参构造方法中的值:5
public class TestStaticCon {
public static int a = 0;
static {
a = 10; //能改变a的值
System.out.println("父类的非静态代码块在执行a=" + a);
} {
a = 10; //不能改变a的值
System.out.println("父类的非静态代码块在执行a=" + a);
}
public TestStaticCon() { this("a在父类带参构造方法中的值:" + a); // 调用另外一个构造方法
System.out.println(a);
System.out.println("父类无参构造方法在执行a=" + a);
} public TestStaticCon(String n) {
System.out.println(n); } public static void main(String[] args) {
TestStaticCon tsc = new TestStaticCon();
}
}
刚跑了下,发现只有静态的代码快才能改变a的值……据12楼的说法:如果不执行构造函数,非静态代码块也不会执行
估计于非静态代码快和构造函数的执行顺序有关。
其他其他答案……
9楼看后其它全明白了,12楼让我明白a
在父类带参构造方法中的值:40
父类无参构造方法在执行a=10
这两句
像他那样说,因为在调用无参的构造方法时,先调用了有参的构造方法,而静态变量的 a 在这里做为形参,构造方法执行完后它会自动消失,所以它会找到上次执行的a = 40,然后再执行非静态的代码。<可以参考楼主>
http://topic.csdn.net/u/20080802/14/dfa668c0-d974-4bf1-9717-998d76c81f52.html?seed=1619150951
是因为this引用快于非静态块的初始化 所以值没变
非静态初始化块中a=10也能改变a的值,只不过先进行了实参与形参的结合,你DEBUG一下就知道了!!!
MSN:[email protected]
e_mail:[email protected]