static 关键字


概述

关于 static 关键字的使用, 它可以用来修饰的成员变量和成员方法. 被修饰的成员是属于类的, 而不是单单属于某个对象的. 也就是说, 既然属于类, 就可以不靠创建对象来调用了.

定义和使用格式

类变量

当 static 修饰成员变量时, 该变量称为类变量. 该类的每个对象都共享一个类变量的值. 任何对象都可以更改该变量的值. 但也可以在不创建该类的对象的情况下对类变量进行操作.

类变量: 使用 static 关键字修饰的成员变量.

定义格式:

static 数据类型 变量名;

举例:

static int numberID;

比如说, 基础班新班开班, 学员报到. 现在想为每一位新来报到的同学编学号 ( sid ), 从第一名同学开始, sid 为 1, 以此类推. 学号必须是唯一的, 连续的, 并且与班级的人数相符, 这样便知道要分配给下一名新同学的学号是多少. 这样我们就需要一个变量, 与单独的每一个学生对象无关, 而是与整个班级同学数量有关.

所以, 我们可以这样定义一个静态变量 numberOfStudent, 代码如下:

public class StudentPlus {
private String name;
private int age;
// 学生的id
private int sid;
// 类变量, 记住学生数量, 分配学号
public static int numberOfStudent = 0;
public StudentPlus(String name, int age){
this.name = name;
this.age = age;
// 通过 numberOfStudent 给学生分配学号
this.sid = ++numberOfStudent;
}
// 打印属性值
public void show(){
System.out.println("Student: name=" + name + ", age=" + age + ", sid=" + sid);
}
}
class Demo{
public static void main(String[] args) {
StudentPlus s1 = new StudentPlus("张三", 23);
StudentPlus s2 = new StudentPlus("李四", 24);
StudentPlus s3 = new StudentPlus("王五", 25);
StudentPlus s4 = new StudentPlus("赵六", 26);
s1.show(); // Student : name=张三, age=23, sid=1
s2.show(); // Student : name=李四, age=24, sid=2
s3.show(); // Student : name=王五, age=25, sid=3
s4.show(); // Student : name=赵六, age=26, sid=4
}
}

静态方法

当 static 修饰成员方法时, 该方法称为类方法. 静态方法在声明中有 static, 建议使用类名来调用, 而不需要创建类的对象. 调用方式非常简单.

类方法: 使用 static 关键字修饰的成员方法, 习惯称为静态方法.

定义格式:

修饰符 static 返回值类型 方法名 (参数列表){
// 执行语句
}

举例: 在 Student 类中定义静态方法

public static void showNum() {
System.out.println("num:" + numberOfStudent);
}

注意事项


  1. 静态方法可以直接访问类变量和静态方法
  2. 静态方法不能直接访问普通成员变量或者方法. 反之, 成员方法可以直接访问类变量或静态方法
  3. 静态方法中, 不能使用 this 关键字

注: 静态方法只能访问静态成员

调用格式

被 static 修饰的成员可以并建议通过类名直接访问. 虽然也可以通过对象名访问静态成员, 原因即多个对象均属于一个类, 共享使用同一个静态成员. 但是不建议, 会出现警告信息.

格式:

// 访问类变量
类名.类变量名;
// 调用静态方法
类名.静态方法名(参数);

调用演示, 代码如下:

public class Test71 {
public static void main(String[] args) {
// 访问类变量
System.out.println(StudentPlus.numberOfStudent);
// 调用静态方法
StudentPlus.showNum();
}
}

静态原理图解

static 修饰的内容:


  • 是随着类的加载而加载的, 且只加载一次
  • 存储于一块固定的内存区域 (静态区), 所以, 可以直接被类名调用
  • 它优先于对象存在, 所以, 可以被所有对象共享

静态代码块

静态代码块: 定义在成员位置, 使用 static 修饰的代码块 {}.


  • 位置: 类中方法外
  • 执行: 随着类的加载而执行且执行异常, 优先于 main 方法的执行

格式:

public class ClassName{
static {
// 执行语句
}
}

作用: 给类变量进行初始化赋值. 代码如下:

import java.util.ArrayList;
public class Game {
private static int number;
private static ArrayList<String> list;
static {
// 给类变量赋值
number = 2;
list = new ArrayList<String>();
// 添加元素到集合中
list.add("张三");
list.add("李四");
}
}

注: static 关键字, 可以修饰变量, 方法和代码块. 在使用过程中, 其主要目的还是想在不创建对象的情况下, 去调用方法.