static关键字
为什么需要学习static关键字?
针对某一个变量属于类而不属于某一个具体的对象的时候,我们可以考虑使用static关键字
static概述: 多个对象共享同一份数据
static的特点:
- static修饰变量又称为共享变量,类变量,静态变量
- 静态成员属于某一类的,而不属于某一个具体的对象
3.访问静态成员的方式:
a.通过对象访问 不建议
b.通过类名访问
c.通过读写方法访问
4.静态static关键字可以修饰变量,还能够修饰方法,同时还可以修饰代码块(后面讲)
5.static修饰的方法称为类方法,方法体内部称为静态环境/静态上下文
a.非静态环境可以访问静态变量
b.静态环境下只能够访问静态变量
c.静态环境下不能够出现this,super
6.静态修饰方法的意义? -- 简化代码
a.静态方法用来访问静态成员
b.编写工具类
1.构造方法私有
2.成员方法添加static关键字修饰
例子:
Arrays 工具类 Math 工具类
7.static还可以修饰类,但是必须是内部类(后面讲解)
8.static的内存图
static是共享的,不变的,放在方法区,静态代码块在类加载的时候就会执行,并且只执行一次
代码块
1.局部代码块: 定义在局部位置,限定局部变量的作用域
2.构造代码块: 定义在成员位置,抽取多个构造代码块的重复代码,从而简化代码,在每次构造方法之前执行,并且可以执行多次
3.静态代码块: 定义在成员位置
a.在类加载的时候执行,只能够执行一次
b.目前理解为在类第一次出现的时候加载或者类的成员被访问的时候加载
静态代码块作用:
a.初始化静态成员
b.资源文件的读写,以及配置文件的读写,以及连接资源的载入等等
例子:
数据库连接
读取配置文件
4.同步代码块: 定义在局部位置 (在讲解多线程的时候讲解)
面试题: 静态变量和非静态变量的区别?
构造方法、构造代码块、静态代码块的执行顺序?
静态代码块 > 构造代码块 > 构造方法
静态代码块在类加载的时候执行只执行一次
构造代码块在每次访问构造方法之前执行,可以执行多次
构造方法每次创建对象的时候执行,可以执行多次
public class StaticDemo02 {
public static void main(String[] args) {
CodeBlock2.z = 100;
CodeBlock2 cb = new CodeBlock2();
CodeBlock2 cb2 = new CodeBlock2(1, 2);
}
}
class CodeBlock2 {
int x;
int y;
static int z;
{
// System.out.println("CodeBlock 构造代码块");
print();
}
public CodeBlock2() {
// print();
System.out.println("我是无参构造方法");
}
static {
System.out.println("我是静态代码块");
z = 100;
}
public CodeBlock2(int x, int y) {
// print();
this.x = x;
this.y = y;
System.out.println("我是带参构造方法");
}
public void print() {
System.out.format("(%d,%d)%n", x, y);
}
public void method() {
int num = 10;
// 局部代码块
{
int a = 20;
System.out.println(num);
System.out.println(a);
}
int a = 30;
// 同步代码块
synchronized(new Object()){
}
}
}
我是静态代码块
(0,0)
我是无参构造方法
(0,0)
我是带参构造方法