类变量(静态变量)和类方法(静态方法)
大约 4 分钟
类变量(静态变量)和类方法(静态方法)
类变量
类变量—— 提出问题
有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。
传统方法解决
- 在main方法中定义一个变量 count
- 当一个小孩加入游戏后 count++,最后个count 就记录有多少小孩玩游戏
static 存放问题(由于jdk版本不同,存放位置不同)
不管static 变量在哪里,共识
- (1) static 变量是同一个类所有对象共享
- (2)static类变量,在类加载的时候就生成了
什么是类变量
类变量也叫静态变量 / 静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。
如何定义类变量
- 访问修饰符 static 数据类型 变量名;[推荐]
- static 访问修饰符 数据类型 变量名;
class A { public static String name = "AAAA"; static public int totalNumber = 100; }
如何访问类变量
- 类名.类变量名[推荐]
- 对象名.类变量名[静态变量的访问修饰符的访问权限和范围 和 普通属性是一样的]
public class ClassVariable { public static void main(String[] args) { /** 说明:类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问 */ System.out.println(Child.count); Child child = new Child(); /** 通过对象名.类变量名 */ System.out.println(child.count); } } class Child { private String name; /** * 定义一个变量 count ,是一个类变量(静态变量) static 静态 * 该变量最大的特点就是会被Chid 类的所有的对象实例共享 * */ public static int count = 0; public String getName() { return name; } public void setName(String name) { this.name = name; } public void join() { System.out.println(name + " 加入了游戏"); } }
类变量使用注意事项和细节讨论
1.使用场景
当我们需要让某个类的所有对象都共享一个变量时,比如: 定义学生类,统计所有学生共交多少钱。Student (name,fee)
2.类变量与实例变量 (普通属性) 区别
类变量是该类的所有对象共享的,而实例变量是每个对象独享的。
3.实例变量不能通过 类名.美变量名 方式访问
4.类变量加载
类变量是在类加载时就初始化了,也就是说,即使你没有创建对象,只要类加载了 就可以使用类变量了。[案例演示]
5.类变量的生命周期是随类的加载开始,随着类消亡而销毁
类方法
基本介绍
类方法也叫静态方法
语法:
访问修饰符 static 数据返回类型 方法名(){ } 【推荐】
static 访问修饰符 数据返回类型 方法名(){ }
类方法的调用
类名.类方法名 或者 对象名.类方法名【前提是 满足访问修饰符的访问权限和范围】
class B{
public static void printStart(){
System.out.println("打印星星")
}
}
说明
- 当方法使用了 static 修饰后,该方法就是静态方法
- 静态方法就可以访问静态属性/变量
类方法的经典使用场景
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率 比如:工具类中的方法 utils Math 类、Arrays 类、Collections 集合类(ctrl + b 源码)
小结
在程序员实际开发,往往会将一些通用的方法,设计成静态方法,这样我们不需要创建对象就可以使用 了,比如打印一维数组, 冒泡排序,完成某个计算任务 等..[举例说明...]
开发一个计算器类
class Cal{
public static double sum(double n1, double n2){
return n1 + n2;
}
}
注意事项
- 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区(类方法中无this的参数,普通方法中隐含着this的参数)
- 类方法可以通过类名调用,也可以通过对象名调用。
- 普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。[举例]
- 总结:静态方法只能访问静态成员,非静态方法可以访问非静态成员和静态成员,静态方法不能使用this, super 等关键字