类变量(静态变量)和类方法(静态方法)

SOBER大约 4 分钟

类变量(静态变量)和类方法(静态方法)

类变量

类变量—— 提出问题

有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?,编写程序解决。

传统方法解决

  1. 在main方法中定义一个变量 count
  2. 当一个小孩加入游戏后 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("打印星星")
    }
}

说明

  1. 当方法使用了 static 修饰后,该方法就是静态方法
  2. 静态方法就可以访问静态属性/变量

类方法的经典使用场景

当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率 比如:工具类中的方法 utils Math 类、Arrays 类、Collections 集合类(ctrl + b 源码)

小结

在程序员实际开发,往往会将一些通用的方法,设计成静态方法,这样我们不需要创建对象就可以使用 了,比如打印一维数组, 冒泡排序,完成某个计算任务 等..[举例说明...]

开发一个计算器类

class Cal{
    public static double sum(double n1, double n2){
        return n1 + n2;
    }
}

注意事项

  • 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区(类方法中无this的参数,普通方法中隐含着this的参数)
  • 类方法可以通过类名调用,也可以通过对象名调用。
  • 普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。[举例]
  • 总结:静态方法只能访问静态成员,非静态方法可以访问非静态成员和静态成员,静态方法不能使用thissuper 等关键字