1 class A{ 2 public int i = 10; 3 public void show(){ 4 System.out.printf("%d",i); 5 } 6 } 7 8 class M{ 9 public static void main(String[] args){ 10 A a1 = new A(); 11 A a2 = new A(); 12 13 a1.i = 20; 14 a2.show();//此时输出10 15 } 16 }
1 /* 2 本程序证明了:A类的多个对象共用一个static属性i 3 */ 4 class A{ 5 public static i = 10; //加上static修饰符 6 public void show(){ 7 System.out.printf("%d",i); 8 } 9 } 10 11 class M{ 12 public static void main(String[] args){ 13 A a1 = new A(); 14 A a2 = new A(); 15 A a3 = new A(); 16 17 a1.i = 20; 18 a2.show();//此时输出20 19 System.out.printf("%d",a3.i);//也输出20 20 } 21 }
结论:
如果给一个属性加上static,那么这个属性不再属于某一个对象了,而是属于N个对象,共用同一个static属性。
static修饰的方法和成员,在类加载的时候,一起加载进虚拟机。优先于对象的创建。static属性在一个单独的内存区,而不是在new出的对象内存中。所以下面的代码范例,可以直接由类名调用,不需要类对象名
1 /* 2 本程序证明了:static属性i是属于类本身的,或者讲:没有对象,我们仍然 3 可以通过类名的方式访问类内部的static属性。static方法同理 4 */ 5 class A{ 6 //给属性和方法加上static修饰符 7 public static i = 10; 8 public static void f(){ 9 System.out.printf("20"); 10 } 11 } 12 13 class M{ 14 public static void main(String[] args){ 15 System.out.printf("%d",A.i);//输出10 16 A.f();//输出20 17 } 18 }
显然,static属性和方法虽然属于类本身,可以通过类名的方式访问,但是也属于类对象,也可以通过类对象名的方式访问,
static只是表明了该成员具有了可以通过类名访问的潜在特征,但是是否可以通过类名访问,还必须满足一个条件:该成员必须是非private的
重点:
非静态方法可以访问静态成员(包括属性和方法)
非静态方法的创建在类对象和static成员的创建之后!
所以静态方法不可以访问非静态成员,因为静态成员可以直接由类名访问,非静态成员必须要有类对象名才能访问。
有静态方法的时候不一定创建了非静态方法,但是有非静态方法的时候一定能创建了静态方法