参考价值:已完结、可参考、等待重置


目录:

  1. 为什么引入了static关键字?
  2. 怎么使用static关键字?
  3. static的原理是什么?
  4. 什么时候使用static?

为什么引入static关键字?

我们都知道,每new一个对象都会把其属性和方法在内存里加载一遍。但是如果某个属性所有的对象都一样,那么每new一个对象都把这个属性加载依次就会产生不小的内存浪费。比如:

1
2
3
4
5
6
class staff{
//属性:
String name;
int age;
String nation;
}

如果我们声明了一个staff类来表示公司的员工,公司200个员工,都是中国人难道我们要在内存里加载200个nation=CHN吗?显然不可能。

为了解决这个问题,static关键字应运而生。

怎么使用static关键字?

  • static的作用:

    static能把修饰的类的成员变成所有对象共用的,只需要在内存中加载一次。

  • static的修饰范围:

    属性、方法、代码块、内部类

  • static修饰属性:

    1
    2
    3
    4
    5
    6
    class staff{
    //属性:
    String name;
    int age;
    static String nation;
    }

    被static修饰的属性可以被类和所有的对象调用。

  • static修饰方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class staff{
    //属性:
    String name;
    int age;
    static String nation;
    //方法:
    static void talk(){
    System.out.println("我说汉语");
    }
    }

    被static修饰的方法可以被类和所有的对象调用。

    static修饰的方法只能调用被static修饰的方法、属性或者其它类成员。

    static修饰的方法不能使用this关键字和supper关键字

static的原理是什么?

我们知道类声明的时候并加载到里面但是会被加载到方法区里面。当类没有用的时候就会被垃圾回收。而建立对象时,对象会被加载到里面,当里没有指向对象的时候,对象就会被回收。

而被static修饰的类的成员就会和类一起加载在方法区,知道类被垃圾回收,static修饰的成员才会跟着被回收。这也是为什么static修饰的方法不能调用未被static修饰的成员,因为被static修饰的方法被加载的时候,对象还没有创建,内存中根本就没有未被static修饰的成员,调用也就无从谈起。

什么时候使用static?

static的作用就是节省内存空间,因此在程序复杂度不提高的情况下尽量都用static修饰,因此就衍生了以下原则:

  1. 所有对象都相同的属性用static修饰
  2. 未直接或间接调用未被static修饰的成员的方法用static修饰
  3. Utility工具类里的所有方法用static修饰