概述
static关键字,可以修饰成员变量,和成员方法。被修饰的成员是【属于类】的,不单单是属于某个对象的,也就是,既然是属于类的,那就不需要创建对象来调用类中的成员信息。
定义和使用格式
类变量
- 当成员变量被static修饰,该变量就称为【类变量】。该类的每一个对象都【共享】同一个类变量的值。任何对象都可以更改类变量的值。类变量可以不通过创建对象的方式进行操作,通过类也可以操作。
- 定义格式
static 数据类型 变量名; 如;static int number; //调用格式: //类名.变量名=值;
静态方法
-
当成员方法一旦被static关键字修饰时,该方法称为【类方法】。类方法一般是通过类名直接调用,而不是单独创建对象来调用,调用方式很简单。习惯称为【静态方法】。
-
定义格式:
修饰符 static 返回值类型 方法名(参数列表){ //代码块 } //调用格式 //类名.方法名
-
静态方法的注意事项:
-
静态方法可以直接访问类变量和静态方法
-
静态方法【不能直接访问】成员变量和成员方法。反之,成员方法可以【直接访问】类变量和静态方法。
-
静态方法中不能使用this关键字
-
-
调用格式
静态方建议通过类来调用,但是也可以通过对象来调用,会出警告信息,不建议使用对象来调用
//访问类变量 类名.变量名; //访问静态方法 类名.静态方法(参数); //备注;这些不能直接访问的成员信息,可以间接的通过实例化对象来调用。
-
static修饰的内容
- 随着类的加载而加载,而且只会加载一次。
- 存储于一块固定的内存区域,在静态域(静态区),可以被类直接调用。
- 它优先于对象存在,所以可以被类的所有对象所共享。
静态代码块
静态代码块:定义在成员位置,被static修饰的代码快{}
- 位置 :类中方法外
- 执行:随着类的加载而加载,而且只会执行一次,优先于main方法和构造方法加载
public class ClassStatic{
static{
//执行语句 多条语句
}
public static void main(String[] args){
//static{}//错误的写法
}
}
//static可以修饰成员变量,成员方法,代码快。在使用过程中,如果你不行在创建对象的情况下
//,去调用成员变量,成员方法,可以定义静态的。对于静态代码快来说,通常是对类中的成员信息初始化。
练习
- 查看一下运行结果为什么
class Father {
static {
System.out.println("父类静态代码块");
}
{
System.out.println("父类非静态代码块");
}
public Father() {
System.out.println("父类构造函数");
}
}
class Son extends Father {
static {
System.out.println("子类静态代码块");
}
{
System.out.println("子类非静态代码块");
}
public Son() {
System.out.println("子类构造函数");
}
public static void main(String[] args) {
Son son = new Son();
}
}
父类静态代码块
子类静态代码块
父类非静态代码块
父类构造函数
子类非静态代码块
子类构造函数
- 补充一下完整版的,执行顺序从左到右:
父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数。