通过 static 关键字修饰成员变量
- 通过 static 修饰的成员变量,这个变量不再属于对象自己,而是属于整个 “类”,通过这个类创建的多个对象共享一份被 static 修饰的成员变量数据。
static 关键字修饰成员方法
- 成员方法通过 static 关键字修饰之后变成了 静态方法
- 静态方法不属于对象,而是属于类的。
- 不用 static 修饰的成员方法,一定要先创建对象实例才可以使用。
- 对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名称来调用
总结
- 无论是成员变量还是成员方法,如果被 static 修饰之后,这个变量或者方法都与“对象” 概念无关了,只与“类”这个概念有关,都推荐 直接使用类名称来直接调用。
- 静态变量的调用方式:
类名称.静态变量
- 静态方法的调用方式:
类名称.静态方法()
- 静态变量的调用方式:
- 对于本类当中的静态方法,可以省略类名称直接调用
注意事项
-
静态不能访问非静态:
- 普通的成员方法可以直接访问静态的变量和普通的成员变量
- 但是静态方法只能访问静态的变量不能访问普通的成员变量
- 因为在内存当中,是先有静态的内容,然后才有的非静态内容:“先人不知道后人,但是后人知道先人”
-
静态方法中不能用 this,因为 this 代表当前对象,通过谁调用的方法,谁就是当前对象。恰恰由于静态方法与 “对象” 这个概念无关,只与 类有关,因此也就不存在用于区分本对象成员变量的 this 关键字
static 在内存中的情况
- 在堆中创建的都是通过 new 关键字创建的 “对象”,栈中规定的变量通过 地址值来访问 “堆” 中的对象中的成员属性和方法。
- 在方法区中有单独开辟的 “静态区” 专门用来存放在 类 中定义的各种静态成员和静态方法,在调用的时候也是直接通过 类 来查找方法区中的 “静态区” 实现,与对象无关。
静态代码块的执行特点
- 在一个类中,直接通过 static 创建的代码块,前后什么关键字都没有,像这样的代码块称为 “静态代码块”
- 静态代码块的特点:
- 在第一次使用到本类时,静态代码块被执行唯一的一次。
- 在构建一个类时,静态代码块总是会最优先执行。
- 执行了两次对象创建,最后静态代码块只执行了一次,构造方法使用了两次。
- 而且可以看到,静态代码块被优先执行。