黑马程序员技术交流社区

标题: 关于静态变量和实例变量的问题 [打印本页]

作者: 李飞    时间: 2012-3-17 00:06
标题: 关于静态变量和实例变量的问题
啥也不说直接上代码
Class Person{
     public static int NUM=0;
     public int BB=0;

    Person(){
       Num++;BB++;
   }
}
Class Demo{
   public static void main(String[] args){

Person p1=new Person();
                System.out.println("NUM="+p1.NUM+"...BB="+p1.get());

                Person p2=new Person();
                System.out.println("NUM="+p2.NUM+"...BB="+p2.get());
               
                Person p3=new Person();
                System.out.println("NUM="+p3.NUM+"...BB="+p3.get());
               
  }
}
知道结果吗;
NUM依次是1,2,3
BB依次是1,1,1

当然我们既然变量用的是static修饰,一般都是不能改变其值得,这里只是说明问题
作者: 胡元    时间: 2012-3-17 01:43
你没有问问题呀!
作者: 胡元    时间: 2012-3-17 01:46
你的意思是静态的数据不要去改变,否则别的对象在访问的时候就访问不到原先的数据而是改变后的数据了对吧?
作者: 冯建鹏    时间: 2012-3-17 10:51
楼主的意思好像是static修饰符修饰的常量值是不变的?     final 修饰的变量才是不可改变的, static修饰符是在类加载时就加载了变量,而非静态变量是new出新对象后才加载了非静态成员变量的。Class Person{
      public static int NUM=0;//这句话在类加载的时候就运行了。不管创建多少对象,NUM只初始化一次,然后每次调用构造函数的时候NUM就加1然后赋值给本身。
      public int BB=0;//这句话是当创建出对象才运行了这句话,每次调用对象都会执行这语句话所以每个对象的BB值刚开始都是零,然后经过构造函数再加1,所以每次的值都是1.

    Person(){
        Num++;BB++;
    }
}
Class Demo{
    public static void main(String[] args){

Person p1=new Person();
                 System.out.println("NUM="+p1.NUM+"...BB="+p1.get());

                Person p2=new Person();
                 System.out.println("NUM="+p2.NUM+"...BB="+p2.get());
                 
                Person p3=new Person();
                 System.out.println("NUM="+p3.NUM+"...BB="+p3.get());
                 
  }
}

作者: 李飞    时间: 2012-3-17 11:35
冯建鹏 发表于 2012-3-17 10:51
楼主的意思好像是static修饰符修饰的常量值是不变的?     final 修饰的变量才是不可改变的, static修饰符 ...

我的意思是静态变量是放在静态区中,不会随着新对象的产生而产生一个新的静态变量
作者: 冯建鹏    时间: 2012-3-17 11:42
李飞 发表于 2012-3-17 11:35
我的意思是静态变量是放在静态区中,不会随着新对象的产生而产生一个新的静态变量 ...

嗯,自己组织的语言有可能不太好。。。其实我的意思也就是这个意思




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2