import javax.swing.*;
class Demo9 {
static int a;
public Demo9(){
a=1000;
}
public static void printa(){
JOptionPane.showMessageDialog(null,Integer.toString(Demo9.a));
}
public static void main(String[] args) {
System.out.println(Demo9.a);---------------------第一句
Demo9 demo= new Demo9();
System.out.println(demo.a);
Demo9.printa();-----------------------------第二句
}}
结果:0
      1000
      弹出窗口:1000
问题:为什么第一和第二句的结果会不一样。

解决方案 »

  1.   

    System.out.println(Demo9.a);---------------------第一句这是a是静态属性 因为在执行这个方法的时候 没有有实例化类(也就是调用构造函数)所以这时候a的值为默认值0
    Demo9 demo= new Demo9(); //调用构造函数 a等于1000了
    System.out.println(demo.a);
    Demo9.printa();-----------------------------第二句
    已经实例化对象了
    所以a=1000
      

  2.   

    因为静态变量a被这句 Demo9 demo= new Demo9();改成了1000啊 
      

  3.   

    import javax.swing.*;
    class Demo9 {
    static int a;          //静态变量a,没有初始化,系统自动为其赋值为0
    public Demo9(){       //构造函数
    a=1000;
    }
    public static void printa(){
    JOptionPane.showMessageDialog(null,Integer.toString(Demo9.a));
    }
    public static void main(String[] args) {
    System.out.println(Demo9.a);         //因为这里没有创建对象,而是直接引用了静态变量,也就是类名.a,所以此时a=0
    Demo9 demo= new Demo9();             //创建对象,利用构造函数初始化了变量a,此时a=1000了
    System.out.println(demo.a);
    Demo9.printa;
    }}
    我在每个语句后面都加了注释,不知道楼主能否看懂也就是说,第一句打印输出的时候只是直接引用了静态变量a,并没有使用构造函数对其进行初始化,因而a=0;而后面的时候利用了构造函数对a进行了初始化,所以a的值变成了1000,后面再执行打印语句和静态方法时输出a的值就变成了1000
      

  4.   

    哦..知道了...如果把Demo9 demo= new Demo9(); 放到前面的话,那么打印出来的值就都是1000了.对不对啊?
      

  5.   

    第一句的输出没有实例化一个对象,所以没有自动调用构造函数,而那个静态成员变量a是在构造函数里面赋值为1000的,之前a的值被自动以0初始化,所以第一句输出为0,相反第二句实例化了一个对象demo,与此同时调用了那个构造函数Demo9(),所以输出值为1000.
      

  6.   

    对于类变量来说,如果只是想要在有了初始值后就不再进行改动的话可以这样做:import javax.swing.*;class Demo9 {    final static int a=1000;
        public Demo9() {
            super();
            //a = 1000;
        }
        public static void printa() {        JOptionPane.showMessageDialog(null, Integer.toString(Demo9.a));
        }
        public static void main(String[] args) {        System.out.println(Demo9.a);
            // Demo9 demo = new Demo9();
            //System.out.println(demo.a);
            Demo9.printa();
        }
    }