笔记:关键字static

112 阅读2分钟

static关键字

  1. static:静态

  2. static用来修饰属性、方法、代码块、内部类

  3. 使用static修饰属性:静态变量(类变量)

    • 类的多个对象共享同一个静态变量。如果某一个对象修改了静态变量,其他对象再使用的时候就会使用了修改后的静态变量。就是说下面例子中的 c1.nation 本来是“CHN”,当 c2.nation 修改为"China"后, c1.nation 就会被修改成"China"。

    • 静态变量随着类加载而加载。可以通过“类 . 静态变量”的方式进行调用

      静态变量的加载早于对象的创建。

      类只加载一次,所以静态变量在内存中也只存在一份,随类加载而加载,暂存在方法区的静态域中,随着类销毁而销毁。

    不使用static修饰属性:非静态变量(实例变量)

    • 我们创建类的多个对象,每个对象都有各自的实例变量,当修改一个对象的实例变量,不会影响到其他对象的实例变量。就是说修改下面例子中的 c1.name 这个实例变量,不会影响到 c2.name 这个实例变量。
    public class test {
        @Test
        public void test1() {
            Chinese.nation = "中国";
            System.out.println(Chinese.nation);/* 中国 */
    
            Chinese c1 = new Chinese();
            c1.name = "china";
            c1.age = 18;
            c1.nation = "CHN";
            System.out.println(c1.nation);/* CHN */
    
            Chinese c2 = new Chinese();
            c2.name = "China";
            c2.age = 81;
            c2.nation = "China";
            System.out.println(c1.nation);/* China */
            System.out.println(c2.nation);/* China */
        }
    }
    
    class Chinese {
        String name;
        int age;
        static String nation;
    }
    
  4. 使用static修饰方法:静态方法

    • 静态方法随着类的加载而加载,可与通过“类 . 静态方法”的方式进行调用

    • 静态方法中只能调用静态的方法或属性。从下面例子可以看出:静态方法 speak 调用了静态方法 realTalk,静态方法 realTalk 中调用了静态属性 nation。

    • 非静态方法中既可以调用静态的方或属性,也可以调用非静态的方法或属性。

    • 静态方法中,不能使用 this 关键字、super 关键字

      public class test {
          @Test
          public void test1() {
              Chinese.speak("");/* china */
              Chinese.speak("ChinaNo1");/* ChinaNo1 */
      
              Chinese c1 = new Chinese();
              c1.eat();/* china
                          china */
              c1.speak("c1.speak");/* c1.speak */
          }
      }
      
      class Chinese {
          String name;
          int age;
          static String nation = "china"; // 静态属性
      
          public void eat() {
              System.out.println(nation); // 非静态方法调用静态属性
              speak(nation);  // 非静态方法调用静态方法
          }
      
          public static void speak(String s) {
              if ("".equals(s)) {
                  realTalk();  // 调用其他静态方法
              } else {
                  System.out.println(s);
              }
          }
      
          public static void realTalk() {
              System.out.println(nation); // 调用其他静态属性
          }
      }
      
  5. 个人总结:因为 static 修饰的属性或者方法会伴随着这类的生命周期暂存在方法区中,所以它有着响应速度快的优点,也会霸占内存空间,所以需要谨慎使用。建议在常用并且大量相同的属性上使用static来修饰;而在方法的使用上则是按照哪个方法使用的频率高就给哪个方法使用static来修饰。