关于JAVA中的static变量/方法/代码块

2019-03-25  本文已影响0人  Tan_233

静态变量

  在类成员变量中可以分为静态变量(也叫类变量, 有static修饰)实例变量(没有static修饰).

  对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
  对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

静态方法

  静态方法的调用是不依赖于实例对象的, 而是直接通过类来调用. 但是实例方法或者实例变量的调用, 是依赖于实例对象的, 静态方法或静态变量中并没有实例对象的创建, 所以是不能通过静态来调用非静态的.
  另外, 由于静态方法不依赖于实例对象的调用, 而且this/super这样的关键字指的就是调用方法的对象的引用, 所以在静态方法中是不能使用this/super关键字的.
  static方法和变量是不能被继承的, 子类是不继承父类的static变量和方法的。因为这是属于类本身的。但是子类是可以访问的.而且, 子类和父类中同名的static变量和方法都是相互独立的,并不存在任何的重写的关系。因此, 静态方法也是不能使用abstract关键字修饰的.

静态成员变量和静态代码块的执行顺序:
  两者没有优先级的差别, 根据从上往下的顺序来执行
注意: 如果是下面的情况, 静态代码块中的a是不可以在静态代码块中进行运算(使用)的, 因为a还没有真正的被实际创建出来.

    // 静态代码块
    static {
        a = 2;
    }
    private static int a = 1;

静态代码块&&非静态代码块

  首先, 接口中是不能写静态代码块和非静态代码块的


image.png
静态代码块和非静态代码块的执行顺序
image.png

可以看出:

  1. 在两次创建Zi类对象时, 静态代码块中的内容只执行了一次, 非静态代码块的内容执行了两次.
  2. 静态代码块中的内容总是先于非静态代码块执行, 父类的(非)静态代码块总是先于子类的执行.
静态代码块和非静态代码块以及构造方法的执行先后顺序
image.png

  创建对象时会执行构造方法, 如图所示, 每一次创建对象时, 执行到的当前类的非静态代码块是优先于当前类的构造方法的, 说的就是下面这样的结果.

xxxx not static
xxxx constructor

  静态代码块是在类加载时自动执行的,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块

综上, 类的执行顺序是:
父类静态代码 → 子类静态代码 → 父类非静态代码块 → 父类构造 → 子类非静态代码块 → 子类构造

资料参考:
[1] https://www.cnblogs.com/DreamDrive/archive/2011/11/15/3917139.html
[2] https://www.cnblogs.com/chengpeng15/p/9336761.html

上一篇下一篇

猜你喜欢

热点阅读