求生成对象的个数
1 class A{
2 private int i;
3 private static int cnt = 0;
4 //此处用static修饰,让cnt属于类,多个对象共用一个属性,减少内存分配
5
6 public A(){ //new对象时,会自动执行无参构造方法
7 cnt++;//对象个数+1
8 }
9
10 //无参构造方法和有参构造方法在new对象时必须执行并且只能执行其中一个
11
12 public A(int i){//new对象并且传值时会调用有参构造方法
13 this.i = i;
14 cnt++;//对象个数+1
15 }
16
17 pUblic static int getCnt(){//用static修饰,属于类,通过类名直接调用
18 return cnt; //返回A对象的个数
19 }
20 }
21
22 public class TestStatic{
23 public static void main(String[] args){
24 System.out.printf("当前A对象个数是:%d个",A.getCnt());//0个
25 A a1 = new A();
26 System.out.printf("当前A对象个数是:%d个",A.getCnt());//1个
27 A a2 = new A();
28 System.out.printf("当前A对象个数是:%d个",A.getCnt());//2个
29 A a3 = new A();
30 System.out.printf("当前A对象个数是:%d个",A.getCnt());//3个
31 }
32 }
限制:只生成一个对象
1 class A{
2 public int i = 20;
3 private static A a = new A();
4 //a既是A类的对象,也是A类的属性!指向a本身
5 //此处的static不能省略,下面的getA方法将会访问a对象(属性)
6 //不然静态方法将不能访问非静态成员
7
8 private A(){ //将构造方法设置为私有,这样就只能在本类里面创建对象
9 }
10
11 public static A getA(){
12 //返回值类型是A,是一个地址类型,对象a的地址
13 //在其他类调用getA()方法,可以得到a对象
14 //注意此方法必须设置为static静态的,其他类可以不创建对象就能访问
15 return a;
16 }
17 }
18
19 public class TestStatic{
20 public static void main(String[] args){
21 A a1 = A.getA();
22 A a2 = A.getA();
23 a1.i = 99;
24 System.out.printf("%d",aa2.i); //输出99,说明a1和a2是同一个对象
25 //因为a1和a2的对象地址都是同一个getA()方法返回的a对象地址
26 }
27 }