java关键字static完全总结

红太狼 2022-07-03 16:19 269阅读 0赞

1.static修饰属性

  1. static修饰属性表示该属性是静态属性(静态变量),类属性(类变量)。
  2. 静态属性由该类的所有实例所共享,属于类本身,可用类名.属性名直接访问
  3. 静态属性先于类的实例而存在。静态属性在类的初始化过程中就被创建了,且被保存在了全局数据区的静态区。
  4. 静态属性的继承问题:在包可见性允许的情况下,子类可以继承父类的静态属性。

注意:类中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,类加载的过程只进行一次。也就是类变量只会被创建一次。

2.static修饰方法

  1. static修饰的方法称为静态方法。由所有的类实例所共享,属于类本身,可用类名.方法
  2. 静态方法的继承问题:在包可见性允许的情况下,子类可以继承父类的静态方法

注意:关于静态方法和实例方法的误区。
静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。
事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。

3.static修饰代码块{…}

  1. static{}(即static块),会在类被加载的时候执行且仅会被执行一次(因为在虚拟机的生命周期中一个类也只会加载一次)。
  2. static块的执行顺序

    1. 当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行;

      1. public class TestStatic{
      2. static{
      3. System.out.println(1);
      4. }
      5. static{
      6. System.out.println(2);
      7. }
      8. static{
      9. System.out.println(3);
      10. }
      11. public static void main(String args[]){
      12. System.out.println(5);
      13. }
      14. static{
      15. System.out.println(4);
      16. }
      17. }

      结果:程序会输出1,2,3,4,5

    2. 如果静态变量在定义的时候就赋给了初值(如static int x=100),那么赋值操作也是在类加载的时候完成的,并且当一个类中既有static{}又有static变量的时候,同样遵循“先定义先执行”的原则;

      1. class Test
      2. {
      3. public static int X = 300;
      4. static
      5. {
      6. System.out.println(X);
      7. X = 200;
      8. System.out.println(X);
      9. }
      10. }
      11. public class StaticBlockTest
      12. {
      13. public static void main(String args[])
      14. {
      15. System.out.println(Test.X);
      16. }
      17. }

      结果:程序会依次输出300,200,200,先执行完X=300,再执行static{}语句块。

4.static修饰类(静态内部类)

静态内部类没有外部对象的引用,所以它无法获得外部对象的资源,当然好处是,静态内部类无需依赖于外部类,它可以独立于外部对象而存在。创建静态内部类的代码如下:
Outer.Inner inner = new Outer.Inner();
这里就不详细讲内部类的知识了

注:
类加载:虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载。

类加载特性 :

  • 在虚拟机的生命周期中一个类只被加载一次。
  • 类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空间是有限的。
  • 类加载的时机:
  1. 1. 第一次创建对象要加载类。
  2. 2. 调用静态方法时要加载类,访问静态属性时会加载类。
  3. 3. 加载子类时必定会先加载父类。
  4. 4. 创建对象引用不加载类。
  5. 5. 子类调用父类的静态方法时
  6. 1. 当子类没有覆盖父类的静态方法时,只加载父类,不加载子类。
  7. 2. 当子类有覆盖父类的静态方法时,既加载父类,又加载子类。
  8. 6. 访问静态常量,如果编译器可以计算出常量的值,则不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读

    相关 static关键字作用总结

    前言 之前讲到final关键字的作用是每次面试的时候我必问求职者的两个问题之一,另外一个问题就是文本会写到的static。final和static一样,都是一个小问题可以看到

    相关 java关键字static完全总结

    1.static修饰属性 1. static修饰属性表示该属性是静态属性(静态变量),类属性(类变量)。 2. 静态属性由该类的所有实例所共享,属于类本身,可用类名.

    相关 javastatic关键字总结

    JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配,会执行静态的代码块    在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执