- 在类中,用static声明的成员变量为静态成员变量,他为该类的共有变量,在第一使用时被初始化,对于该类的所有对象来说,static成员变量只有一份
- 用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可以访问非static的成员
静态方法不再是针对于某个对象调用,所以不能访问非静态成员
- 可以通过类名、对象引用两种方式访问静态成员
静态成员变量 也叫 静态属性
- 类加载时 就分配了内存 并分配到了方法区 静态属性与堆栈无关
- 在方法区,只存储一份内存 所有的类对象公用该段内存
- 因为与对象并没有直接关系 可以通过类名.属性名的方式访问 也可以通过对象.属性名 的方式访问,一般推荐用类名访问
- 因为所有对象共用一段数据内存 所以只要修改其中的值,则所有对象中对应的值都被修改
- 使用静态属性 可以节省内存 减少相同值的属性重复
- 静态属性推荐 静态数据 访问 不推荐动态数据访问
类加载:
当一个java程序要启动时,会先读取代码段中的java类代码到内存中,如果该代码段中存在静态属性或方法,则将静态属性和方法读取到内存中 保存数据到内存中方法区(方法区存放静态属性、方法、字符串常量)
静态数据&动态数据
- 静态数据:在编译时就能判断的数据 例如:类
- 动态数据:在运行时才能判断的数据 例如:new出来的对象
静态方法
- 可以访问静态属性和静态方法
- 不可以访问非静态属性和非静态方法和this
- 普通的方法可以访问静态方法
静态代码块
static代码块会在类加载时运行
静态代码段不可以执行非静态方法,可以执行静态方法
只执行一次,大部分用于初始化静态属性
类加载:
- 代码会保存在代码区;
- 当需要执行时,会先加载代码区代码;
- 会在方法区生成方法和静态属性;
- 执行静态代码段,为静态属性赋值
- 只执行一次
静态数据只能访问静态属性&静态方法,绝对不能访问动态属性&动态方法; 动态数据既能访问静态属性&静态方法,也能访问动态属性&动态方法