• Java类变量和类方法(static)


    类变量-提出问题

    提出问题的主要目的就是让大家思考解决之道,从而引出我要讲的知识点.
    说:有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩? 编写程序解决。

    使用我们现有的技术来解决这个问题,大家看看如何?
    思路
    1.在main方法中定义一个变量count
    2.每当一个小孩加入游戏后count++, 最后个count就记录有多少小孩玩游戏

    问题分析:

    1.count是一个独立于对象/类变量,很尴尬
    2.以后我们访问count很麻烦,没有使用到OOP
    3.因此,我们引出类变量/静态变量

    思考:如果,设计一个int count表示总人数,我们在创建一个小孩时,就把count加1,并且count是所有对象共享的就ok了!,我们使用类变量来解决.

    image-20221114215613391

    类变量内存布局

    放在类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。这个从前面的图也可看出来。

    如何定义类变量
    • 访问修饰符 static 数据类型 变量名; [推荐]
    • static 访问修饰符 数据类型 变量名;
    如何访问类变量
    • 类名.类变量名 [推荐]
    • 对象名.类变量名
    类变量使用细节

    1.什么时候需要用类变量
    当我们需要让某个类的所有对象都共享一个变量时, 就可以考虑使用类变量(静态变量):比如:定义学生类,统计所有学生共交多少钱。

    2.类变量与实例变量(普通属性)区别
    类变量是该类的所有对象共享的,而实例变量是每个对象独享的。

    3.加上static称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量

    4.类变量可以通过类名.类变量名或者对象名.类变量名来访问,但java设计者推荐我们使用类名.类变量名方式访问。[前提是 满足访问修饰符的访问权限和范围]

    5.实例变量不能通过类名.类变量名方式访问。

    6.类变量是在类加载时就初始化了,也就是说,即使你没有创建对象,只要类加载了, 就可以使用类变量了。

    7.类变量的生命周期是随类的加载开始,随着类消亡而销毁。

    类方法介绍

    类方法也叫静态方法。
    形式如下:

    访问修饰符 static 数据返回类型 方法名(){} [推荐]
    static 访问修饰符 数据返回类型 方法名(){}
    
    • 1
    • 2

    1)类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区:
    类方法中无this的参数
    普通方法中隐含着this的参数

    2)类方法可以通过类名调用,也可以通过对象名调用。[举例]

    3)普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。[举例]

    4)类方法中不允许使用和对象有关的关键字,比如this和super。 普通方法(成员方法)可以。

    5)类方法(静态方法)中只能访问静态变量或静态方法。[如何理解]

    6)普通成员方法,既可以访问普通变量(方法),也可以访问静态变量(方法)。

    class Person {
        private int id;
        private static int total = 0;
    
        public static void setTotalPerson(int total) {
            // this.total = total;//错误,因为在static方法中,不可以使用this关键字
            Person.total = total;
        }
    
        public Person() { // 构造器
            total++;
            id = total;
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Person.setTotalPerson(3);
            new Person(); // 最后total的值就是4
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    (1)静态方法,只能访问静态成员
    (2)非静态方法,可以访问所有的成员
    (3)在编写代码时,仍然要遵守访问权限规则

  • 相关阅读:
    python实现.jpeg转.jpg
    Redis 中的通用命令(命令的返回值、复杂度、注意事项及操作演示)
    OpenJudge NOI题库 入门 116题 (三)
    thinkphp5.0.24反序列化漏洞分析
    MySQL8高级
    【无标题】
    自己怎么制作小程序?
    JavaScript 框架之战结束:React 是最终赢家?
    dble安装zk及配置mysql主从模式,在已有mysql存在数据升级mysql配置
    线性同余方程( 数学知识 + 同余 + 扩展欧几里得算法 )
  • 原文地址:https://blog.csdn.net/Drifter_Galaxy/article/details/127919296