class A
{
public int i = 20;
private static A aa = new A();

private A()
{

}

public static A getA()
{
return aa;
}
//static 一定是不能省略的
}public class TestStatic_2
{
public static void main(String[] args)
{
A aa1 = A.getA();
A aa2 = A.getA();

aa1.i = 99;
System.out.printf("%d\n", aa2.i);

if(aa1 == aa2)
{
System.out.printf("aa1和aa2相等\n");
}
else
{
System.out.printf("aa1和aa2不相等\n");
}
//A aa1 = new A();
//error如果A类的构造方法是private,则new A()就会报错!
//A aa2 = new A();
}
}不太理解A aa = A.getA()和public static A getA()这两种形式,没这样写过

解决方案 »

  1.   

    简单的说吧,如果一个类,每次使用的时候都要new一个实例,这样被使用太多,就会new很多个实例,浪费资源。所以定一个static的变量,一开始就生成一个实例,使用的人每次都用同一个实例,这样就可以减少资源浪费。
    private static A aa = new A(); //生成一个实例public static A getA()
    {
    return aa; //返回所生成的实例,这样使得每个使用者用的是同一个实例,减少资源浪费
    }
      

  2.   

    你从内存的角度来理解就好了:
    每个类都有静态去,包括静态对象和代码。你new的实例对象是另外一块内存空间。
    你这里private static A aa=new A(),只是说在静态区有个引用,指向一个A对象而已。
    而你的get方法会返回这个引用。
    就这样,没什么深奥的。
      

  3.   

    单例模式/Singleton一般我这么写
    class A {
    private static A a = null;

    private A() {
    // do some work
    }

    public static A getInstance() {
    if (a == null) {
    a = new A();
    }
    return a;
    }
    }
      

  4.   

    首先 aa作为类的成员变量,是在类加载时就加载,在静态区会保持一个全局 全程的存在
    其次 具有静态属性 可以让外界直接访问aa(访问到前必已加载),而不必再去通过它外包类的实例来访问(因为非静态成员变量对象无法脱离外包类实例对象而存在)
      

  5.   

    这么写是非线程安全的,如果多线程同时访问getInstance,当a还是null的时候,有可能a会被new多次