本帖最后由 小石姐姐 于 2017-12-27 18:52 编辑
##static静态关键字
* 关键字用来修饰成员变量和成员方法
* 特点
- 被所有的对象共享
- 可以使用类名来调用
- 静态所修饰的成员加载优先于对象随着类加载
* 内存中的位置不同
- 静态成员:方法区中的字节码区域的静态区中
- 非静态成员:堆内存中
* 初始化时机不同
* 静态成员:类加载时初始化
* 非静态成员:创建对象时加载
* 注意事项
* 静态方法
* 可以调用静态的成员变量和静态的成员方法
* 不可以调用非静态的成员变量和成员方法
* 非静态方法
* 可以调用静态的成员和非静态的成员
* 静态方法中没有this,静态的方法或静态成员随着类加载,优先于所有对象
### static静态优缺点及应用场景
* static的优点
* 对对象的共享数据提供单独空间存储,节省空间
* 可以直接类名调用
* static的缺点
* 引用的局限性,只能调用静态成员
* Math常用方法
* static double PI 圆周率
* static double abs(double a) 绝对值
* static double ceil(double a) 向上取整
* static double floor(double a) 向下取整
* static double round(double a) 四舍五入
* static double max(double a,double b) 取最大值
* static double pow(double a,double b) 计算a的b次幂
* static double random() 随机数大于0并小于1的随机数
## 代码块
* 代码块分类
* 局部代码块
- 存在于方法中,控制变量的生命周期(作用域)
* 构造代码块
- 位置 类中方法外
- 提取构造方法中的共性,每次创建对象都会执行,并且在构造方法执行之前执行
* 静态代码块
* 类中方法外,static修饰
* 随着类的加载而加载,只加载一次,加载类的时候需要做的一些驱动
* 同步代码块
* 先执行静态代码块,因为static在类加载的时候就已经加载后行main方法,(程序的入口),再执行局部代码块,等new对象时执行,构造代码块,因为构造代码块先于构造方法执行最后执行构造方法
* 先执行 静态代码块--> 构造代码块 --->构造方法
### 代码块执行流程示例
```java
/*
* 执行顺序
* BlockTest静态代码块--Coder静态代码块--Coder构造代码块--Coder无参构造
*/
public class BlockTest {
static {
System.out.println("BlockTest静态代码块被执行");
}
{
System.out.println("BlockTest构造代码块被执行");
}
public BlockTest() {
System.out.println("BlockTest无参构造执行");
}
public static void main(String[] args) {
Coder c = new Coder();
}
}
class Coder {
static {
System.out.println("Coder静态代码块被执行");
}
{
System.out.println("Coder构造代码块被执行");
}
public Coder() {
System.out.println("Coder无参构造执行");
}
}
```
|
|