static示例

求生成对象的个数

 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 }

 

 

 

 

 

posted @ 2019-09-07 15:05  孙晨c  阅读(289)  评论(0编辑  收藏  举报