类中的static与创建对象的关系

看代码

 

  1. class StaticTest1 {
  2.     static int i = 47;
  3. }
  4. class Incrementable1 {
  5.     static void increment() {
  6.         StaticTest1.i++;
  7.     }
  8. }
  9. public class OneStaticTest {
  10.     @SuppressWarnings("static-access")
  11.     public static void main(String[] args) {
  12.         System.out.println("StaticTest1.i= " + StaticTest1.i);
  13.         StaticTest1 st1 = new StaticTest1();
  14.         StaticTest1 st2 = new StaticTest1();
  15.         System.out.println("st1.i= " + st1.i);
  16.         System.out.println("st2.i= " + st2.i);
  17.         Incrementable1.increment();
  18.         System.out.println("After Incrementable.increment() called: ");
  19.         System.out.println("st1.i = " + st1.i);
  20.         System.out.println("st2.i = " + st2.i);
  21.         Incrementable1.increment();
  22.         System.out.println("After Incrementable.increment called: ");
  23.         System.out.println("st1.i = " + st1.i);
  24.         System.out.println("st2.i = " + st2.i);
  25.         st1.i = 3;
  26.         System.out.println("After st1.i = 3, ");
  27.         System.out.println("st1.i = " + st1.i);
  28.         System.out.println("st2.i = " + st2.i);
  29.         System.out.println("Create another StaticTest, st3.");
  30.         /*
  31.          * 一个static字段对每个类来说只有一份存储空间
  32.          * 非static字段则是对每个对象有一个存储空间
  33.          */
  34.         StaticTest1 st3 = new StaticTest1();
  35.         System.out.println("st3.i = " + st3.i);
  36.     }
  37. }

 

输出结果:

  1. StaticTest1.i= 47
  2. st1.i= 47
  3. st2.i= 47
  4. After Incrementable.increment() called: 
  5. st1.i = 48
  6. st2.i = 48
  7. After Incrementable.increment called: 
  8. st1.i = 49
  9. st2.i = 49
  10. After st1.i = 3
  11. st1.i = 3
  12. st2.i = 3
  13. Create another StaticTest, st3.
  14. st3.i = 3

 

由上边可以看出,当用static创建了一个静态域之后,它只和类有关系,即static域只有一个实例,与创建了多少个对象无关。

 

再看下边代码:

  1. class Cup {
  2.     Cup(int marker) {
  3.         print("Cup(" + marker + ")");
  4.     }
  5.     void f(int marker) {
  6.         print("f(" + marker + ")");
  7.     }
  8. }
  9. class Cups {
  10.     static Cup cup1;
  11.     static Cup cup2;
  12.     static {
  13.         cup1 = new Cup(1);
  14.         cup2 = new Cup(2);
  15.     }
  16.     Cups() {
  17.         print("Cups()");
  18.     }
  19. }
  20. public class ExplicitStatic {
  21.     public static void main(String[] args) {
  22.         print("Inside main()");
  23.         Cups.cup1.f(99); // (1)
  24.     }
  25.     //先执行静态构造块,再执行构造函数。而且构造块只执行一次。
  26.     static Cups cups1 = new Cups(); // (2)
  27.     static Cups cups2 = new Cups(); // (2)
  28. }

 

输出:

Cup(1)
Cup(2)
Cups()
Cups()
Inside main()
f(99)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值