美文网首页
关于JAVA中的static变量/方法/代码块

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

作者: Tan_233 | 来源:发表于2019-03-25 10:57 被阅读0次

    静态变量

      在类成员变量中可以分为静态变量(也叫类变量, 有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

    相关文章

      网友评论

          本文标题:关于JAVA中的static变量/方法/代码块

          本文链接:https://www.haomeiwen.com/subject/kmnmvqtx.html