JAVA中关于static的用法

在第二张图中加上static结果是27,不加static结果是21,为什么呢?

img

static 修饰 表示这个变量是 类变量,所有的对象实例共有的变量, 如果有对象实例修改这个变量,它们修改的都是同一个。
不加static 修饰,那这个变量就是普通成员变量,每个对象实例都有一个。不同对象修改的是自己的那个变量

因为第二张图的第5行 有static只运行一次=0,即只初始化一次。 不加static则两次都会运行。
不加static时,b1里面sum=0,结果是sum+1+2+3=6,b2里面也是sum=0结果是sum+1+2+...+5=15,所以和是6+15=21
加static时,b1里面sum=0,结果是sum+1+2+3=6,b2里面也是sum=6结果是sum+1+2+...+5=6+15=21,所以和是6+21=27

静态变量只在类加载的时候加载,有且只加载一次,和之后的初始化没得关系,所以在累加

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7452885
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:Java中用static修饰的类的方法有什么作用?
  • 除此之外, 这篇博客: 关于Java中的final,static中的 static 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 修饰:属性、一般方法、游离块、内部类
    • 面试题:能不能修饰外部类和局部变量?(不能)
    • 修饰属性:静态属性/类变量
    • 修饰方法:静态方法
    • static修饰的成员变量不属于对象的数据结构
    • static成员变量和类的信息放在一起,仅保留一份,用于共享,而不是在堆中保留在每个对象里的多个副本
    • 被static修饰的属性和方法可以用类名字直接调用,可以不创建对象。不过,对象也可以直接调用
    • 静态方法里不能使用非静态属性。(eg:main函数不能直接使用本类中的非静态的成员变量)
    • static游离块在类加载的就被执行,且只执行一次
    • 同时被final,static修饰的是常量,必须声明的同时初始化,不可被改变(在编译时就被指定具体值)
    • static参与的程序执行次序
    • 面试题
      class Test {
          // Test example = new Test();
          static Test example = new Test();
      
          public Test() {
              System.out.println("lalala");
          }
      
          public static void main(String[] args) {
              Test test = new Test();
          }
      }
      // 不加static修饰,程序就存在递归
      
  • 您还可以看一下 孙玖祥老师的Java面试:核心考点突击大串讲课程中的 static使用场景-执行顺序-单例理论小节, 巩固相关知识点