1.静态变量-问题引出
有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。
传统的方法来解决
使用我们现有的技术来解决这个问题,大家看看如何?
思路:
1.在main方法中定义一个变量 count
2.当一个小孩加入游戏后 count++ ,最后个count 就记录有多少小孩玩游戏

问题分析:
1.count 是一个独立于对象(与child方法没有关联),以后我们访问 count 很麻烦,没有使用到面向对象思想
2.因此,我们引出类变量/静态变量
思考
如果设计一个int count 表示总人数,我们在创建一个小孩时,就把count加1,并且 count 是所有对象共享的就ok了!,我们使用静态变量来解决。

2.静态变量定义:
静态变量也叫类变量,它是用 static 关键字声明的变量。静态变量属于类本身,而不是类的实例对象。这意味着:
- 静态变量在所有类的实例之间共享,同一个类的所有对象都共享一个静态变量。
- 静态变量在内存中只有一份,所有对象访问的是同一个静态变量。
- 静态变量的生命周期与类的生命周期相同,它在类加载时被创建,并且在类卸载时销毁。
也就是说,即使你没有创建对象,只要类加载了,就可以使用类变量了。
3.编程如何定义静态变量
语法:
访问修饰符 static 数据类型 变量名;[推荐]
static 访问修饰符 数据类型 变量名;
4.如何访问静态变量
类名.类变量名(推荐使用) 或者 对象名.类变量名
静态变量的访问修饰符的访问权限和范围 和 普通属性是一样的。
5.静态变量使用细节
(1)什么时候需要用类变量
当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量)。比如:定义学生类,统计所有学生共交多少钱。Student(name,static fee)
(2)类变量与实例变量(普通属性)区别
类变量是该类的所有对象共享的,而实例变量是每个对象独享的。
(3)加上 static 称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量
(4)类变量可以通过 类名.类变量名 或者 对象名.类变量名 来访问,但java设计者推荐我们使用 类名.类变量名方式访问。【前提是 满足访问修饰符的访问权限和范围】
6.静态方法定义:
静态方法是用 static 关键字声明的方法。静态方法属于类本身,而不是类的实例对象。它可以通过类名直接访问,而不需要创建类的对象。静态方法可以访问静态变量和静态方法,但不能直接访问实例变量和实例方法,因为它没有对象的上下文。
7.编程如何定义静态方法

只要加上 static
8.静态方法的调用
使用方式: 类名.类方法名 或者 对象名.类方法名
前提是 满足访问修饰符的访问权限和范围)
9.静态方法经典的使用场景
(1)当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率
(2)在实际开发,往往会将一些通用的方法,设计成静态方法,这样我们不需要创建对象就可以使用了,比如打印一维数组, 冒泡排序,完成某个计算任务 等
比如:工具类中的方法 utils,Math类、Arrays类、Collections 集合类。
10.静态方法使用细节
(1)静态方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区:类方法中无this的参数
普通方法中隐含着this的参数
(2)类方法可以通过类名调用,也可以通过对象名调用。
(3)普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。
(4)静态方法中不允许使用和对象有关的关键字,比如this和super。
普通方法(成员方法)可以。
(5)静态方法中 只能访问 静态变量 或静态方法
(6)普通方法,既可以访问 普通变量(方法),也可以访问静态变量(方法)。
总结:静态方法,只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员