public  class Test {
 private  int count;
public Test(){

count++;
System.out.println("产生了"+count+"个对象");


}

public static void main(String arg[]){
new Test();
new Test();

System.out.print(new Test().count);
}
}
 结果为:
        产生了1个对象
        产生了1个对象
        产生了1个对象
        1
        为什么count不变呢?如果给count定义为static,则正确输出!
        菜鸟迷糊中 

解决方案 »

  1.   

    有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:
    · 
    它们仅能调用其他的static 方法。 
    · 
    它们只能访问static数据。 
    · 
    它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。 
    如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:
    // Demonstrate static variables,methods,and blocks. class UseStatic {
    static int a = 3; 
    static int b; 
    static void meth(int x) { 
    System.out.println("x = " + x);
    System.out.println("a = " + a);
    System.out.println("b = " + b);
    }static { 
    System.out.println("Static block initialized.");
    b = a * 4; 
    } public static void main(String args[]) { 
    meth(42);
    }

    一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。注意:在一个static 方法中引用任何实例变量都是非法的。下面是该程序的输出:Static block initialized. 
    x = 42 
    a = 3 
    b = 12 
    在定义它们的类的外面,static 方法和变量能独立于任何对象而被使用。这样,你只要在类的名字后面加点号运算符即可。例如,如果你希望从类外面调用一个static方法,你可以使用下面通用的格式:classname.method( ) 这里,classname 是类的名字,在该类中定义static方法。可以看到,这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的格式来访问——类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。下面是一个例子。在main() 中,static方法callme() 和static 变量b在它们的类之外被访问。class StaticDemo {
    static int a = 42; 
    static int b = 99;
    static void callme() { 
    System.out.println("a = " + a);
    }

    class StaticByName {public static void main(String args[]) { 
    StaticDemo.callme();
    System.out.println("b = " + StaticDemo.b);
    }
    } 下面是该程序的输出:a = 42 
    b = 99
      

  2.   

    网上解说太多, java中static的作用   http://mxdxm.javaeye.com/blog/655812Static的用法     http://www.javaeye.com/topic/95985
      

  3.   

    count不属于类,而是属于各个类的实例所以 你打印 System.out.print(new Test().count);
    只是这个new Test()匿名对象的count属性,当然是1  ,其他的两个匿名对象的count也是属于各自的,也各自都是1。你将count定义为static的,那这个就是属于这个类的,所有的类实例(对象)共享这一个属性, 结果是3
      

  4.   

    static属性 在同一个JVM中 不管new了几次对象,只在第一次new对象的时候执行,只执行一次,
    非static属性,每次new对象,都会执行    
        
      

  5.   

    private int count; //属于类的实例
    private static int count; //属于所有实例
      

  6.   

    private int count;//内存分配在堆栈中private static int count; 内存分配在堆中int count ;可以看成普通的变量static int count; 可以看成是指针 指针就是类
      

  7.   

    没加static之前,每次new一个类的时候count的默认值都是0,所以count++等于1,;static count被共享,new两次,count++两次,就变成2了。
      

  8.   

    非static关键字定义出来的变量属于对象,也就是只要new出一个对像,那么这个变量就是重新一份给了这个对象,故正如你的例子测试出来都是1.
    如果是static关键字定义出来的,则这个变量属于类,也就是不管你定义了多少个对象,这些对象拥有的这个变量都是这么一个变量。更深入的说法是,static和非static定义出来的变量占用的类空间和对象空间是不一样的。
      

  9.   

    count属于成员变量,声明一个对象实例就有一个count,不同的对象彼此的count成员是独立的。
      

  10.   

    每次new 都创建一个新对象
    count++是针对但前的对象private static int count;
    这样属性归类本身的属性, 所有对象都用这一个变量,所以++才会递增.另外每天回帖即可获得10分可用分!
      

  11.   


    //本例演示一个很经典的jvm加载分配
    class Sing{
    private static Sing sing = new Sing();
    public  static int counter1;
    public static int counter2=0;
    private Sing(){
    counter1++;
    counter2++;
    }
    public static Sing getSingInstance(){
    return sing;
    }
    }
    public class MyTest {
    public static void main(String[] args) {
    Sing sing = Sing.getSingInstance();
    System.out.println("counter1="+sing.counter1);
    System.out.println("counter2="+sing.counter2);
    }}
      

  12.   


    //
    class Sing{
    public  static int counter1;
    public static int counter2=0;
    private static Sing sing = new Sing();
    private Sing(){
    counter1++;
    counter2++;
    }
    public static Sing getSingInstance(){
    return sing;
    }
    }
    public class MyTest {
    public static void main(String[] args) {
    Sing sing = Sing.getSingInstance();
    System.out.println("counter1="+sing.counter1);
    System.out.println("counter2="+sing.counter2);
    }}
      

  13.   

    static成员 是用一个存储区域来保存一个特定的数据,也就是说 无论你new多少回,使用的都是同一个count成员,他可以使用类对象或类名两张方式操作
    如:Test.count++; 或Test t =  new Test(); t.count++;
    非static成员 是必须由类对象来操作的,每次new Test()时都生成一个新的存储区域,也就是3个count成员而不是一个.
    如:Test t =  new Test(); t.count++;
      

  14.   

    不带static的是实例变量,
    而带有static的是属于类变量.
    类变量为所有实例所共有.
      

  15.   

    new 产生了不同的对象,而每个对象中都会有count存在,每个count 初始化都是0,故而会出现不增长的情况
      

  16.   

    加static说明是对该对象的引用是地址引用,不加说明是值引用