- static翻译为“静态的”。
- static修饰的方法称为静态方法
- static修饰的变量称为静态变量【一般指实例变量,因为局部变量不可能声明为静态的】
- static修饰的内部类称为静态内部类
- static修饰的代码块称为静态代码块
- 所有static修饰的元素都成为静态的,都可以使用“类名.”的方式访问,当然也可以使用“引用.”的方式访问。
- static修饰的元素都是类级别的特征(属性),和具体的对象无关。
- 带有static的类成员,既可以采用“类名.”的方式访问也可以采用“引用.”的方式访问。但是即使采用引用的方式访问,实际上执行的时候和引用指向的对象无关。【因为用空引用访问静态变量和静态方法的时候也不会出现空指针异常】。
- 方法中如果想使用this方法就不能定义成static的,如果方法定义成static的方法中就不能使用this。【因为静态方法采用类名调用,在静态方法执行的过程中没有当前对象的概念】。
- “中国人(Chinese)”类中有一个“国籍”成员变量,如果将国籍属性定义为实例变量的缺点就是每一个中国人类对象都有一个完全相同的属性且属性值也相同(country=“中国”),导致内存空间浪费。内存空间图:
- 因为中国人类的所有对象的国籍一样都是“中国”,所以这种特征属于类级别的特征,可以定义为类的特征,在变量前面添加static关键字修饰,此时国籍属性变为静态变量。 静态变量在类加载的时候初始化,不需要创建对象内存就已经开辟了,静态变量存储在方法区内存当中,静态变量只有一份所有类对象共享,访问的时候不需要创建对象,直接使用“类名.变量名”的方式访问,内存空间图:
- 静态变量和静态方法是属于类的。
- 类成员包括:
- 成员方法
- 实例方法:大多数方法都定义为实例方法,一般一个行为或者一个动作在发生的时候,都需要对象的参与。
- 静态方法:方法描述的是动作,当所有的对象执行这个动作的时候,最终产生的影响是一样的,那么这个动作已经不属于某个对象的了,可已将这个动作提升为类级别的动作。【静态方法中无法直接访问实例变量和实例方法】,大多数“工具类”中的方法都是静态方法,因为工具类就是为了方便编程,为了方便调用自然不需要new对象是最好的。
- 成员变量
- 实例变量:所有对象都有这个属性,但是属性值会随着对象的变化而变化【不同对象这个属性具体值不同】。
- 静态变量:所有对象都有这个属性,并且所有对象这个属性值是一样的,建议定义为静态变量,节省内存开销。【类级别的属性】
- 成员方法
- 可以使用static关键字来定义“静态代码块”。
- 语法格式: static { Java语句; }
- 静态代码块在类加载时执行并且只执行一次。类加载完之后第一件事情就是执行静态代码块。【JVM并不是一下把所有所需要的类全部转入JVM中,而是在代码逐行执行过程中碰见代码中需要哪个类的时候动态的吧这个类装载进JVM中】
static {
//类已经加载完了所以可以在静态代码块中实例化对象,在静态代码块中不能直接当问实例变量,需要先创建对象
Test01 t = new Test01();
System.out.println(t.aaa);
}
-
- 静态代码块可以编写多个,并且遵循自上而下的顺序依次执行。【在类体中声明的方法和变量是没有先后顺序的,在类体中定义的东西只有静态代码块和实例代码块有先后顺序】。
- 静态代码块中的代码同方法体中的代码遵循自上而下的顺序逐行执行。
- 静态代码块的作用:
- 例如:在项目中要求在类加载的时刻执行代码完成日志的记录。那么这段完成日志的代码就可以编写到静态代码块当中,完成日志的记录。
- 静态代码块是Java为程序员准备的一个特殊的时刻,这个特殊的时刻被称为类加载时刻,若希望此时执行一段代码这段代码可以直接放到静态代码块当中。
- 在类加载时候需要有一些初始化的操作,可以在静态代码块中完成。
- int a; 这是只声明不赋值,则只会在内存的栈区创建引用,就是说只会在内存中创建一个 a;而这个a并没有指向任何指向,是没有空间的。
- 实例代码块
- 语法结构:在类体中方法体外,直接编写“{Java代码;}”。
- 实例代码块可以编写多个,遵循自上而下的顺序执行。
- 实例代码块在创建对象的时候,构造方法执行之前执行。
- 实例代码块也是Java为程序员准备的一个特殊的时机,这个时机被称为“对象初始化”时机。
- static关键字不能修饰局部变量:假如可以用static修饰局部变量,就表示此变量在所在类被jvm加载的时候就初始化加载了。但是方法和对象相关的,而方法只有在被调用的时候才有意义,你在加载类的时候还没有调用方法,就把方法里的局部变量加载了,这就显的没有必要意义了。所以没必要修饰局部变量。