概述
stiatic是静态修饰符,一般用来修饰方法,变量和代码块
被staitic修饰的,属于类不在属于某个对象,可以被该类的所有对象共享
// 类加载的时候会自动执行, 而且只会执行一次。
static {
System.out, println("静态代码快");
}
变量的分类
- 静态变量或者类变量:被static修饰的变量
- 被static修饰的方法
- 内存中只有一份,只会分配一次内存
- 在类的加载的时候完成静态变量初始化
- 静态方法可以直接通过类名被调用(推荐)
- 静态方法可以通过类的对象调用(不推荐)
- 成员变量或者实例变量:没有被static修饰的变量
- 没有被static修饰的方法
- 每创建一个对象,就会为该对象的成员变量分配内存空间
- 每创建对象都有自己的成员变量,互补干扰
- 只能通过对象名访问
静态方法和成员方法的区别
静态方法
- 可以通过对象名访问(不推荐)
- 可以通过类名方法(强烈推荐)
成员方法
- 只能通过对象名访问
注意事项
-
静态方法不能使用super和this关键字
public void showInfoot() { System.out.println("学校名:" + school + ", 姓名:" + this.name + ", 年龄:" + age); eat(); } public static void showInfo(Student stu) { System.out.println("学校名:" + school + ", 姓名:" + stu.name + ", 年齡:" + stu.age); this.eat(); // 报错 } public void eat() { System.out.printLn("Z"); }
-
静态方法不可以访问非静态成员
public void showInfoot() { System.out.println("学校名:" + school + ", 姓名:" + this.name + ", 年龄:" + age); } public static void showInfo(Student stu) { // 报错 System.out.println("学校名:" + school + ", 姓名:" + stu.name + ", 年齡:" + stu.age); }
-
非静态成员可以直接访问静态成员和非静态成员
使用场景
-
什么时候可以将成员变量使用static修饰?
当该成员变量的值在所有对象中都是相同的,则就应该将该成员变量定义为静态变量
-
什么时候可以将成员方法使用static修饰?
如果该成员变量方法中使用到任何非成员,则可以将该方法定义为静态方法定义工具类,工具类中的方法一般都是静态方!