static 关键字的基本作用: 方便在没有创建对象的情况下来进行调用 方法/变量
被static 修饰的方法或变量不需要依赖对象来进行访问, 只要类被加载了, 就可以通过类名去进行访问
static可以用来修饰 类, 类的成员方法, 类的成员变量, 还可以编写static代码块来优化程序性能
static 修饰的变量, 称为 静态变量
static 修饰的方法, 称为 静态方法
static 修饰的类, 称为静态内部类
static 修饰的代码块, 称为 静态代码块
1. static 成员变量
static变量称为静态变量, 静态变量和非静态变量的区别是: 静态变量被所有的对象所共享, 在内存中只有一个副本, 它仅仅在类初次加载时会被初始化. 而非静态变量是对象所拥有的, 在创建对象的时候被初始化, 存在多个副本, 各个对象拥有的副本互不影响.
static成员变量的初始化顺序按照定义的顺序进行初始化.
2. static 成员方法
static方法称为静态方法, 由于静态方法不依赖于任何对象就可以进行访问, 因此对于静态方法来说, 是没有this的, 因为它不依赖于任何对象 既然没有对象, 那就谈不上this了. 并且由于这个特性, 在静态方法中不能访问类的非静态成员变量和非静态成员方法, 因为 非静态成员方法/变量 都是必须依赖具体的对象才能被调用.但是非静态成员方法是可以访问静态成员方法/变量的
最常见的static方法就是main方法, main方法为什么必须是static的呢? 因为程序在执行main方法的时候没有创建任何对象, 因此只有通过类名来访问
3. static 代码块
static 关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能. static块可以置于类中的任何地方, 类中可以有多个static块. 在类初次被加载的时候, 会按照static块的顺序来执行每个static块, 并且只会执行一次.
为什么static块可以用来优化程序性能, 是因为它的特性: 只会在类加载的时候执行一次.
4. static 内部类
static 内部类可以不依赖外部类实例对象而被实例化, 而内部类需要在外部类实例化后才能被实例化
静态内部类不能访问外部类的普通变量, 只能访问外部类的静态成员变量和静态方法
static 的局限性:
1. 它只能调用 static 变量
2. 它只能调用 static 方法, 不能调用非static方法
3. 不能以任何形式引用 this, super
4. static 变量在定义时必须要进行初始化, 且初始化时间要早于非静态变量