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

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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
      

  2.   

    public TestStaticCon() { this("a在父类带参构造方法中的值:" + a); // 调用另外一个构造方法 
    System.out.println(a); 
    System.out.println("父类无参构造方法在执行a=" + a); 
    } 中变量a 是一个形式参数 所以 输出的时候是0
      

  3.   

    up   up   up
      

  4.   

    那你如何解释这个呢    肯定不是参数问题啊Jedey 00:40:18
    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
      

  5.   

    由于你没加static ,所以会从main先开始执行,去调用无参构造函数,然后调用有参构造函数,在执行第3步时,会去调用{ 
    a = 10; 
    System.out.println("父类的非静态代码块在执行a=" + a); //3
    } 中的代码,但是我也不明白为什么这个时候调用这里面的代码,还有谁解释一下这种没有任何修饰写法用在什么情况下,起什么作用呀??只用过加static的静态初始化块,若是加上static,楼主就能得到想要的10了
      

  6.   

    楼主发的第二段代码,其实还是第一段代码的那个问题,就是调用无参构造,
    然后调用有参构造,当有参构造接到传过来的参数时(String n 已经有值时),
    就去调用了那段非静态初始化的代码,从而改变了a的值,但是String n 的
    值此时却没有变。谁能解释一下,为什么这个时候调用呀???
    老紫竹在不??
      

  7.   

    静态初始化块:使用关键字static定义的代码块。当类装载到系统时执行一次,静态初始化块只能初始化类的静态数据成员。 非静态初始化块:对每个要生成的对象执行一次。可以初始化静态数据成员以及实例数据成员。 一个类可以有多个初始化块,在同种类型情况下,它们将按照在程序中出现的顺序运行,但是有如下规则: 静态初始化块在非静态初始化块之前执行。 静态/非静态初始化块在构造函数之前执行。 当类创建一个对象了的初始顺序: 
    1.  父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行  
    2.  子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行  
    3.  父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行  
    4.  父类构造方法  
    5.  子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行  
    6.  子类构造方法  找了一下,是怪自己基功不扎实,自我检讨了希望楼主看完也明白了
      

  8.   

    首先声明一下:执行顺利为:静态代码块--非静态代码块(如果不执行构造函数,非静态代码块也不会执行)--构造函数
    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
      

  9.   


    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楼的说法:如果不执行构造函数,非静态代码块也不会执行
    估计于非静态代码快和构造函数的执行顺序有关。
    其他其他答案……
      

  10.   

     9楼和12楼解决了此问题!
    9楼看后其它全明白了,12楼让我明白a
    在父类带参构造方法中的值:40  
    父类无参构造方法在执行a=10 
    这两句
    像他那样说,因为在调用无参的构造方法时,先调用了有参的构造方法,而静态变量的 a  在这里做为形参,构造方法执行完后它会自动消失,所以它会找到上次执行的a = 40,然后再执行非静态的代码。<可以参考楼主>
      

  11.   

    我发了帖子   解决了这个问题了
    http://topic.csdn.net/u/20080802/14/dfa668c0-d974-4bf1-9717-998d76c81f52.html?seed=1619150951
    是因为this引用快于非静态块的初始化  所以值没变
      

  12.   


    非静态初始化块中a=10也能改变a的值,只不过先进行了实参与形参的结合,你DEBUG一下就知道了!!!
      

  13.   

    大招J2EE,C++,SAP等人才,有意者请和我联系。 
    MSN:[email protected] 
    e_mail:[email protected]